private void AddDownload(object sender, EventArgs e) { using (FrmManageDownload frmManageDownload = new FrmManageDownload()) if (frmManageDownload.ShowDialog() == DialogResult.OK) { string url = frmManageDownload.textBox1.Text; string lowerurl = url.ToLowerInvariant(); if (!(lowerurl.StartsWith("http://") || lowerurl.StartsWith("https://") || lowerurl.StartsWith("ftp://"))) url = "http://" + url; AddDownloadFromMemory(url); } } public void AddDownloadFromMemory(string url) { DownloadManager.TemporaryDownloadList.Add(url); ManagedDownload download = null; ListViewItem listViewItem = listView1.Items.Add(url); DownloadContainer downloadContainer = new DownloadContainer(download, listViewItem); listViewItem.SubItems.Add("Connecting"); ThreadPool.UnsafeQueueUserWorkItem(CreateDownload, new CreateDownloadState(url, listViewItem, downloadContainer)); } public void AddDownloadFromFile(Protocol protocol, string url, DateTime lastModified, long size, int segmentCount, string id, Segment[] segmentList) { ManagedDownload download = null; ListViewItem listViewItem = listView1.Items.Add(url); DownloadContainer downloadContainer = new DownloadContainer(download, listViewItem); download = ManagedDownload.Create(protocol, url, lastModified, size, segmentCount, id, segmentList, DisplayMessage, downloadContainer.ChangeState); listViewItem.SubItems.Add("Connecting"); DownloadManager.ManagedDownloadList.Add(id, download); ThreadPool.UnsafeQueueUserWorkItem(CheckDownload, download); } private void CheckDownload(object data) { (data as ManagedDownload).CheckDownload(); } private class CreateDownloadState { public string url; public ListViewItem listViewItem; public DownloadContainer downloadContainer; private delegate void _RemoveFromTemporaryDownloadList(ManagedDownload download); private _RemoveFromTemporaryDownloadList delegateRemoveFromTemporaryDownloadList; public CreateDownloadState(string url, ListViewItem listViewItem, DownloadContainer downloadContainer) { this.url = url; this.listViewItem = listViewItem; this.downloadContainer = downloadContainer; delegateRemoveFromTemporaryDownloadList = RemoveFromTemporaryDownloadList; } public void RemoveFromTemporaryDownloadList(ManagedDownload download) { if (listViewItem.ListView.InvokeRequired) listViewItem.ListView.BeginInvoke(delegateRemoveFromTemporaryDownloadList, download); else { if (download.id != null) { DownloadManager.TemporaryDownloadList.Remove(url); DownloadManager.ManagedDownloadList.Add(download.id, download); } } } } private void CreateDownload(object data) { CreateDownloadState createDownloadState = data as CreateDownloadState; try { createDownloadState.downloadContainer.download = ManagedDownload.Create(createDownloadState.url, DisplayMessage, createDownloadState.downloadContainer.ChangeState, /*AddToManagedList*/createDownloadState.RemoveFromTemporaryDownloadList); } catch (UriFormatException) { DisplayMessage("The URL you have entered is not valid"); listView1.BeginInvoke(delegateRemoveItem, createDownloadState.listViewItem); return; } catch (WebException webException) { createDownloadState.downloadContainer.ChangeState("Error: " + webException.Message); } } private void RemoveItem(ListViewItem listViewItem) { listView1.Items.Remove(listViewItem); } public void DisplayMessage(string message) { MessageBox.Show(this, message, "MetroLeech"); } public class DownloadContainer { public ManagedDownload download; public ListViewItem listViewItem; private delegate void _ChangeState(string message); private _ChangeState delegateChangeState; public DownloadContainer(ManagedDownload download, ListViewItem listViewItem) { this.download = download; this.listViewItem = listViewItem; delegateChangeState = ChangeState; } public void ChangeState(string message) { if (listViewItem.ListView.InvokeRequired) listViewItem.ListView.BeginInvoke(delegateChangeState, message); else { listViewItem.SubItems[1].Text = message; listViewItem.ListView.Invalidate(listViewItem.SubItems[1].Bounds); } } }