예제 #1
0
        private void ExecuteImpl()
        {
            Exception err           = null;
            bool      fileOpenError = false;

            try {
                OpenLocalStream();
            } catch (UnauthorizedAccessException e) {
                err   = e;
                error = HttpFileDownloadErrors.UnauthorizedFileAccess;
            } catch (IOException e) {
                err   = e;
                error = HttpFileDownloadErrors.SharingViolation; // Probably
            } catch (Exception e) {
                err   = e;
                error = HttpFileDownloadErrors.Unknown;
            }

            if (error != HttpFileDownloadErrors.None)
            {
                fileOpenError = true;
            }

            if (err == null)
            {
                try {
                    InitWebClient();
                    wc.DownloadFileAsync(remoteUri, localStream);
                } catch (Exception e) {
                    err = e;
                }
            }

            if (err != null)
            {
                //Console.WriteLine ("DT:  {0}", err.Message);

                if (!fileOpenError)
                {
                    CloseLocalStream(true);
                }

                DestroyWebClient();

                SetStatus(TaskStatus.Failed);
                OnTaskCompleted(err, false);
            }
        }
예제 #2
0
        private void OnDownloadFileCompletedHandler(object sender,
	                                                 AsyncCompletedEventArgs e)
        {
            bool retry = false;

            lock (SyncRoot) {
                executing = false;
                TaskStatus newStatus = Status;

                try {
                    if (e.Error != null) {
                        Hyena.Log.WarningFormat ("HttpDownloadTask {0} Error: {1}", this.Name, e.Error);
                        WebException we = e.Error as WebException;

                        if (we != null) {
                            if(we.Status == WebExceptionStatus.ProtocolError) {
                                HttpWebResponse resp = we.Response as HttpWebResponse;

                                if (resp != null) {
                                    httpStatus = resp.StatusCode;

                                    // This is going to get triggered if the file on disk is complete.
                                    // Maybe request range-1 and see if a content length of 0 is returned.
                                    if (resp.StatusCode ==
                                        HttpStatusCode.RequestedRangeNotSatisfiable) {

                                        if (rangeError++ == 0) {
                                            retry = true;
                                        }
                                    }
                                }
                            }
                        }

                        if (!retry) {
                            error = HttpFileDownloadErrors.HttpError;
                            newStatus = TaskStatus.Failed;
                        }
                    } else if (modified > 0) {
                        if (modified == 1) {
                            retry = true;
                        } else {
                            newStatus = TaskStatus.Failed;
                        }
                    } else if (canceled) {
                        newStatus = TaskStatus.Cancelled;
                    } else if (paused) {
                        newStatus = TaskStatus.Paused;
                    } else if (stopped) {
                        newStatus = TaskStatus.Stopped;
                    } else {
                        newStatus = TaskStatus.Succeeded;
                    }
                } catch/* (Exception ex)*/ {
                    //Console.WriteLine ("Error__________________{0}", ex.Message);
                } finally {
                    if (retry) {
                        CloseLocalStream (true);
                        DestroyWebClient ();
                        ExecuteImpl ();
                    } else if (SetCompleted ()) {
                        switch (newStatus) {
                        case TaskStatus.Cancelled: goto case TaskStatus.Failed;
                        case TaskStatus.Failed:
                            CloseLocalStream (true);
                            break;
                        case TaskStatus.Paused:
                            completed = false;
                            goto case TaskStatus.Succeeded;
                        case TaskStatus.Stopped: goto case TaskStatus.Succeeded;
                        case TaskStatus.Succeeded:
                            CloseLocalStream (false);
                            break;
                        default:  goto case TaskStatus.Succeeded;
                        }

                        DestroyWebClient ();

                        SetStatus (newStatus);
                        OnTaskCompleted (e.Error, canceled);

                        if (mre != null) {
                            mre.Set ();
                        }
                    }
                }
            }
        }
예제 #3
0
        private void ExecuteImpl()
        {
            Exception err = null;
            bool fileOpenError = false;

            try {
                OpenLocalStream ();
            } catch (UnauthorizedAccessException e) {
                err = e;
                error = HttpFileDownloadErrors.UnauthorizedFileAccess;
            } catch (IOException e) {
                err = e;
                error = HttpFileDownloadErrors.SharingViolation; // Probably
            } catch (Exception e) {
                err = e;
                error = HttpFileDownloadErrors.Unknown;
            }

            if (error != HttpFileDownloadErrors.None) {
                fileOpenError = true;
            }

            if (err == null) {
                try {
                    InitWebClient ();
                    wc.DownloadFileAsync (remoteUri, localStream);
                } catch (Exception e) {
                    err = e;
                }
            }

            if (err != null) {
                //Console.WriteLine ("DT:  {0}", err.Message);

                if (!fileOpenError) {
                    CloseLocalStream (true);
                }

                DestroyWebClient ();

                SetStatus (TaskStatus.Failed);
                OnTaskCompleted (err, false);
            }
        }
예제 #4
0
        private void OnDownloadFileCompletedHandler(object sender,
                                                    AsyncCompletedEventArgs e)
        {
            bool retry = false;

            lock (SyncRoot) {
                executing = false;
                TaskStatus newStatus = Status;

                try {
                    if (e.Error != null)
                    {
                        Hyena.Log.WarningFormat("HttpDownloadTask {0} Error: {1}", this.Name, e.Error);
                        WebException we = e.Error as WebException;

                        if (we != null)
                        {
                            if (we.Status == WebExceptionStatus.ProtocolError)
                            {
                                HttpWebResponse resp = we.Response as HttpWebResponse;

                                if (resp != null)
                                {
                                    httpStatus = resp.StatusCode;

                                    // This is going to get triggered if the file on disk is complete.
                                    // Maybe request range-1 and see if a content length of 0 is returned.
                                    if (resp.StatusCode ==
                                        HttpStatusCode.RequestedRangeNotSatisfiable)
                                    {
                                        if (rangeError++ == 0)
                                        {
                                            retry = true;
                                        }
                                    }
                                }
                            }
                        }

                        if (!retry)
                        {
                            error     = HttpFileDownloadErrors.HttpError;
                            newStatus = TaskStatus.Failed;
                        }
                    }
                    else if (modified > 0)
                    {
                        if (modified == 1)
                        {
                            retry = true;
                        }
                        else
                        {
                            newStatus = TaskStatus.Failed;
                        }
                    }
                    else if (canceled)
                    {
                        newStatus = TaskStatus.Cancelled;
                    }
                    else if (paused)
                    {
                        newStatus = TaskStatus.Paused;
                    }
                    else if (stopped)
                    {
                        newStatus = TaskStatus.Stopped;
                    }
                    else
                    {
                        newStatus = TaskStatus.Succeeded;
                    }
                } catch /* (Exception ex)*/ {
                    //Console.WriteLine ("Error__________________{0}", ex.Message);
                } finally {
                    if (retry)
                    {
                        CloseLocalStream(true);
                        DestroyWebClient();
                        ExecuteImpl();
                    }
                    else if (SetCompleted())
                    {
                        switch (newStatus)
                        {
                        case TaskStatus.Cancelled: goto case TaskStatus.Failed;

                        case TaskStatus.Failed:
                            CloseLocalStream(true);
                            break;

                        case TaskStatus.Paused:
                            completed = false;
                            goto case TaskStatus.Succeeded;

                        case TaskStatus.Stopped: goto case TaskStatus.Succeeded;

                        case TaskStatus.Succeeded:
                            CloseLocalStream(false);
                            break;

                        default:  goto case TaskStatus.Succeeded;
                        }

                        DestroyWebClient();

                        SetStatus(newStatus);
                        OnTaskCompleted(e.Error, canceled);

                        if (mre != null)
                        {
                            mre.Set();
                        }
                    }
                }
            }
        }