示例#1
0
 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);
     }
 }
示例#2
0
        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();    //关闭窗口
        }
示例#3
0
        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);
        }
示例#4
0
 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);
 });
示例#5
0
        /// <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);
            };
        }
示例#6
0
 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;
 }
示例#7
0
 /// <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);
     });
 }
示例#8
0
        public void SetDownloader(AbstractDownloader dw)
        {
            downloader = dw;

            dw.DownloadProgressChanged += DownloaderDownloadProgressChanged;
            dw.DownloadComplete        += DownloadCompleted;
            dw.DownloadError           += DisplayError;
            dw.StateChanged            += DownloaderStateChanged;

            DownloaderStateChanged(dw.State);
        }
示例#9
0
        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();
            }
        }
示例#10
0
        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()));
            }
        }
示例#11
0
        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);
            }
        }
示例#12
0
 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;
 }
示例#13
0
        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);
                }
            }
        }
示例#14
0
        /// <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;
            }
        }
示例#15
0
        /// <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");
        }
示例#16
0
        /// <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");
        }
示例#17
0
        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;
 }