/// <summary> /// Handles the <see cref="INotifyPropertyChanged.PropertyChanged"/> event of tasks. /// </summary> /// <remarks> /// This adds or removes tasks from the active task list as appropriate. /// </remarks> /// <param name="sender">The object that raised the event.</param> /// <param name="e">A <see cref="PropertyChangedEventArgs"/> describing the event arguments.</param> private void Task_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.IsActive))) { AddModTask tskTask = (AddModTask)sender; if (tskTask.IsActive) { m_setActiveTasks.Add(tskTask); } else { m_setActiveTasks.Remove(tskTask); } } if (e.PropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.TaskSpeed))) { int speed = 0; Int64 progress = 0; Int64 maxprogress = 0; foreach (AddModTask Task in ActiveTasks) { speed += Task.TaskSpeed; progress += Task.ItemProgress; maxprogress += Task.ItemProgressMaximum; } TotalMaximumProgress = maxprogress; TotalProgress = progress; TotalSpeed = speed; } }
/// <summary> /// Removes the given task. /// </summary> /// <param name="p_tskTask">IBackgroundTask task to remove.</param> public void RemoveTask(AddModTask p_tskTask) { if (DownloadMonitor.CanRemove(p_tskTask)) { DownloadMonitor.RemoveDownload(p_tskTask); } }
/// <summary> /// Resumes the queued running tasks. /// </summary> /// <remarks> /// Resumes the queued running tasks. /// </remarks> private void ResumeQueued() { AddModTask amtTask = m_dicActiveTasks.Values.Where(x => (x.Status == TaskStatus.Queued) && !x.IsRemote).FirstOrDefault(); if (amtTask != null) { amtTask.Resume(); } }
/// <summary> /// Removes a task from the monitor. /// </summary> /// <remarks> /// Tasks can only be removed if they are not running. /// </remarks> /// <param name="p_tskTask">The task to remove.</param> public void RemoveDownload(AddModTask p_tskTask) { if (CanRemove(p_tskTask)) { p_tskTask.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(Task_PropertyChanged); m_oclTasks.Remove(p_tskTask); m_setActiveTasks.Remove(p_tskTask); } }
/// <summary> /// Adds a task to the monitor. /// </summary> /// <param name="p_tskTask">The task to monitor.</param> public void AddActivity(AddModTask p_tskTask) { p_tskTask.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Task_PropertyChanged); m_oclTasks.Add(p_tskTask); if (p_tskTask.IsActive) { m_setActiveTasks.Add(p_tskTask); } }
/// <summary> /// Handles the <see cref="INotifyCollectionChanged.CollectionChanged"/> event of the view model's /// active task list. /// </summary> /// <remarks> /// This updates the control title. /// </remarks> /// <param name="sender">The object that raised the event.</param> /// <param name="e">A <see cref="NotifyCollectionChangedEventArgs"/> describing the event arguments.</param> private void ActiveTasks_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (this.IsHandleCreated) { lock (ViewModel.ModRepository) if (!ViewModel.ModRepository.IsOffline) { switch (e.Action) { case NotifyCollectionChangedAction.Add: case NotifyCollectionChangedAction.Replace: foreach (AddModTask tskAdded in e.NewItems) { if (ViewModel.ModRepository.IsOffline) { m_vmlViewModel.PauseTask(tskAdded); } else if ((m_vmlViewModel.RunningTasks.Count > m_vmlViewModel.MaxConcurrentDownloads) && (tskAdded.IsRemote)) { m_vmlViewModel.QueueTask(tskAdded); } } break; case NotifyCollectionChangedAction.Remove: foreach (AddModTask tskRemoved in e.OldItems) { if ((m_vmlViewModel.RunningTasks.Count < m_vmlViewModel.MaxConcurrentDownloads) && (tskRemoved.IsRemote)) { AddModTask amtQueued = m_vmlViewModel.QueuedTask; if (amtQueued != null) { m_vmlViewModel.ResumeTask(amtQueued); } } } break; default: throw new Exception("Unrecognized value for NotifyCollectionChangedAction."); } if (lvwTasks.InvokeRequired) { lvwTasks.Invoke((Action)UpdateTitle); } else { UpdateTitle(); } } } }
/// <summary> /// Adds the given <see cref="IBackgroundTask"/> to the view's list. If the <see cref="IBackgroundTask"/> /// already exists in the list, nothing is done. /// </summary> /// <param name="p_tskTask">The <see cref="IBackgroundTask"/> to add to the view's list.</param> protected void AddTaskToList(AddModTask p_tskTask) { foreach (DownloadListViewItem lviExisitingDownload in lvwTasks.Items) { if (lviExisitingDownload.Task == p_tskTask) { return; } } p_tskTask.PropertyChanged -= new PropertyChangedEventHandler(Task_PropertyChanged); p_tskTask.PropertyChanged += new PropertyChangedEventHandler(Task_PropertyChanged); DownloadListViewItem lviDownload = new DownloadListViewItem(p_tskTask); lvwTasks.Items.Add(lviDownload); }
/// <summary> /// Adds the specified mod to the queue. /// </summary> /// <remarks> /// The specified mod is downloaded, and then added to the mod manager. /// </remarks> /// <param name="p_uriPath">The URL of the mod to add to the manager.</param> /// <param name="p_cocConfirmOverwrite">The delegate to call to resolve conflicts with existing files.</param> public IBackgroundTask AddMod(Uri p_uriPath, ConfirmOverwriteCallback p_cocConfirmOverwrite) { AddModTask amtModAdder = null; if (p_uriPath.Scheme.ToLowerInvariant().ToString() == "nxm") { if (m_dicActiveTasks.ContainsKey(p_uriPath)) { return(m_dicActiveTasks[p_uriPath]); } Trace.TraceInformation(String.Format("[{0}] Adding Mod to AddModQueue", p_uriPath.ToString())); amtModAdder = new AddModTask(m_mmgModManager.GameMode, m_mmgModManager.ReadMeManager, m_mmgModManager.EnvironmentInfo, m_mmgModManager.ManagedModRegistry, m_mmgModManager.FormatRegistry, m_mmgModManager.ModRepository, p_uriPath, p_cocConfirmOverwrite); amtModAdder.TaskEnded += new EventHandler <TaskEndedEventArgs>(ModAdder_TaskEnded); amtModAdder.IsRemote = true; m_dicActiveTasks[p_uriPath] = amtModAdder; m_mmgModManager.DownloadMonitor.AddActivity(amtModAdder); amtModAdder.AddMod(false); } else { if (m_dicActiveTasks.ContainsKey(p_uriPath)) { return(m_dicActiveTasks[p_uriPath]); } Trace.TraceInformation(String.Format("[{0}] Adding Mod to AddModQueue", p_uriPath.ToString())); amtModAdder = new AddModTask(m_mmgModManager.GameMode, m_mmgModManager.ReadMeManager, m_mmgModManager.EnvironmentInfo, m_mmgModManager.ManagedModRegistry, m_mmgModManager.FormatRegistry, m_mmgModManager.ModRepository, p_uriPath, p_cocConfirmOverwrite); amtModAdder.TaskEnded += new EventHandler <TaskEndedEventArgs>(ModAdder_TaskEnded); amtModAdder.IsRemote = false; m_dicActiveTasks[p_uriPath] = amtModAdder; m_mmgModManager.DownloadMonitor.AddActivity(amtModAdder); if (LocalTaskCount > 1) { amtModAdder.AddMod(true); } else { amtModAdder.AddMod(false); } } return(amtModAdder); }
/// <summary> /// A simple constructor that initializes the object with the given values. /// </summary> /// <param name="p_tskTask">The task whose status is to be displayed by this list /// view item.</param> public DownloadListViewItem(AddModTask p_tskTask) { Task = p_tskTask; ListViewSubItem lsiSubItem = SubItems[0]; lsiSubItem.Name = ObjectHelper.GetPropertyName(() => p_tskTask.OverallMessage); lsiSubItem.Text = p_tskTask.OverallMessage; lsiSubItem = SubItems.Add(new ListViewSubItem()); lsiSubItem.Name = ObjectHelper.GetPropertyName(() => p_tskTask.OverallProgress); if (p_tskTask.ShowOverallProgressAsMarquee) { lsiSubItem.Text = "Working..."; } else { lsiSubItem.Text = ""; } lsiSubItem = SubItems.Add(new ListViewSubItem()); lsiSubItem.Name = ObjectHelper.GetPropertyName(() => p_tskTask.Status); if (p_tskTask.Status == TaskStatus.Running) { if (p_tskTask.IsRemote) { lsiSubItem.Text = "Downloading"; } else { lsiSubItem.Text = "Moving"; } } else { lsiSubItem.Text = p_tskTask.Status.ToString(); } lsiSubItem = SubItems.Add(new ListViewSubItem()); lsiSubItem.Name = ObjectHelper.GetPropertyName(() => p_tskTask.ItemMessage); if (p_tskTask.ShowItemProgress) { lsiSubItem.Text = p_tskTask.ItemMessage; } else { lsiSubItem.Text = ""; } lsiSubItem = SubItems.Add(new ListViewSubItem()); lsiSubItem.Name = "Fileserver"; lsiSubItem.Text = ""; lsiSubItem = SubItems.Add(new ListViewSubItem()); lsiSubItem.Name = "ETA"; lsiSubItem.Text = ""; lsiSubItem = SubItems.Add(new ListViewSubItem()); lsiSubItem.Name = ObjectHelper.GetPropertyName(() => p_tskTask.ItemProgress); if (p_tskTask.ShowItemProgress) { if (p_tskTask.ShowItemProgressAsMarquee) { lsiSubItem.Text = "Working..."; } else { lsiSubItem.Text = ""; } } lsiSubItem = SubItems.Add(new ListViewSubItem()); lsiSubItem.Name = ObjectHelper.GetPropertyName(() => p_tskTask.InnerTaskStatus); p_tskTask.PropertyChanged += new PropertyChangedEventHandler(Task_PropertyChanged); }
/// <summary> /// Updates the list view item to display the changed property. /// </summary> /// <param name="p_tskTask">The task whose property has changed.</param> /// <param name="p_strPropertyName">The name of the propety that has changed.</param> private void HandleChangedTaskProperty(AddModTask p_tskTask, string p_strPropertyName) { if (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.OverallMessage))) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.OverallMessage)].Text = p_tskTask.OverallMessage; } else if ((p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ETA_Seconds))) || (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ETA_Minutes)))) { if (Task.Status == TaskStatus.Running) { SubItems["ETA"].Text = String.Format("{0:00}:{1:00}", p_tskTask.ETA_Minutes, p_tskTask.ETA_Seconds); } else { SubItems["ETA"].Text = String.Empty; } } else if (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.FileServer))) { if (Task.Status == TaskStatus.Running) { SubItems["Fileserver"].Text = p_tskTask.FileServer; } else { SubItems["Fileserver"].Text = String.Empty; } } else if (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.TaskSpeed))) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemMessage)].Text = String.Format("{0:} KB/s", p_tskTask.TaskSpeed.ToString()); } else if ((p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.DownloadProgress))) || (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.DownloadMaximum)))) { if (p_tskTask.DownloadMaximum < 1024) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.OverallProgress)].Text = String.Format("{0}KB / {1}KB", p_tskTask.DownloadProgress, p_tskTask.DownloadMaximum); } else { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.OverallProgress)].Text = String.Format("{0}MB / {1}MB", (p_tskTask.DownloadProgress / 1024), (p_tskTask.DownloadMaximum / 1024)); } } else if (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ActiveThreads))) { if (Task.Status == TaskStatus.Running) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgress)].Text = p_tskTask.ActiveThreads.ToString(); } else { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgress)].Text = String.Empty; } } else if (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgress)) || p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgressMaximum)) || p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgressMinimum)) || p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ShowItemProgress)) || p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.ShowItemProgressAsMarquee))) { if (p_tskTask.ShowItemProgress) { if (p_tskTask.ShowItemProgressAsMarquee) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgress)].Text = "Working..."; } } else { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemMessage)].Text = null; SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgress)].Text = null; } } else if (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.Status))) { if (p_tskTask.Status == TaskStatus.Running) { if (p_tskTask.IsRemote) { SubItems[p_strPropertyName].Text = "Downloading"; } else { SubItems[p_strPropertyName].Text = "Moving"; } } else { SubItems[p_strPropertyName].Text = p_tskTask.Status.ToString(); SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemMessage)].Text = ""; SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgress)].Text = ""; if (!(p_tskTask.Status.ToString() == "Paused")) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.OverallProgress)].Text = ""; } SubItems["ETA"].Text = ""; } } else if (p_strPropertyName.Equals(ObjectHelper.GetPropertyName <AddModTask>(x => x.InnerTaskStatus))) { if ((p_tskTask.InnerTaskStatus.ToString() == "Retrying") && ((p_tskTask.Status != TaskStatus.Paused) && (p_tskTask.Status != TaskStatus.Queued))) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.Status)].Text = p_tskTask.InnerTaskStatus.ToString(); } else if (p_tskTask.InnerTaskStatus.ToString() == "Running") { if (p_tskTask.IsRemote) { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.Status)].Text = "Downloading"; } else { SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.Status)].Text = "Moving"; } } else { SubItems["ETA"].Text = ""; SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemMessage)].Text = ""; SubItems[ObjectHelper.GetPropertyName <AddModTask>(x => x.ItemProgress)].Text = ""; } } }