示例#1
0
        private void Process()
        {
            try
            {
                if (Info == null)
                {
                    State = Status.GettingHeaders;
                    GetHeaders();
                    aop.Post(delegate { DownloadInfoReceived.Raise(this, EventArgs.Empty); }, null);
                }
                var append    = RemainingRangeStart > 0;
                var bytesRead = 0;
                var buffer    = new byte[2 * 1024];
                State = Status.SendingRequest;
                using (var response = RequestHelper.CreateRequestGetResponse(Info, RemainingRangeStart, BeforeSendingRequest, AfterGettingResponse))
                {
                    State = Status.GettingResponse;
                    using (var responseStream = response.GetResponseStream())
                        using (var file = FileHelper.CheckFile(FullFileName, append))
                        {
                            while (allowDownload && (bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                State = Status.Downloading;
                                file.Write(buffer, 0, bytesRead);
                                TotalBytesReceived += bytesRead;
                                speedBytesTotal    += bytesRead;
                                aop.Post(delegate
                                {
                                    ProgressChanged.Raise(this,
                                                          new ProgressChangedEventArgs(SpeedInBytes, this.Progress, TotalBytesReceived));
                                }, Progress);
                            }
                        }
                }

                if (RemainingRangeStart > Info.Length)
                {
                    throw new Exception("Total bytes received overflows content length");
                }
                if (TotalBytesReceived == Info.Length)
                {
                    State = Status.Completed;
                    DownloadCompleted.Raise(this, EventArgs.Empty);
                }
                else if (!allowDownload)
                {
                    State = Status.Paused;
                }
            }
            catch (Exception ex)
            {
                State = Status.ErrorOccured;
                aop.Post(delegate
                {
                    ErrorOccured.Raise(this, new ErrorEventArgs(ex));
                }, null);
            }
        }
        private void cd_ResponseReceived(object sender, ResponseReceivedEventArgs e)
        {
            var cd = (HttpRangeDownloader)sender;

            if (Info == null)
            {
                Info     = HttpDownloadInfo.GetFromResponse(e.Response, Url);
                LastInfo = Info.Clone();
                cd.Info  = Info.Clone();
                cd.Wait  = Info.AcceptRanges;
                var chunkedHeader = e.Response.Headers[HttpResponseHeader.TransferEncoding];
                UseChunk = Info.AcceptRanges && chunkedHeader != null && chunkedHeader.ToLower() == "chunked";
                Ranges.First().End = Info.ContentSize - 1;
                //NofThread = Info.AcceptRanges ? NofThread : 1;
                DownloadInfoReceived.Raise(this, EventArgs.Empty);
            }
            if (NofActiveThreads > 1 && Info.AcceptRanges && Info.ResumeCapability != Resumeability.Yes)
            {
                Info.ResumeCapability = Resumeability.Yes;
                foreach (var a in cdList)
                {
                    Info.AcceptRanges   = true;
                    a.Info.AcceptRanges = true;
                }
                foreach (var item in cdList.Where(x => x.Wait))
                {
                    item.Wait = false;
                }
            }
            if (Info.ContentSize < 10 * 1024 + 1)
            {
                foreach (var item in cdList.Where(x => x.Wait))
                {
                    item.Wait = false;
                }
            }
            createNewThreadIfRequired();
        }
示例#3
0
        private void Process()
        {
            try
            {
                //Get the download headers if not exists
                if (Info == null)
                {
                    State = Status.GettingHeaders;
                    GetHeaders();
                    aop.Post(delegate { DownloadInfoReceived.Raise(this, EventArgs.Empty); }, null);
                }
                //Gets where download left
                var append    = RemainingRangeStart > 0;
                var bytesRead = 0;
                var buffer    = new byte[2 * 1024];
                State = Status.SendingRequest;

                using (var response = RequestHelper.CreateRequestGetResponse(Info, RemainingRangeStart, BeforeSendingRequest, AfterGettingResponse, Info.IsChunked))
                {
                    State = Status.GettingResponse;
                    using (var responseStream = response.GetResponseStream())
                        using (var file = FileHelper.CheckFile(FullFileName, append, LastMD5Checksum))
                        {
                            while (allowDownload && (bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                State = Status.Downloading;
                                file.Write(buffer, 0, bytesRead);
                                TotalBytesReceived += bytesRead;
                                speedBytesTotal    += bytesRead;
                                aop.Post(delegate
                                {
                                    ProgressChanged.Raise(this,
                                                          new ProgressChangedEventArgs(SpeedInBytes, this.Progress, TotalBytesReceived));
                                }, Progress);
                            }
                        }
                }
                if (Info.Length > 0 && RemainingRangeStart > Info.Length)
                {
                    throw new Exception("Total bytes received overflows content length");
                }
                if (TotalBytesReceived == Info.Length || (Info.Length < 1 && allowDownload))
                {
                    State = Status.Completed;
                    DownloadCompleted.Raise(this, EventArgs.Empty);
                }
                else if (!allowDownload)
                {
                    State = Status.Paused;
                    DownloadPaused.Raise(this, EventArgs.Empty);
                }
            }
            catch (Exception ex)
            {
                if (TotalBytesReceived == Info.Length)
                {
                    State = Status.Completed;
                    DownloadCompleted.Raise(this, EventArgs.Empty);
                }
                else if (!allowDownload)
                {
                    State = Status.Paused;
                    DownloadPaused.Raise(this, EventArgs.Empty);
                }
                else
                {
                    LastError = ex;
                    State     = Status.ErrorOccured;
                    aop.Post(delegate
                    {
                        ErrorOccured.Raise(this, new ErrorEventArgs(ex));
                    }, null);
                }
            }
            finally
            {
                if (LastError == null || !(LastError is FileValidationFailedException))
                {
                    LastMD5Checksum = FileHelper.CalculateMD5(FullFileName);
                }
            }
        }