private void AnyDownloader_StatusChanged( AbstractDownloader sender, DownloaderStatus status) { if (status == DownloaderStatus.Completed) { histories.Add(new DownloadHistory( sender.DownloadTask.Key, sender.Result.Path, DateTime.Now)); if (settingEntries.IsNotificationEnabledWhenTaskCompleted) { ToastManager.DownloaderCompletionToast(sender); } } else if (status == DownloaderStatus.Error) { if (settingEntries.IsNotificationEnabledWhenFailed) { ToastManager.DownloaderErrorToast(sender); } } else if (status == DownloaderStatus.Disposed) { sender.StatusChanged -= AnyDownloader_StatusChanged; downloaders.Remove(sender); } }
private async void SubmitButton_Click(object sender, RoutedEventArgs e) { SubmitButton.IsEnabled = false; AbstractDownloader downloader = analyser.GetDownloader(); Debug.WriteLine(nameof(currentFolderToken) + ": " + currentFolderToken); Models.DownloaderSettings settings = new Models.DownloaderSettings() { Url = analyser.URL, FileName = (bool)(NeedRenameButton.IsChecked) ? RenameBox.Text : analyser.GetRecommendedName(), Size = analyser.GetStreamSize() > 0 ? (long?)analyser.GetStreamSize() : null, Threads = ThreadLayout.Visibility == Visibility.Visible ? (int?)ThreadNumSlider.Value : null, FilePath = downloader.NeedTemporaryFilePath ? await StorageManager.GetTemporaryFileAsync() : null, FolderToken = currentFolderToken }; downloader.SetDownloader(settings); MainPage.Current.AddDownloadBar(downloader); //由于软件的窗口管理机制要把控件的值重置以准备下次被打开 RefreshUI(); await ApplicationViewSwitcher.SwitchAsync(MainPage.Current.ViewID); //拉起MainPage await ApplicationView.GetForCurrentView().TryConsolidateAsync(); //关闭窗口 }
public void BindDownloader(AbstractDownloader downloader) { if (Downloader != null) { ClearDownloaderBinding(); } if (downloader == null) { return; } Downloader = downloader; FileNameTextBlock.Text = Downloader.DownloadTask.DestinationFileName; if (Downloader.Progress is IMeasurableProgress) { Downloader.Progress.ProgressChanged += MeasurableProgressChanged; MeasurableProgressChanged(Downloader.Progress, null); } else { Downloader.Progress.ProgressChanged += ProgressChanged; ProgressChanged(Downloader.Progress, null); } Downloader.Speed.Updated += SpeedUpdated; Downloader.StatusChanged += StatusChanged; StatusChanged(Downloader, Downloader.Status); }
private async void StatusChanged( AbstractDownloader downloader, DownloaderStatus status) => await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { StartButton.IsEnabled = downloader.CanStart; CancelButton.IsEnabled = downloader.CanCancel; VisualStateManager.GoToState(this, status.ToString(), false); });
/// <summary> /// Registers GUI handlers for events in downloader. /// </summary> /// <param name="downloader">Downloader object that needs its events to be connected and reported /// by GUI.</param> private void ConnectDownloader(AbstractDownloader downloader) { downloader.EstimationChanged += (s, args) => { if (this.state != State.Ready) { this.overallProgressBar.Maximum = this.Estimate(); } }; downloader.ProgressChanged += (s, args) => { if (this.state != State.Ready) { this.overallProgressBar.Value = args.Progress; this.statusLabel.Text = this.StatusText(this.lastStatus, this.lastInfo); } }; downloader.CurrentOperationEstimationChanged += (s, args) => { this.subtaskEstimations[args.Task] = args.Estimation; this.currentOperationProgressBar.Maximum = args.Estimation; }; downloader.CurrentOperationProgressChanged += (s, args) => { if (!this.subtaskEstimations.ContainsKey(args.Task)) { throw new InternalErrorException( $"Have no estimation for task {args.Task.Info}, but it is reporting progress."); } this.currentOperationProgressBar.Maximum = this.subtaskEstimations[args.Task]; this.currentOperationProgressBar.Value = args.Progress; if ((this.state == State.Ready) || (args.Info.Length == 0)) { return; } this.lastInfo = args.Info; this.statusLabel.Text = this.StatusText(this.lastStatus, args.Info); }; // TODO: Display preliminary results. ////protocol.PreliminaryResultsReady += (s, args) => { }; downloader.StatusChanged += (s, args) => { if (this.state == State.Ready) { return; } this.lastStatus = args.Status; this.lastInfo = string.Empty; this.statusLabel.Text = this.StatusText(args.Status); }; }
public void NavigateDownloaderDetailPage(AbstractDownloader downloader) { NavigateRightFrame(typeof(TaskDetailPage), downloader); DetailPage.Content = downloader.DownloadTask.Target.SuggestedName; DetailPage.Visibility = Visibility.Visible; (MainNavigationView.Parent as FrameworkElement)?.UpdateLayout(); MainNavigationView.SelectedItem = DetailPage; LeavePageEventHandler = LeaveDownloaderDetailPage; }
/// <summary> /// 添加一个DownloadBar到主界面,为了避免线程问题写在这里 /// 这段代码包含建立下载器的细节 /// </summary> public async void AddDownloadBar(AbstractDownloader downloader) { GC.Collect(); await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { DownloadBar db = new DownloadBar(); DownloadBarCollection.Add(db); db.SetDownloader(downloader); }); }
public void SetDownloader(AbstractDownloader dw) { downloader = dw; dw.DownloadProgressChanged += DownloaderDownloadProgressChanged; dw.DownloadComplete += DownloadCompleted; dw.DownloadError += DisplayError; dw.StateChanged += DownloaderStateChanged; DownloaderStateChanged(dw.State); }
private async void InitializeAsync() { //恢复上次关闭时保存的控件 var list = await TXDataFileIO.GetMessagesAsync(); if (list != null) { foreach (Models.DownloaderMessage ms in list) { DownloadBar db = new DownloadBar(); DownloadBarCollection.Add(db); AbstractDownloader dw = AbstractDownloader.GetDownloaderFromType(ms.DownloaderType); db.SetDownloader(dw); dw.SetDownloaderFromBreakpoint(ms); } } if (Settings.DownloadsFolderToken == null) { var contentDialog = new ContentDialog() { Title = Strings.AppResources.GetString("DownloadFolderPathIllegal"), Content = Strings.AppResources.GetString("SetDownloadFolder"), PrimaryButtonText = Strings.AppResources.GetString("Select"), SecondaryButtonText = Strings.AppResources.GetString("Cancel"), FullSizeDesired = false, }; contentDialog.PrimaryButtonClick += async(sender, e) => { var folderPicker = new FolderPicker(); folderPicker.FileTypeFilter.Add("."); StorageFolder folder = null; folder = await folderPicker.PickSingleFolderAsync(); if (folder == null) { App.Current.Exit(); } else { Settings.DownloadsFolderToken = StorageApplicationPermissions .MostRecentlyUsedList.Add(folder); } }; contentDialog.SecondaryButtonClick += (sender, e) => App.Current.Exit(); await contentDialog.ShowAsync(); } }
public void BindDownloader(AbstractDownloader downloader) { if (downloader == Downloader) { return; } if (Downloader != null) { ClearDownloaderBinding(); } Downloader = downloader; if (downloader == null) { return; } Downloader.DownloadTask.PropertyChanged += DownloadTask_PropertyChanged; DownloadTask_PropertyChanged(Downloader.DownloadTask, null); TaskNameTextBlock.Text = downloader.DownloadTask.DestinationFileName; if (downloader.DownloadTask.Target is HttpTarget httpTarget) { TaskHyperlink.Text = httpTarget.Uri.ToString(); } else if (downloader.DownloadTask.Target is TorrentTarget torrentTarget) { TaskHyperlink.Text = torrentTarget.DisplayedUri.ToString(); } DisposeButton.IsEnabled = true; Downloader.StatusChanged += StatusChanged; StatusChanged(downloader, downloader.Status); Downloader.Progress.ProgressChanged += ProgressChanged; ProgressChanged(downloader.Progress, null); Downloader.Speed.Updated += SpeedUpdated; SpeedUpdated(downloader.Speed); BasicLabelCollection.Add(new TaskDetailPageLabel(CreationTimeText, downloader.DownloadTask.CreationTime.ToLocalTime().ToString("F"))); BasicLabelCollection.Add(new TaskDetailPageLabel(TargetTypeText, downloader.DownloadTask.Target.GetType().Name)); BasicLabelCollection.Add(new TaskDetailPageLabel(DownloaderTypeText, downloader.GetType().Name)); if (downloader.Progress is IMeasurableProgress progress) { BasicLabelCollection.Add(new TaskDetailPageLabel(TotalSizeText, progress.TotalSize.SizedString())); } }
private void CreateDownloader(string token, byte[] checkPoint = null) { AbstractDownloader downloader = null; try { var task = tasks.First(t => t.Key.Equals(token)); if (task.Target is HttpRangableTarget httpRangableTarget) { downloader = new HttpParallelDownloader( task, coreFolderManager, coreCacheManager.GetCacheProviderForTask(token), coreBufferProvider, checkPoint, settingEntries.ThreadNumber); } else if (task.Target is HttpTarget httpTarget) { downloader = new HttpDownloader( task, coreFolderManager, coreCacheManager.GetCacheProviderForTask(token), coreBufferProvider); } else if (task.Target is TorrentTarget torrentTarget) { downloader = new TorrentDownloader( task, torrentProvider.Engine, coreFolderManager, coreCacheManager.GetCacheProviderForTask(token), checkPoint: checkPoint, maximumConnections: settingEntries.MaximumConnections, maximumDownloadSpeed: settingEntries.MaximumDownloadSpeed, maximumUploadSpeed: settingEntries.MaximumUploadSpeed, announceUrls: announceUrls); } } catch (Exception e) { D($"Downloader with task {token} creation failed, {e.Message}"); } if (downloader != null) { D($"Downloader with task {token} created"); downloader.MaximumRetries = settingEntries.MaximumRetries; downloader.StatusChanged += AnyDownloader_StatusChanged; downloaders.Add(downloader); } }
public void ClearDownloaderBinding() { if (Downloader == null) { return; } Downloader.StatusChanged -= StatusChanged; Downloader.Speed.Updated -= SpeedUpdated; if (Downloader.Progress is IMeasurableProgress) { Downloader.Progress.ProgressChanged -= MeasurableProgressChanged; } else { Downloader.Progress.ProgressChanged -= ProgressChanged; } Downloader = null; }
private async void InitializeAsync() { DownloadBarCollection.CollectionChanged += DownloadBarCollection_CollectionChanged;//订阅内容变化事件 //恢复上次关闭时保存的控件 var list = await StorageManager.GetMessagesAsync(); if (list != null) { foreach (Models.DownloaderMessage ms in list) { DownloadBar db = new DownloadBar(); DownloadBarCollection.Add(db); AbstractDownloader dw = AbstractDownloader.GetDownloaderFromType(ms.DownloaderType); db.SetDownloader(dw); dw.SetDownloaderFromBreakpoint(ms); } } }
/// <summary> /// Prints status of a downloader in status bar. /// </summary> /// <param name="downloader">Downloader whose status shall be reported.</param> private void ReportTaskStatus(AbstractDownloader downloader) { this.statusLabel.Text = this.StatusText(downloader.Status); switch (downloader.TaskStatus) { case TaskStatus.Failure: this.statusLabel.Text += Resources.MainFormDownloadingFailed; break; case TaskStatus.Errors: this.statusLabel.Text += Resources.MainFormDownloadingComletedWithErrors; break; case TaskStatus.Success: this.statusLabel.Text += Resources.MainFormDownloadingCompletedSuccessfully; break; } }
/// <summary> /// Launch a toast for a downloader's failure. /// </summary> /// <param name="downloader">The failed downloader.</param> public static void DownloaderErrorToast(AbstractDownloader downloader) { var xml = new ToastContentBuilder() .AddAppLogoOverride(new Uri("ms-appx:///Assets/IconWarning.png")) .AddText($"{DownloaderErrorTitlePrefix}{downloader.DownloadTask.DestinationFileName}") .AddText($"{downloader.Errors.FirstOrDefault().Message}") .AddToastActivationInfo( EncodeActivationCommand( ActivationCommandNavigateToTaskDetail, downloader.DownloadTask.Key ), ToastActivationType.Foreground ) .GetToastContent().GetXml(); ToastNotificationManager.CreateToastNotifier().Show( new ToastNotification(xml)); D($"Error toast for task {downloader.DownloadTask.Key} launched"); }
/// <summary> /// Launch a toast for a downloader's completion. /// </summary> /// <param name="downloader">The completed downloader.</param> public static async void DownloaderCompletionToast(AbstractDownloader downloader) { var xml = new ToastContentBuilder() .AddAppLogoOverride(new Uri("ms-appx:///Assets/IconComplete.png")) .AddText($"{DownloaderCompletionTitlePrefix}{downloader.DownloadTask.DestinationFileName}") .AddText($"{DownloaderCompletionDownloaded} {(await downloader.Result.GetSizeAsync()).SizedString()}") .AddText($"{DownloaderCompletionDuration} {downloader.Speed.RunningTime:hh\\:mm\\:ss}") .AddToastActivationInfo( EncodeActivationCommand( ActivationCommandNavigateToTaskHistory, downloader.DownloadTask.Key ), ToastActivationType.Foreground ) .GetToastContent().GetXml(); ToastNotificationManager.CreateToastNotifier().Show( new ToastNotification(xml)); D($"Completion toast for task {downloader.DownloadTask.Key} launched"); }
public void ClearDownloaderBinding() { Downloader.DownloadTask.PropertyChanged -= DownloadTask_PropertyChanged; Downloader.StatusChanged -= StatusChanged; Downloader.Speed.Updated -= SpeedUpdated; Downloader.Progress.ProgressChanged -= ProgressChanged; TaskNameTextBlock.Text = string.Empty; TaskHyperlink.Text = string.Empty; StartButton.IsEnabled = CancelButton.IsEnabled = DisposeButton.IsEnabled = false; StatusTextBlock.Text = string.Empty; ProgressTextBlock.Text = string.Empty; DownloadTimeTextBlock.Text = string.Empty; BasicLabelCollection.Clear(); DynamicLabelCollection.Clear(); Downloader = null; }
/// <summary> /// Adds a downloader to do work for this protocol. Clears previously added downloaders. /// </summary> /// <param name="downloader">Downloader to add.</param> protected void AddDownloader(AbstractDownloader downloader) { this.Clear(); this.AddSubDownloader(downloader); downloader.StatusChanged += this.OnStatusChanged; }