All pastes #91020 Raw Edit

Stuff

public text v1 · immutable
#91020 ·published 2006-07-18 06:26 UTC
rendered paste body
		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);
				}
			}
		}