using MediaDevices; using Mtp2Dav.MtpStore; using Shell32; using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; using Mtp2Dav.MtpStore._1d2086a502937936ebc6bfe19cfa15d855be1c31; using Mtp2Dav.WebDAVSharp.Server._1d2086a502937936ebc6bfe19cfa15d855be1c31; namespace Mtp2Dav { using Utilities; using WebDAVSharp.Server; public partial class MainForm : Form { private MediaDevice _connectedDevice; private WebDavServer _runingDavServer; //private NetworkDrive _mappedDrive; private string _mappedDriveLetter; private static IPEndPoint GetEndPoint() { var bufRndIp = new byte[] { 127, 0, 0, 1 }; var sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sck.Bind(new IPEndPoint(new IPAddress(bufRndIp), 0)); sck.Listen(0); var end = (IPEndPoint)sck.LocalEndPoint; sck.Close(); return end; } private void RefreshDevices() { lvDevices.SelectedIndices.Clear(); foreach (ListViewItem item in lvDevices.Items) { ((MediaDevice)item.Tag).Dispose(); } lvDevices.Items.Clear(); var devs = MediaDevice.GetDevices(); foreach (var device in devs) { lvDevices.Items.Add(new ListViewItem { ImageKey = "Default", Text = device.FriendlyName + "(" + device.Description.Trim() + ")", SubItems = { device.Manufacture, device.DeviceId }, ToolTipText = device.DeviceId, Tag = device }); } //Refresh drives cboDrive.DataSource = Enumerable.Range('A', 'Z' - 'A' + 1) .Select(i => (char)i + "") .Except(DriveInfo.GetDrives().Select(s => s.Name.Replace(":\\", ""))) .OrderByDescending(p => p) .ToArray(); } public MainForm() { InitializeComponent(); } private void MainForm_Shown(object sender, EventArgs e) { #if DEBUG chkFullBuf.Enabled = false; #endif ilIcon.Images.Add("Default", Icon); RefreshDevices(); } private void btnRefresh_Click(object sender, EventArgs e) { RefreshDevices(); } private void lvDevices_SelectedIndexChanged(object sender, EventArgs e) { if (lvDevices.SelectedIndices.Count == 0) { btnConnect.Enabled = false; } else { btnConnect.Enabled = true; } } private void btnConnect_Click(object sender, EventArgs e) { if (lvDevices.SelectedIndices.Count == 0) { return; } var device = (MediaDevice)lvDevices.SelectedItems[0].Tag; device.Connect(); var webDavMtpStore = new WebDavMtpStore(device, chkEnableRo.Checked); if (chkFullBuf.Checked) webDavMtpStore.FullBuf(); var end = GetEndPoint(); var davServer = new WebDavServer(webDavMtpStore); davServer.Start($"http://{end}/"); Thread.Sleep(500); //var nd = new NetworkDrive(); //nd.LocalDrive = cboDrive.Text; //nd.Persistent = false; //nd.PromptForCredentials = false; //nd.SaveCredentials = false; //nd.ShareName = $@"\\{end.Address}@{end.Port}\"; //nd.Comment = "Mtp2Dav"; //nd.MapDrive(); //_mappedDrive = nd; if (chkMapDrive.Checked) { var r = Cmd.NetUse(cboDrive.Text, $@"\\{end.Address}@{end.Port}\"); if (r == 0) { _mappedDriveLetter = cboDrive.Text; Process.Start(_mappedDriveLetter + ":"); ((Folder2)new ShellClass().NameSpace(_mappedDriveLetter + @":\")).Self.Name = "Mtp2Dav Drive"; } else { _mappedDriveLetter = null; MessageBox.Show("Drive mapping fail. We will direct access."); Process.Start($@"\\{end.Address}@{end.Port}\"); } } else { _mappedDriveLetter = null; Process.Start($@"\\{end.Address}@{end.Port}\"); } _connectedDevice = device; _runingDavServer = davServer; lvDevices.Enabled = btnRefresh.Enabled = btnConnect.Enabled = cboDrive.Enabled = false; btnDisconnect.Enabled = true; } private void btnDisconnect_Click(object sender, EventArgs e) { //_mappedDrive.UnMapDrive(); if (_mappedDriveLetter != null) { var r = Cmd.NetUseDriveLetterDelete(_mappedDriveLetter); if (r != 0) { MessageBox.Show("Drive unmapping fail. Please manual unmapping."); //new NetworkDrive().ShowDisconnectDialog(this); } } _runingDavServer.Stop(); _connectedDevice.Disconnect(); btnDisconnect.Enabled = false; lvDevices.Enabled = btnRefresh.Enabled = cboDrive.Enabled = btnConnect.Enabled = true; } private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { if (btnDisconnect.Enabled) btnDisconnect_Click(null, null); //so dirty :) } } }