Exemplo n.º 1
0
        /// <summary>
        /// return false when no more task
        /// </summary>
        /// <returns></returns>
        private Boolean WorkOnce()
        {
            Task             activeTask;
            DownloadTaskInfo activeTaskSnapshot;

            lock (m_lock)
            {
                if (m_stop)     //stop
                {
                    return(false);
                }

                if (m_taskQueue.Count == 0)             //nothing to do
                {
                    return(false);
                }

                activeTask = m_taskQueue[0];
                m_taskQueue.RemoveAt(0);

                activeTaskSnapshot = activeTask.ToDownloadTaskInfo();

                activeTask.status = DownloadTaskStatus.Downloading;
            }

            if (File.Exists(activeTaskSnapshot.localPath))      //local file exist, check whether already finished
            {
#if USE_CURL_DOWNLOADER
                if (!FileDownloaderEx.IsFileInProgress(activeTaskSnapshot.localPath))
#else
                if (!FileDownloader.IsFileInProgress(activeTaskSnapshot.localPath))
#endif
                {
                    Int64  fileSize;
                    string md5string = CalcFileMd5AndSize(activeTaskSnapshot.localPath, out fileSize);
                    if (CompareMd5(md5string, activeTaskSnapshot.md5) == 0)
                    {
                        lock (m_lock)
                        {
                            activeTask.status       = DownloadTaskStatus.Finished;
                            activeTask.totalSize    = fileSize;
                            activeTask.finishedSize = fileSize;
                            RaiseTaskEndEvent(activeTask.ToDownloadTaskInfo());
                            return(true);
                        }
                    }
                    else        //file content is not correct
                    {
                        File.Delete(activeTaskSnapshot.localPath);

                        //download again
                    }
                }
            }

#if USE_CURL_DOWNLOADER
            FileDownloaderEx downloader = new FileDownloaderEx();
#else
            FileDownloader downloader = new FileDownloader();
#endif

            Boolean bCanceled = false;

            downloader.ProgressChanged += (sender, arg) =>
            {
                //update task status
                lock (m_lock)
                {
                    if (!activeTask.status.CanPause())  //stopped
                    {
                        downloader.Cancel();
                        bCanceled = true;
                    }
                    else
                    {
                        activeTask.totalSize    = arg.TotalFileSize;
                        activeTask.finishedSize = arg.CurrentFileSize;
                    }
                }
                //Thread.Sleep(1);
            };

            downloader.DownloadComplete += (sender, arg) =>
            {
            };

            try
            {
                Directory.CreateDirectory(m_rootDir);

                downloader.Download(activeTask.url, activeTask.hostName, activeTask.localPath, DownloadMan.reqTimeOut);
                if (!bCanceled)
                {
                    Int64  fileSize;
                    string md5string = CalcFileMd5AndSize(activeTaskSnapshot.localPath, out fileSize);
                    if (CompareMd5(md5string, activeTaskSnapshot.md5) == 0)
                    {
                        lock (m_lock)
                        {
                            activeTask.status       = DownloadTaskStatus.Finished;
                            activeTask.totalSize    = fileSize;
                            activeTask.finishedSize = fileSize;
                        }
                    }
                    else        //md5 dismatch
                    {
                        File.Delete(activeTaskSnapshot.localPath);
                        lock (m_lock)
                        {
                            activeTask.status       = DownloadTaskStatus.Failed;
                            activeTask.errorCode    = DownloadTaskErrorCode.Md5Dismatch;
                            activeTask.errorMessage = activeTask.errorCode.ToString();
                        }
                    }
                }
            }
            catch (WebException e)
            {
                lock (m_lock)
                {
                    activeTask.status         = DownloadTaskStatus.Failed;
                    activeTask.errorCode      = DownloadTaskErrorCode.NetworkError;
                    activeTask.innerErrorCode = (Int32)e.Status;
                    activeTask.errorMessage   = e.Message;
                }
            }
            catch (IOException e)
            {
                lock (m_lock)
                {
                    activeTask.status         = DownloadTaskStatus.Failed;
                    activeTask.errorCode      = DownloadTaskErrorCode.IOError;
                    activeTask.innerErrorCode = 0;
                    activeTask.errorMessage   = e.Message;
                }
            }
            catch (ArgumentException e)
            {
                lock (m_lock)
                {
                    activeTask.status         = DownloadTaskStatus.Failed;
                    activeTask.errorCode      = DownloadTaskErrorCode.UrlArgError;
                    activeTask.innerErrorCode = 0;
                    activeTask.errorMessage   = e.Message;
                }
            }
            catch (Exception e)
            {
                lock (m_lock)
                {
                    activeTask.status         = DownloadTaskStatus.Failed;
                    activeTask.errorCode      = DownloadTaskErrorCode.Unknown;
                    activeTask.innerErrorCode = 0;
                    activeTask.errorMessage   = e.Message;
                }
            }

            if (!bCanceled)
            {
                RaiseTaskEndEvent(activeTask.ToDownloadTaskInfo());
            }

            return(true);
        }
Exemplo n.º 2
0
		/// <summary>
		/// return false when no more task
		/// </summary>
		/// <returns></returns>
		private Boolean WorkOnce()
		{
			Task activeTask;
			DownloadTaskInfo activeTaskSnapshot;

			lock (m_lock)
			{
				if (m_taskQueue.Count == 0)		//nothing to do
					return false;

				activeTask = m_taskQueue[0];
				m_taskQueue.RemoveAt(0);

				activeTaskSnapshot = activeTask.ToDownloadTaskInfo();

				activeTask.status = DownloadTaskStatus.Downloading;
			}

			if (File.Exists(activeTaskSnapshot.localPath))	//local file exist, check whether already finished
			{
				if (!FileDownloader.IsFileInProgress(activeTaskSnapshot.localPath))
				{
					Int64 fileSize;
					if (CalcFileMd5AndSize(activeTaskSnapshot.localPath, out fileSize) == activeTaskSnapshot.md5)
					{
						lock (m_lock)
						{
							activeTask.status = DownloadTaskStatus.Finished;
							activeTask.totalSize = fileSize;
							activeTask.finishedSize = fileSize;
							RaiseTaskEndEvent(activeTask.ToDownloadTaskInfo());
							return true;
						}
					}
					else	//file content is not correct
					{
						File.Delete(activeTaskSnapshot.localPath);

						//download again
					}
				}
			}

			FileDownloader downloader = new FileDownloader();

			Boolean bCanceled = false;

			downloader.ProgressChanged += (sender, arg) =>
				{
					//update task status
					lock (m_lock)
					{
						if (!activeTask.status.CanPause())	//stopped
						{
							downloader.Cancel();
							bCanceled = true;
						}
						else
						{
							activeTask.totalSize = arg.TotalFileSize;
							activeTask.finishedSize = arg.CurrentFileSize;
						}
					}
				};

			downloader.DownloadComplete += (sender, arg) =>
				{
				};

			try
			{
				Directory.CreateDirectory(m_rootDir);

				downloader.Download(activeTask.url, activeTask.localPath);
				if (!bCanceled)
				{
					Int64 fileSize;
					if (CalcFileMd5AndSize(activeTaskSnapshot.localPath, out fileSize) == activeTaskSnapshot.md5)
					{
						lock (m_lock)
						{
							activeTask.status = DownloadTaskStatus.Finished;
							activeTask.totalSize = fileSize;
							activeTask.finishedSize = fileSize;
						}
					}
					else	//md5 dismatch
					{
						File.Delete(activeTaskSnapshot.localPath);
						lock (m_lock)
						{
							activeTask.status = DownloadTaskStatus.Failed;
							activeTask.errorCode = DownloadTaskErrorCode.Md5Dismatch;
						}
					}
				}
			}
			catch (WebException e)
			{
				lock (m_lock)
				{
					activeTask.status = DownloadTaskStatus.Failed;
					activeTask.errorCode = DownloadTaskErrorCode.NetworkError;
					activeTask.innerErrorCode = (Int32)e.Status;
					activeTask.errorMessage = e.Message;
				}
			}
			catch (IOException e)
			{
				lock (m_lock)
				{
					activeTask.status = DownloadTaskStatus.Failed;
					activeTask.errorCode = DownloadTaskErrorCode.IOError;
					activeTask.innerErrorCode = 0;
					activeTask.errorMessage = e.Message;
				}
			}

			if (!bCanceled)
				RaiseTaskEndEvent(activeTask.ToDownloadTaskInfo());

			return true;
		}