/// <summary> /// Executes a file download for a <see cref="FileRevision"/> /// </summary> /// <param name="downloadFileViewModel">The <see cref="IDownloadFileViewModel"/></param> /// <param name="fileRevision">The <see cref="FileRevision"/></param> /// <returns>An awaitable <see cref="Task"/></returns> public async Task ExecuteDownloadFile(IDownloadFileViewModel downloadFileViewModel, FileRevision fileRevision) { if (fileRevision != null) { downloadFileViewModel.LoadingMessage = "Downloading"; var cancelEnabledInterval = Observable.Interval(TimeSpan.FromMilliseconds(250)); var subscription = cancelEnabledInterval.Subscribe(_ => { downloadFileViewModel.IsCancelButtonVisible = downloadFileViewModel.Session.CanCancel(); }); downloadFileViewModel.IsBusy = true; try { await fileRevision.DownloadFile(downloadFileViewModel.Session); } catch (Exception ex) { if (ex is OperationCanceledException || ex.InnerException is TaskCanceledException) { this.messageBoxService.Show($"Downloading {fileRevision.Name} was cancelled", "Download cancelled", MessageBoxButton.OK, MessageBoxImage.Exclamation); } else { Logger.Error(ex, $"Downloading {fileRevision.Name} caused an error"); this.messageBoxService.Show($"Downloading {fileRevision.Name} caused an error: {ex.Message}", "Download failed", MessageBoxButton.OK, MessageBoxImage.Error); } } finally { subscription.Dispose(); downloadFileViewModel.LoadingMessage = ""; downloadFileViewModel.IsCancelButtonVisible = false; downloadFileViewModel.IsBusy = false; } } }
/// <summary> /// Cancels a file download /// </summary> /// <param name="downloadFileViewModel">The <see cref="IDownloadFileViewModel"/></param> public void CancelDownloadFile(IDownloadFileViewModel downloadFileViewModel) { if (downloadFileViewModel.Session.CanCancel()) { downloadFileViewModel.Session.Cancel(); } }
/// <summary> /// Executes a file download for a <see cref="File"/> /// </summary> /// <param name="downloadFileViewModel">The <see cref="IDownloadFileViewModel"/></param> /// <param name="file">The <see cref="File"/></param> /// <returns>An awaitable <see cref="Task"/></returns> public async Task ExecuteDownloadFile(IDownloadFileViewModel downloadFileViewModel, File file) { await this.ExecuteDownloadFile(downloadFileViewModel, file.FileRevision.OrderByDescending(x => x.CreatedOn).FirstOrDefault()); }