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