private async void cd_Completed(object sender, EventArgs e)
        {
            if (Info.ContentSize < 1)
            {
                Status = HttpDownloaderStatus.MergingFiles;
                Directory.CreateDirectory(SaveDir);
                File.Delete(this.FilePath);
                File.Move(Ranges[0].FilePath, this.FilePath);
                Progress = 100;
                Status   = HttpDownloaderStatus.Completed;
                Completed.Raise(this, EventArgs.Empty, aop);
            }
            else if (Ranges.All(x => x.IsDownloaded) &&
                     Ranges.All(x => x.IsIdle) &&
                     TotalBytesReceived == Info.ContentSize &&
                     !flagMerged)
            {
                Directory.CreateDirectory(SaveDir);
                flagMerged = true;
                Progress   = 100;
                Status     = HttpDownloaderStatus.MergingFiles;
                await MergePartialFiles();

                ProgressChanged.Raise(this, new ProgressChangedEventArgs(Progress), aop);
                Status = HttpDownloaderStatus.Completed;
                Completed.Raise(this, EventArgs.Empty, aop);
            }
            else
            {
                createNewThreadIfRequired();
            }
        }
Exemple #2
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_ProgressChanged(object sender, EventArgs e)
        {
            double prnew = 0;

            if (Info != null && Info.ContentSize > 0)
            {
                prnew = double.Parse((TotalBytesReceived * 100d / Info.ContentSize).ToString("0.00"));
            }
            else
            {
                prnew = 0;
            }
            Speed = (long)((TotalBytesReceived - speedBytesOffset) / stp.Elapsed.TotalSeconds);

            if (Progress == 0 || prnew != Progress)
            {
                Status   = HttpDownloaderStatus.Downloading;
                Progress = prnew;
                ProgressChanged.Raise(this, new ProgressChangedEventArgs(Progress), aop);
            }
        }
Exemple #4
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);
                }
            }
        }
Exemple #5
0
        protected void FireProgressChangedEvent(double currentProgress)
        {
            var args = new OperationProgressChangedEventArgs(currentProgress);

            ProgressChanged.Raise(this, args);
        }
Exemple #6
0
 public void Progress(int progress)
 {
     ProgressChanged.Raise(this, new ProgressEventArgs(progress));
 }
        void DownloadProcedure()
        {
            try
            {
                var endOfStream = false;

                var stOffset       = Range.Remaining.Start;
                var chunkEndOffset = stOffset + 1 * 1024 * 1000 - 1;
                var endOffset      = UseChunk ? Math.Min(chunkEndOffset, Range.End) : Range.End;
                Range.Status  = Status = State.SendRequest;
                Range.LastTry = DateTime.Now;
                request       = Info != null?
                                HttpRequestHelper.CreateHttpRequest(Info, stOffset, endOffset, BeforeSendingRequest) :
                                    HttpRequestHelper.CreateHttpRequest(Url, BeforeSendingRequest, true);

                Range.Status = Status = State.GetResponse;

                using (var response = Info != null ?
                                      HttpRequestHelper.GetRangedResponse(Info, stOffset, endOffset, request, AfterGettingResponse) :
                                      request.GetResponse() as HttpWebResponse)
                {
                    Range.Status = Status = State.GetResponseStream;

                    ResponseReceived.Raise(this, new ResponseReceivedEventArgs(response));
                    while (Wait)
                    {
                        Thread.Sleep(100);
                    }
                    using (fileStream = FileHelper.CheckFile(Range.FilePath, Range.TotalBytesReceived > 0))
                    {
                        using (var str = response.GetResponseStream())
                        {
                            var buffer = new byte[10 * 1024];

                            var bytesRead = 0;
                            while (true)
                            {
                                if (str != null)
                                {
                                    bytesRead = str.Read(buffer, 0, buffer.Length);
                                }
                                if (Info.ContentSize > 0)
                                {
                                    bytesRead = (int)Math.Min(Range.Size - Range.TotalBytesReceived, bytesRead);
                                }
                                if (bytesRead <= 0)
                                {
                                    endOfStream = true;
                                    break;
                                }
                                if (stopFlag)
                                {
                                    break;
                                }
                                if (Info != null && Info.ContentSize > 0 && Range.IsDownloaded)
                                {
                                    break;
                                }
                                Range.Status = Status = State.Downloading;

                                fileStream.Write(buffer, 0, bytesRead);

                                Range.TotalBytesReceived += bytesRead;
                                ProgressChanged.Raise(this, EventArgs.Empty);
                            }
                        }
                    }
                }
                lock (GlobalLock.Locker)
                {
                    Range.LastTry = DateTime.Now;
                    if ((!stopFlag && endOfStream && Info.ContentSize < 1) ||
                        (Info.ContentSize > 0 && Range.IsDownloaded))
                    {
                        Range.Status = Status = State.Completed;
                        Completed.Raise(this, EventArgs.Empty);
                    }
                    else if (stopFlag)
                    {
                        Range.Status = Status = State.Stopped;
                        Stopped.Raise(this, EventArgs.Empty);
                    }
                }
            }
            catch (Exception ex)
            {
                lock (GlobalLock.Locker)
                {
                    Range.LastTry = DateTime.Now;
                    if (Info != null && Info.ContentSize > 0 && Range.IsDownloaded)
                    {
                        Range.Status = Status = State.Completed;
                        Completed.Raise(this, EventArgs.Empty);
                    }
                    else if (stopFlag)
                    {
                        Range.Status = Status = State.Stopped;
                        Stopped.Raise(this, EventArgs.Empty);
                    }
                    else
                    {
                        Range.Status = Status = State.Failed;
                        Failed.Raise(this, new ErrorEventArgs(ex));
                    }
                }
            }
            finally
            {
                if (request != null)
                {
                    request.Abort();
                }
                if (!Range.IsIdle)
                {
                    Range.Status = Status = State.Failed;
                }
            }
        }