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); } }
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 (); } } } } }
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); } }
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(); } } } } }