diff options
19 files changed, 1019 insertions, 1005 deletions
diff --git a/win/CS/HandBrake.Interop/Model/HBConfiguration.cs b/win/CS/HandBrake.Interop/Model/HBConfiguration.cs index 2ec9f8302..06362dd14 100644 --- a/win/CS/HandBrake.Interop/Model/HBConfiguration.cs +++ b/win/CS/HandBrake.Interop/Model/HBConfiguration.cs @@ -9,11 +9,12 @@ namespace HandBrake.Interop.Model { - /// <summary> - /// HandBrakes configuration options - /// </summary> public class HBConfiguration { + public HBConfiguration() + { + } + /// <summary> /// Gets or sets a value indicating whether is dvd nav disabled. /// </summary> diff --git a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj index 53235d092..b81e5fce7 100644 --- a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj +++ b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj @@ -223,7 +223,7 @@ <Compile Include="Services\Presets\Factories\JsonPresetFactory.cs" />
<Compile Include="Services\Presets\Interfaces\IPresetObject.cs" />
<Compile Include="Services\Presets\Model\PresetDisplayCategory.cs" />
- <Compile Include="Services\Queue\Interfaces\IQueueProcessor.cs" />
+ <Compile Include="Services\Queue\Interfaces\IQueueService.cs" />
<Compile Include="Helpers\FileHelper.cs" />
<Compile Include="Services\Presets\Model\Preset.cs" />
<Compile Include="Model\ScanMode.cs" />
@@ -233,7 +233,7 @@ <Compile Include="Services\Presets\PresetService.cs" />
<Compile Include="Services\Queue\Model\QueueStats.cs" />
<Compile Include="Services\Queue\Model\QueueTaskContainer.cs" />
- <Compile Include="Services\Queue\QueueProcessor.cs" />
+ <Compile Include="Services\Queue\QueueService.cs" />
<Compile Include="Services\Queue\Model\QueueItemStatus.cs" />
<Compile Include="Services\Queue\Model\QueueTask.cs" />
<Compile Include="Services\Scan\EventArgs\ScanCompletedEventArgs.cs" />
diff --git a/win/CS/HandBrakeWPF/Helpers/QueueRecoveryHelper.cs b/win/CS/HandBrakeWPF/Helpers/QueueRecoveryHelper.cs index 2a7318814..072baafc7 100644 --- a/win/CS/HandBrakeWPF/Helpers/QueueRecoveryHelper.cs +++ b/win/CS/HandBrakeWPF/Helpers/QueueRecoveryHelper.cs @@ -16,7 +16,6 @@ namespace HandBrakeWPF.Helpers using System.Linq;
using System.Text.RegularExpressions;
using System.Windows;
- using System.Xml.Serialization;
using HandBrake.Interop.Utilities;
@@ -24,13 +23,14 @@ namespace HandBrakeWPF.Helpers using HandBrakeWPF.Services.Queue.Model;
using HandBrakeWPF.Utilities;
- using IQueueProcessor = HandBrakeWPF.Services.Queue.Interfaces.IQueueProcessor;
+ using Newtonsoft.Json;
+
+ using IQueueService = HandBrakeWPF.Services.Queue.Interfaces.IQueueService;
- /// <summary>
- /// Queue Recovery Helper
- /// </summary>
public class QueueRecoveryHelper
{
+ public static string QueueFileName = "hb_queue";
+
/// <summary>
/// Check if the queue recovery file contains records.
/// If it does, it means the last queue did not complete before HandBrake closed.
@@ -48,7 +48,7 @@ namespace HandBrakeWPF.Helpers {
string tempPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
DirectoryInfo info = new DirectoryInfo(tempPath);
- IEnumerable<FileInfo> foundFiles = info.GetFiles("*.xml").Where(f => f.Name.StartsWith("hb_queue_recovery"));
+ IEnumerable<FileInfo> foundFiles = info.GetFiles("*.json").Where(f => f.Name.StartsWith(QueueFileName));
var queueFiles = GetFilesExcludingActiveProcesses(foundFiles, filterQueueFiles);
if (!queueFiles.Any())
@@ -59,14 +59,14 @@ namespace HandBrakeWPF.Helpers List<string> removeFiles = new List<string>();
List<string> acceptedFiles = new List<string>();
- XmlSerializer ser = new XmlSerializer(typeof(List<QueueTask>));
+
foreach (string file in queueFiles)
{
try
{
- using (FileStream strm = new FileStream(file, FileMode.Open, FileAccess.Read))
+ using (StreamReader stream = new StreamReader(file))
{
- List<QueueTask> list = ser.Deserialize(strm) as List<QueueTask>;
+ List<QueueTask> list = list = JsonConvert.DeserializeObject<List<QueueTask>>(stream.ReadToEnd());
if (list != null && list.Count == 0)
{
removeFiles.Add(file);
@@ -115,10 +115,13 @@ namespace HandBrakeWPF.Helpers /// <param name="silentRecovery">
/// The silent Recovery.
/// </param>
+ /// <param name="queueFilter">
+ /// The queue Filter.
+ /// </param>
/// <returns>
/// The <see cref="bool"/>.
/// </returns>
- public static bool RecoverQueue(IQueueProcessor encodeQueue, IErrorService errorService, bool silentRecovery, List<string> queueFilter)
+ public static bool RecoverQueue(IQueueService encodeQueue, IErrorService errorService, bool silentRecovery, List<string> queueFilter)
{
string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
List<string> queueFiles = CheckQueueRecovery(queueFilter);
@@ -129,8 +132,8 @@ namespace HandBrakeWPF.Helpers {
result =
errorService.ShowMessageBox(
- "HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?",
- "Queue Recovery Possible",
+ Properties.Resources.Queue_RecoverQueueQuestionSingular,
+ Properties.Resources.Queue_RecoveryPossible,
MessageBoxButton.YesNo,
MessageBoxImage.Question);
}
@@ -138,8 +141,8 @@ namespace HandBrakeWPF.Helpers {
result =
errorService.ShowMessageBox(
- "HandBrake has detected multiple unfinished queue files. These will be from multiple instances of HandBrake running. Would you like to recover all unfinished jobs?",
- "Queue Recovery Possible",
+ Properties.Resources.Queue_RecoverQueueQuestionPlural,
+ Properties.Resources.Queue_RecoveryPossible,
MessageBoxButton.YesNo,
MessageBoxImage.Question);
}
@@ -173,7 +176,7 @@ namespace HandBrakeWPF.Helpers {
string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
DirectoryInfo info = new DirectoryInfo(appDataPath);
- IEnumerable<FileInfo> foundFiles = info.GetFiles("*.archive").Where(f => f.Name.StartsWith("hb_queue_recovery"));
+ IEnumerable<FileInfo> foundFiles = info.GetFiles("*.archive").Where(f => f.Name.StartsWith(QueueFileName));
return foundFiles.Any();
}
@@ -185,7 +188,7 @@ namespace HandBrakeWPF.Helpers // Remove any files where we have an active instnace.
foreach (FileInfo file in foundFiles)
{
- string fileProcessId = file.Name.Replace("hb_queue_recovery", string.Empty).Replace(".xml", string.Empty);
+ string fileProcessId = file.Name.Replace(QueueFileName, string.Empty).Replace(".json", string.Empty);
int processId;
if (!string.IsNullOrEmpty(fileProcessId) && int.TryParse(fileProcessId, out processId))
{
@@ -216,7 +219,7 @@ namespace HandBrakeWPF.Helpers // Cleanup old/unused queue files for now.
foreach (string file in removeFiles)
{
- Match m = Regex.Match(file, @"([0-9]+).xml");
+ Match m = Regex.Match(file, @"([0-9]+).json");
if (m.Success)
{
int processId = int.Parse(m.Groups[1].ToString());
@@ -249,13 +252,13 @@ namespace HandBrakeWPF.Helpers {
string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
DirectoryInfo info = new DirectoryInfo(appDataPath);
- IEnumerable<FileInfo> foundFiles = info.GetFiles("*.archive").Where(f => f.Name.StartsWith("hb_queue_recovery"));
+ IEnumerable<FileInfo> foundFiles = info.GetFiles("*.archive").Where(f => f.Name.StartsWith(QueueFileName));
- DateTime LastWeek = DateTime.Now.AddDays(-7);
+ DateTime lastWeek = DateTime.Now.AddDays(-7);
foreach (FileInfo file in foundFiles)
{
- if (file.CreationTime < LastWeek)
+ if (file.CreationTime < lastWeek)
{
string fullPath = Path.Combine(appDataPath, file.Name);
File.Delete(fullPath);
@@ -267,7 +270,7 @@ namespace HandBrakeWPF.Helpers {
string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
DirectoryInfo info = new DirectoryInfo(appDataPath);
- IEnumerable<FileInfo> foundFiles = info.GetFiles("*.archive").Where(f => f.Name.StartsWith("hb_queue_recovery"));
+ IEnumerable<FileInfo> foundFiles = info.GetFiles("*.archive").Where(f => f.Name.StartsWith(QueueFileName));
foreach (FileInfo file in foundFiles)
{
string fullPath = Path.Combine(appDataPath, file.Name);
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs index 3e04f632c..a3583ef4a 100644 --- a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs +++ b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs @@ -3814,6 +3814,33 @@ namespace HandBrakeWPF.Properties { } /// <summary> + /// Looks up a localized string similar to HandBrake has detected multiple unfinished queue files. These will be from multiple instances of HandBrake running. Would you like to recover all unfinished jobs?. + /// </summary> + public static string Queue_RecoverQueueQuestionPlural { + get { + return ResourceManager.GetString("Queue_RecoverQueueQuestionPlural", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?. + /// </summary> + public static string Queue_RecoverQueueQuestionSingular { + get { + return ResourceManager.GetString("Queue_RecoverQueueQuestionSingular", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to Queue Recovery Possible. + /// </summary> + public static string Queue_RecoveryPossible { + get { + return ResourceManager.GetString("Queue_RecoveryPossible", resourceCulture); + } + } + + /// <summary> /// Looks up a localized string similar to Unable to reset job status as it is not in an Error or Completed state. /// </summary> public static string Queue_UnableToResetJob { diff --git a/win/CS/HandBrakeWPF/Properties/Resources.resx b/win/CS/HandBrakeWPF/Properties/Resources.resx index 3f2b0a0b8..66a4cf97f 100644 --- a/win/CS/HandBrakeWPF/Properties/Resources.resx +++ b/win/CS/HandBrakeWPF/Properties/Resources.resx @@ -1987,4 +1987,13 @@ Non-Live Options: {date} {time} {creation-date} {creation-time} {quality} {bitra <data name="OptionsView_ChoiceOfEncoderHint" xml:space="preserve">
<value>Choice of encoder will be made available on the 'Video' tab.</value>
</data>
+ <data name="Queue_RecoverQueueQuestionPlural" xml:space="preserve">
+ <value>HandBrake has detected multiple unfinished queue files. These will be from multiple instances of HandBrake running. Would you like to recover all unfinished jobs?</value>
+ </data>
+ <data name="Queue_RecoverQueueQuestionSingular" xml:space="preserve">
+ <value>HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?</value>
+ </data>
+ <data name="Queue_RecoveryPossible" xml:space="preserve">
+ <value>Queue Recovery Possible</value>
+ </data>
</root>
\ No newline at end of file diff --git a/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs b/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs index 5272810cd..a61cd0bf0 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/Model/EncodeTask.cs @@ -18,6 +18,8 @@ namespace HandBrakeWPF.Services.Encode.Model using HandBrakeWPF.Model.Filters; using HandBrakeWPF.Services.Encode.Model.Models; + using Newtonsoft.Json; + using AllowedPassthru = Models.AllowedPassthru; using AudioTrack = Models.AudioTrack; using ChapterMarker = Models.ChapterMarker; diff --git a/win/CS/HandBrakeWPF/Services/Encode/Model/Models/AudioTrack.cs b/win/CS/HandBrakeWPF/Services/Encode/Model/Models/AudioTrack.cs index cda397929..bab9d242a 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/Model/Models/AudioTrack.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/Model/Models/AudioTrack.cs @@ -27,9 +27,7 @@ namespace HandBrakeWPF.Services.Encode.Model.Models using Newtonsoft.Json; - /// <summary> - /// Model of a HandBrake Audio Track and it's associated behaviours. - /// </summary> + [JsonObject(MemberSerialization.OptOut)] public class AudioTrack : PropertyChangedBase { private int bitrate; diff --git a/win/CS/HandBrakeWPF/Services/Encode/Model/Models/ChapterMarker.cs b/win/CS/HandBrakeWPF/Services/Encode/Model/Models/ChapterMarker.cs index c699ec39c..4e4e84e0e 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/Model/Models/ChapterMarker.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/Model/Models/ChapterMarker.cs @@ -13,9 +13,9 @@ namespace HandBrakeWPF.Services.Encode.Model.Models using Caliburn.Micro; - /// <summary> - /// A Movie Chapter - /// </summary> + using Newtonsoft.Json; + + [JsonObject(MemberSerialization.OptOut)] public class ChapterMarker : PropertyChangedBase { /// <summary> diff --git a/win/CS/HandBrakeWPF/Services/Encode/Model/Models/SubtitleTrack.cs b/win/CS/HandBrakeWPF/Services/Encode/Model/Models/SubtitleTrack.cs index 3eef3bc4f..79ea7a8b6 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/Model/Models/SubtitleTrack.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/Model/Models/SubtitleTrack.cs @@ -17,9 +17,9 @@ namespace HandBrakeWPF.Services.Encode.Model.Models using HandBrakeWPF.Services.Scan.Model; - /// <summary> - /// Subtitle Information - /// </summary> + using Newtonsoft.Json; + + [JsonObject(MemberSerialization.OptOut)] public class SubtitleTrack : PropertyChangedBase { #region Constants and Fields diff --git a/win/CS/HandBrakeWPF/Services/PrePostActionService.cs b/win/CS/HandBrakeWPF/Services/PrePostActionService.cs index 4cbd4c82a..20a6c39a8 100644 --- a/win/CS/HandBrakeWPF/Services/PrePostActionService.cs +++ b/win/CS/HandBrakeWPF/Services/PrePostActionService.cs @@ -36,7 +36,7 @@ namespace HandBrakeWPF.Services /// </summary>
public class PrePostActionService : IPrePostActionService
{
- private readonly IQueueProcessor queueProcessor;
+ private readonly IQueueService queueProcessor;
private readonly IUserSettingService userSettingService;
private readonly IWindowManager windowManager;
private readonly IScan scanService;
@@ -53,7 +53,7 @@ namespace HandBrakeWPF.Services /// <param name="windowManager">
/// The window Manager.
/// </param>
- public PrePostActionService(IQueueProcessor queueProcessor, IUserSettingService userSettingService, IWindowManager windowManager, IScan scanService)
+ public PrePostActionService(IQueueService queueProcessor, IUserSettingService userSettingService, IWindowManager windowManager, IScan scanService)
{
this.queueProcessor = queueProcessor;
this.userSettingService = userSettingService;
diff --git a/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueProcessor.cs b/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs index 90723c7a8..add20a27d 100644 --- a/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueProcessor.cs +++ b/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs @@ -1,217 +1,217 @@ -// --------------------------------------------------------------------------------------------------------------------
-// <copyright file="IQueueProcessor.cs" company="HandBrake Project (http://handbrake.fr)">
-// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
-// </copyright>
-// <summary>
-// The Queue Processor
-// </summary>
-// --------------------------------------------------------------------------------------------------------------------
-
-namespace HandBrakeWPF.Services.Queue.Interfaces
-{
- using System;
- using System.Collections.ObjectModel;
- using System.ComponentModel;
-
- using HandBrakeWPF.Services.Queue.Model;
-
- using IEncode = Encode.Interfaces.IEncode;
-
- /// <summary>
- /// The Queue Processor
- /// </summary>
- public interface IQueueProcessor
- {
- #region Events
-
- /// <summary>
- /// Fires when the Queue has started
- /// </summary>
- event QueueProcessor.QueueProgressStatus JobProcessingStarted;
-
- /// <summary>
- /// Fires when a job is Added, Removed or Re-Ordered.
- /// Should be used for triggering an update of the Queue Window.
- /// </summary>
- event EventHandler QueueChanged;
-
- /// <summary>
- /// Fires when the entire encode queue has completed.
- /// </summary>
- event QueueProcessor.QueueCompletedEventDelegate QueueCompleted;
-
- /// <summary>
- /// Fires when a pause to the encode queue has been requested.
- /// </summary>
- event EventHandler QueuePaused;
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Gets the number of jobs in the queue
- /// </summary>
- int Count { get; }
-
- /// <summary>
- /// Gets the number of errors detected in the queue.
- /// </summary>
- int ErrorCount { get; }
-
- /// <summary>
- /// Gets the IEncodeService instance.
- /// </summary>
- IEncode EncodeService { get; }
-
- /// <summary>
- /// Gets a value indicating whether IsProcessing.
- /// </summary>
- bool IsProcessing { get; }
-
- /// <summary>
- /// Gets or sets Last Processed Job.
- /// This is set when the job is poped of the queue by GetNextJobForProcessing();
- /// </summary>
- QueueTask LastProcessedJob { get; set; }
-
- /// <summary>
- /// Gets The current queue.
- /// </summary>
- ObservableCollection<QueueTask> Queue { get; }
-
- #endregion
-
- #region Public Methods
-
- /// <summary>
- /// Add a job to the Queue.
- /// This method is Thread Safe.
- /// </summary>
- /// <param name="job">
- /// The encode Job object.
- /// </param>
- void Add(QueueTask job);
-
- /// <summary>
- /// Backup any changes to the queue file
- /// </summary>
- /// <param name="exportPath">
- /// If this is not null or empty, this will be used instead of the standard backup location.
- /// </param>
- void BackupQueue(string exportPath);
-
- /// <summary>
- /// Export the Queue the standardised JSON format.
- /// </summary>
- /// <param name="exportPath">
- /// The export path.
- /// </param>
- void ExportJson(string exportPath);
-
- /// <summary>
- /// Restore a JSON queue file.
- /// </summary>
- /// <param name="path">
- /// Path to the file the user wishes to import.
- /// </param>
- void ImportJson(string path);
-
- /// <summary>
- /// Checks the current queue for an existing instance of the specified destination.
- /// </summary>
- /// <param name="destination">
- /// The destination of the encode.
- /// </param>
- /// <returns>
- /// Whether or not the supplied destination is already in the queue.
- /// </returns>
- bool CheckForDestinationPathDuplicates(string destination);
-
- /// <summary>
- /// Clear down all Queue Items
- /// </summary>
- void Clear();
-
- /// <summary>
- /// Clear down the Queue�s completed items
- /// </summary>
- void ClearCompleted();
-
- /// <summary>
- /// Get the first job on the queue for processing.
- /// This also removes the job from the Queue and sets the LastProcessedJob
- /// </summary>
- /// <returns>
- /// An encode Job object.
- /// </returns>
- QueueTask GetNextJobForProcessing();
-
- /// <summary>
- /// Moves an item down one position in the queue.
- /// </summary>
- /// <param name="index">
- /// The zero-based location of the job in the queue.
- /// </param>
- void MoveDown(int index);
-
- /// <summary>
- /// Moves an item up one position in the queue.
- /// </summary>
- /// <param name="index">
- /// The zero-based location of the job in the queue.
- /// </param>
- void MoveUp(int index);
-
- /// <summary>
- /// Remove a job from the Queue.
- /// This method is Thread Safe
- /// </summary>
- /// <param name="job">
- /// The job.
- /// </param>
- void Remove(QueueTask job);
-
- /// <summary>
- /// Reset a Queued Item from Error or Completed to Waiting
- /// </summary>
- /// <param name="job">
- /// The job.
- /// </param>
- void ResetJobStatusToWaiting(QueueTask job);
-
- /// <summary>
- /// Restore a Queue from file or from the queue backup file.
- /// </summary>
- /// <param name="importPath">
- /// The import path. String.Empty or null will result in the default file being loaded.
- /// </param>
- void RestoreQueue(string importPath);
-
- /// <summary>
- /// Starts encoding the first job in the queue and continues encoding until all jobs
- /// have been encoded.
- /// </summary>
- /// <param name="clearCompleted">
- /// The clear Completed.
- /// </param>
- void Start(bool clearCompleted);
-
- /// <summary>
- /// Stop the current encode and pause the queue.
- /// </summary>
- void Stop();
-
- /// <summary>
- /// Pause the queue but allow the current encode to complete.
- /// </summary>
- void Pause();
-
- /// <summary>
- /// Pause and Encode and the Queue.
- /// </summary>
- void PauseEncode();
-
- #endregion
- }
+// -------------------------------------------------------------------------------------------------------------------- +// <copyright file="IQueueService.cs" company="HandBrake Project (http://handbrake.fr)"> +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// </copyright> +// <summary> +// The Queue Processor +// </summary> +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.Services.Queue.Interfaces +{ + using System; + using System.Collections.ObjectModel; + using System.ComponentModel; + + using HandBrakeWPF.Services.Queue.Model; + + using IEncode = Encode.Interfaces.IEncode; + + /// <summary> + /// The Queue Processor + /// </summary> + public interface IQueueService + { + #region Events + + /// <summary> + /// Fires when the Queue has started + /// </summary> + event QueueService.QueueProgressStatus JobProcessingStarted; + + /// <summary> + /// Fires when a job is Added, Removed or Re-Ordered. + /// Should be used for triggering an update of the Queue Window. + /// </summary> + event EventHandler QueueChanged; + + /// <summary> + /// Fires when the entire encode queue has completed. + /// </summary> + event QueueService.QueueCompletedEventDelegate QueueCompleted; + + /// <summary> + /// Fires when a pause to the encode queue has been requested. + /// </summary> + event EventHandler QueuePaused; + + #endregion + + #region Properties + + /// <summary> + /// Gets the number of jobs in the queue + /// </summary> + int Count { get; } + + /// <summary> + /// Gets the number of errors detected in the queue. + /// </summary> + int ErrorCount { get; } + + /// <summary> + /// Gets the IEncodeService instance. + /// </summary> + IEncode EncodeService { get; } + + /// <summary> + /// Gets a value indicating whether IsProcessing. + /// </summary> + bool IsProcessing { get; } + + /// <summary> + /// Gets or sets Last Processed Job. + /// This is set when the job is poped of the queue by GetNextJobForProcessing(); + /// </summary> + QueueTask LastProcessedJob { get; set; } + + /// <summary> + /// Gets The current queue. + /// </summary> + ObservableCollection<QueueTask> Queue { get; } + + #endregion + + #region Public Methods + + /// <summary> + /// Add a job to the Queue. + /// This method is Thread Safe. + /// </summary> + /// <param name="job"> + /// The encode Job object. + /// </param> + void Add(QueueTask job); + + /// <summary> + /// Backup any changes to the queue file + /// </summary> + /// <param name="exportPath"> + /// If this is not null or empty, this will be used instead of the standard backup location. + /// </param> + void BackupQueue(string exportPath); + + /// <summary> + /// Export the Queue the standardised JSON format. + /// </summary> + /// <param name="exportPath"> + /// The export path. + /// </param> + void ExportJson(string exportPath); + + /// <summary> + /// Restore a JSON queue file. + /// </summary> + /// <param name="path"> + /// Path to the file the user wishes to import. + /// </param> + void ImportJson(string path); + + /// <summary> + /// Checks the current queue for an existing instance of the specified destination. + /// </summary> + /// <param name="destination"> + /// The destination of the encode. + /// </param> + /// <returns> + /// Whether or not the supplied destination is already in the queue. + /// </returns> + bool CheckForDestinationPathDuplicates(string destination); + + /// <summary> + /// Clear down all Queue Items + /// </summary> + void Clear(); + + /// <summary> + /// Clear down the Queue�s completed items + /// </summary> + void ClearCompleted(); + + /// <summary> + /// Get the first job on the queue for processing. + /// This also removes the job from the Queue and sets the LastProcessedJob + /// </summary> + /// <returns> + /// An encode Job object. + /// </returns> + QueueTask GetNextJobForProcessing(); + + /// <summary> + /// Moves an item down one position in the queue. + /// </summary> + /// <param name="index"> + /// The zero-based location of the job in the queue. + /// </param> + void MoveDown(int index); + + /// <summary> + /// Moves an item up one position in the queue. + /// </summary> + /// <param name="index"> + /// The zero-based location of the job in the queue. + /// </param> + void MoveUp(int index); + + /// <summary> + /// Remove a job from the Queue. + /// This method is Thread Safe + /// </summary> + /// <param name="job"> + /// The job. + /// </param> + void Remove(QueueTask job); + + /// <summary> + /// Reset a Queued Item from Error or Completed to Waiting + /// </summary> + /// <param name="job"> + /// The job. + /// </param> + void ResetJobStatusToWaiting(QueueTask job); + + /// <summary> + /// Restore a Queue from file or from the queue backup file. + /// </summary> + /// <param name="importPath"> + /// The import path. String.Empty or null will result in the default file being loaded. + /// </param> + void RestoreQueue(string importPath); + + /// <summary> + /// Starts encoding the first job in the queue and continues encoding until all jobs + /// have been encoded. + /// </summary> + /// <param name="clearCompleted"> + /// The clear Completed. + /// </param> + void Start(bool clearCompleted); + + /// <summary> + /// Stop the current encode and pause the queue. + /// </summary> + void Stop(); + + /// <summary> + /// Pause the queue but allow the current encode to complete. + /// </summary> + void Pause(); + + /// <summary> + /// Pause and Encode and the Queue. + /// </summary> + void PauseEncode(); + + #endregion + } }
\ No newline at end of file diff --git a/win/CS/HandBrakeWPF/Services/Queue/Model/QueueStats.cs b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueStats.cs index 77454c4ad..3378bd6aa 100644 --- a/win/CS/HandBrakeWPF/Services/Queue/Model/QueueStats.cs +++ b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueStats.cs @@ -13,6 +13,9 @@ namespace HandBrakeWPF.Services.Queue.Model using Caliburn.Micro; + using Newtonsoft.Json; + + [JsonObject(MemberSerialization.OptOut)] public class QueueStats : PropertyChangedBase { private DateTime startTime; diff --git a/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs index 77c9b66ad..f3d7bb6e4 100644 --- a/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs +++ b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs @@ -18,22 +18,17 @@ namespace HandBrakeWPF.Services.Queue.Model using HandBrakeWPF.Services.Presets.Model;
using HandBrakeWPF.Utilities;
+ using Newtonsoft.Json;
+
using EncodeTask = HandBrakeWPF.Services.Encode.Model.EncodeTask;
- /// <summary>
- /// The QueueTask.
- /// </summary>
+
public class QueueTask : PropertyChangedBase
{
private static int id;
private QueueItemStatus status;
private string presetKey;
- #region Properties
-
- /// <summary>
- /// Initializes a new instance of the <see cref="QueueTask"/> class.
- /// </summary>
public QueueTask()
{
this.Status = QueueItemStatus.Waiting;
@@ -42,21 +37,6 @@ namespace HandBrakeWPF.Services.Queue.Model this.Statistics = new QueueStats();
}
- /// <summary>
- /// Initializes a new instance of the <see cref="QueueTask"/> class.
- /// </summary>
- /// <param name="task">
- /// The task.
- /// </param>
- /// <param name="configuration">
- /// The configuration.
- /// </param>
- /// <param name="scannedSourcePath">
- /// The scanned Source Path.
- /// </param>
- /// <param name="currentPreset">
- /// The currently active preset.
- /// </param>
public QueueTask(EncodeTask task, HBConfiguration configuration, string scannedSourcePath, Preset currentPreset)
{
this.Task = task;
@@ -74,16 +54,13 @@ namespace HandBrakeWPF.Services.Queue.Model this.Statistics = new QueueStats();
}
+ [JsonIgnore]
public string Id { get; }
- /// <summary>
- /// Gets or sets ScannedSource.
- /// </summary>
+ [JsonProperty]
public string ScannedSourcePath { get; set; }
- /// <summary>
- /// Gets or sets Status.
- /// </summary>
+ [JsonProperty]
public QueueItemStatus Status
{
get
@@ -99,18 +76,16 @@ namespace HandBrakeWPF.Services.Queue.Model }
}
- /// <summary>
- /// Gets or sets the task.
- /// </summary>
+ [JsonProperty]
public EncodeTask Task { get; set; }
- /// <summary>
- /// Gets or sets the configuration.
- /// </summary>
+ [JsonProperty]
public HBConfiguration Configuration { get; set; }
+ [JsonProperty]
public QueueStats Statistics { get; set; }
+ [JsonIgnore]
public string SelectedPresetKey
{
get
@@ -119,15 +94,9 @@ namespace HandBrakeWPF.Services.Queue.Model }
}
+ [JsonIgnore]
public bool ShowEncodeProgress => this.Status == QueueItemStatus.InProgress && SystemInfo.IsWindows10();
- #endregion
-
- protected bool Equals(QueueTask other)
- {
- return this.Id == other.Id;
- }
-
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
@@ -145,5 +114,10 @@ namespace HandBrakeWPF.Services.Queue.Model {
return string.Format("Encode Task. Title: {0}, Source: {1}, Destination: {2}", this.Task.Title, this.Task.Source, this.Task.Destination);
}
+
+ protected bool Equals(QueueTask other)
+ {
+ return this.Id == other.Id;
+ }
}
}
\ No newline at end of file diff --git a/win/CS/HandBrakeWPF/Services/Queue/QueueProcessor.cs b/win/CS/HandBrakeWPF/Services/Queue/QueueService.cs index ec0867f2a..0a9c6e8e9 100644 --- a/win/CS/HandBrakeWPF/Services/Queue/QueueProcessor.cs +++ b/win/CS/HandBrakeWPF/Services/Queue/QueueService.cs @@ -1,702 +1,699 @@ -// --------------------------------------------------------------------------------------------------------------------
-// <copyright file="QueueProcessor.cs" company="HandBrake Project (http://handbrake.fr)">
-// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
-// </copyright>
-// <summary>
-// The HandBrake Queue
-// </summary>
-// --------------------------------------------------------------------------------------------------------------------
-
-namespace HandBrakeWPF.Services.Queue
-{
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.ComponentModel;
- using System.IO;
- using System.Linq;
- using System.Xml.Serialization;
-
- using HandBrake.Interop.Interop.Json.Queue;
- using HandBrake.Interop.Model;
- using HandBrake.Interop.Utilities;
-
- using HandBrakeWPF.Factories;
- using HandBrakeWPF.Properties;
- using HandBrakeWPF.Services.Encode.Factories;
- using HandBrakeWPF.Services.Encode.Model;
- using HandBrakeWPF.Services.Interfaces;
- using HandBrakeWPF.Services.Queue.Model;
- using HandBrakeWPF.Utilities;
-
- using EncodeCompletedEventArgs = HandBrakeWPF.Services.Encode.EventArgs.EncodeCompletedEventArgs;
- using Execute = Caliburn.Micro.Execute;
- using GeneralApplicationException = HandBrakeWPF.Exceptions.GeneralApplicationException;
- using IEncode = HandBrakeWPF.Services.Encode.Interfaces.IEncode;
- using LogLevel = HandBrakeWPF.Services.Logging.Model.LogLevel;
- using LogMessageType = HandBrakeWPF.Services.Logging.Model.LogMessageType;
- using LogService = HandBrakeWPF.Services.Logging.LogService;
- using QueueCompletedEventArgs = HandBrakeWPF.EventArgs.QueueCompletedEventArgs;
- using QueueProgressEventArgs = HandBrakeWPF.EventArgs.QueueProgressEventArgs;
-
- /// <summary>
- /// The HandBrake Queue
- /// </summary>
- public class QueueProcessor : Interfaces.IQueueProcessor
- {
- #region Constants and Fields
- private static readonly object QueueLock = new object();
- private readonly IUserSettingService userSettingService;
- private readonly ObservableCollection<QueueTask> queue = new ObservableCollection<QueueTask>();
- private readonly string queueFile;
- private bool clearCompleted;
-
- #endregion
-
- #region Constructors and Destructors
-
- /// <summary>
- /// Initializes a new instance of the <see cref="QueueProcessor"/> class.
- /// </summary>
- /// <param name="encodeService">
- /// The encode Service.
- /// </param>
- /// <param name="userSettingService">
- /// The user settings service.
- /// </param>
- /// <param name="errorService">
- /// The Error Service.
- /// </param>
- /// <exception cref="ArgumentNullException">
- /// Services are not setup
- /// </exception>
- public QueueProcessor(IEncode encodeService, IUserSettingService userSettingService)
- {
- this.userSettingService = userSettingService;
- this.EncodeService = encodeService;
-
- // If this is the first instance, just use the main queue file, otherwise add the instance id to the filename.
- this.queueFile = string.Format("hb_queue_recovery{0}.xml", GeneralUtilities.ProcessId);
- }
-
- #endregion
-
- #region Delegates
-
- /// <summary>
- /// Queue Progress Status
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The QueueProgressEventArgs.
- /// </param>
- public delegate void QueueProgressStatus(object sender, QueueProgressEventArgs e);
-
- /// <summary>
- /// The queue completed.
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The e.
- /// </param>
- public delegate void QueueCompletedEventDelegate(object sender, QueueCompletedEventArgs e);
-
- #endregion
-
- #region Events
-
- /// <summary>
- /// Fires when the Queue has started
- /// </summary>
- public event QueueProgressStatus JobProcessingStarted;
-
- /// <summary>
- /// Fires when a job is Added, Removed or Re-Ordered.
- /// Should be used for triggering an update of the Queue Window.
- /// </summary>
- public event EventHandler QueueChanged;
-
- /// <summary>
- /// Fires when the entire encode queue has completed.
- /// </summary>
- public event QueueCompletedEventDelegate QueueCompleted;
-
- /// <summary>
- /// Fires when a pause to the encode queue has been requested.
- /// </summary>
- public event EventHandler QueuePaused;
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Gets the number of jobs in the queue;
- /// </summary>
- public int Count
- {
- get
- {
- return this.queue.Count(item => item.Status == QueueItemStatus.Waiting);
- }
- }
-
- /// <summary>
- /// The number of errors detected.
- /// </summary>
- public int ErrorCount
- {
- get
- {
- return this.queue.Count(item => item.Status == QueueItemStatus.Error);
- }
- }
-
- /// <summary>
- /// Gets the IEncodeService instance.
- /// </summary>
- public IEncode EncodeService { get; private set; }
-
- /// <summary>
- /// Gets a value indicating whether IsProcessing.
- /// </summary>
- public bool IsProcessing { get; private set; }
-
- /// <summary>
- /// Gets or sets Last Processed Job.
- /// This is set when the job is poped of the queue by GetNextJobForProcessing();
- /// </summary>
- public QueueTask LastProcessedJob { get; set; }
-
- /// <summary>
- /// Gets The current queue.
- /// </summary>
- public ObservableCollection<QueueTask> Queue
- {
- get
- {
- return this.queue;
- }
- }
-
- #endregion
-
- #region Public Methods
-
- /// <summary>
- /// Add a job to the Queue.
- /// This method is Thread Safe.
- /// </summary>
- /// <param name="job">
- /// The encode Job object.
- /// </param>
- public void Add(QueueTask job)
- {
- lock (QueueLock)
- {
- this.queue.Add(job);
- this.InvokeQueueChanged(EventArgs.Empty);
- }
- }
-
- /// <summary>
- /// Backup any changes to the queue file
- /// </summary>
- /// <param name="exportPath">
- /// If this is not null or empty, this will be used instead of the standard backup location.
- /// </param>
- public void BackupQueue(string exportPath)
- {
- string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
- string tempPath = !string.IsNullOrEmpty(exportPath)
- ? exportPath
- : Path.Combine(appDataPath, string.Format(this.queueFile, string.Empty));
-
- using (var strm = new FileStream(tempPath, FileMode.Create, FileAccess.Write))
- {
- List<QueueTask> tasks = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
- var serializer = new XmlSerializer(typeof(List<QueueTask>));
- serializer.Serialize(strm, tasks);
- strm.Close();
- strm.Dispose();
- }
- }
-
- public void ExportJson(string exportPath)
- {
- List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
- List<EncodeTask> workUnits = jobs.Select(job => job.Task).ToList();
- HBConfiguration config = HBConfigurationFactory.Create(); // Default to current settings for now. These will hopefully go away in the future.
-
- string json = QueueFactory.GetQueueJson(workUnits, config);
-
- using (var strm = new StreamWriter(exportPath, false))
- {
- strm.Write(json);
- strm.Close();
- strm.Dispose();
- }
- }
-
- public void ImportJson(string path)
- {
- List<Task> tasks;
- using (StreamReader reader = new StreamReader(path))
- {
- string fileContent = reader.ReadToEnd();
- tasks = QueueFactory.GetQueue(fileContent);
-
- if (tasks != null)
- {
- foreach (Task task in tasks)
- {
- // TODO flesh out.
- EncodeTask encodeTask = EncodeTaskImportFactory.Create(task.Job);
- QueueTask queueTask = new QueueTask();
- queueTask.Task = encodeTask;
-
- this.queue.Add(queueTask);
- }
- }
- }
- }
-
- /// <summary>
- /// Checks the current queue for an existing instance of the specified destination.
- /// </summary>
- /// <param name="destination">
- /// The destination of the encode.
- /// </param>
- /// <returns>
- /// Whether or not the supplied destination is already in the queue.
- /// </returns>
- public bool CheckForDestinationPathDuplicates(string destination)
- {
- foreach (QueueTask job in this.queue)
- {
- if (string.Equals(
- job.Task.Destination,
- destination.Replace("\\\\", "\\"),
- StringComparison.OrdinalIgnoreCase) && (job.Status == QueueItemStatus.Waiting || job.Status == QueueItemStatus.InProgress))
- {
- return true;
- }
- }
-
- return false;
- }
-
- /// <summary>
- /// Clear down all Queue Items
- /// </summary>
- public void Clear()
- {
- List<QueueTask> deleteList = this.queue.ToList();
- foreach (QueueTask item in deleteList)
- {
- this.queue.Remove(item);
- }
- this.InvokeQueueChanged(EventArgs.Empty);
- }
-
- /// <summary>
- /// Clear down the Queue´s completed items
- /// </summary>
- public void ClearCompleted()
- {
- Execute.OnUIThread(
- () =>
- {
- List<QueueTask> deleteList =
- this.queue.Where(task => task.Status == QueueItemStatus.Completed).ToList();
- foreach (QueueTask item in deleteList)
- {
- this.queue.Remove(item);
- }
- this.InvokeQueueChanged(EventArgs.Empty);
- });
- }
-
- /// <summary>
- /// Get the first job on the queue for processing.
- /// This also removes the job from the Queue and sets the LastProcessedJob
- /// </summary>
- /// <returns>
- /// An encode Job object.
- /// </returns>
- public QueueTask GetNextJobForProcessing()
- {
- if (this.queue.Count > 0)
- {
- return this.queue.FirstOrDefault(q => q.Status == QueueItemStatus.Waiting);
- }
-
- return null;
- }
-
- /// <summary>
- /// Moves an item down one position in the queue.
- /// </summary>
- /// <param name="index">
- /// The zero-based location of the job in the queue.
- /// </param>
- public void MoveDown(int index)
- {
- if (index < this.queue.Count - 1)
- {
- QueueTask item = this.queue[index];
-
- this.queue.RemoveAt(index);
- this.queue.Insert((index + 1), item);
- }
-
- this.InvokeQueueChanged(EventArgs.Empty);
- }
-
- /// <summary>
- /// Moves an item up one position in the queue.
- /// </summary>
- /// <param name="index">
- /// The zero-based location of the job in the queue.
- /// </param>
- public void MoveUp(int index)
- {
- if (index > 0)
- {
- QueueTask item = this.queue[index];
-
- this.queue.RemoveAt(index);
- this.queue.Insert((index - 1), item);
- }
-
- this.InvokeQueueChanged(EventArgs.Empty);
- }
-
- /// <summary>
- /// Remove a job from the Queue.
- /// This method is Thread Safe
- /// </summary>
- /// <param name="job">
- /// The job.
- /// </param>
- public void Remove(QueueTask job)
- {
- lock (QueueLock)
- {
- this.queue.Remove(job);
- this.InvokeQueueChanged(EventArgs.Empty);
- }
- }
-
- /// <summary>
- /// Reset a Queued Item from Error or Completed to Waiting
- /// </summary>
- /// <param name="job">
- /// The job.
- /// </param>
- public void ResetJobStatusToWaiting(QueueTask job)
- {
- if (job.Status != QueueItemStatus.Error && job.Status != QueueItemStatus.Completed)
- {
- throw new GeneralApplicationException(
- Resources.Error, Resources.Queue_UnableToResetJob, null);
- }
-
- job.Status = QueueItemStatus.Waiting;
- }
-
- /// <summary>
- /// Restore a Queue from file or from the queue backup file.
- /// </summary>
- /// <param name="importPath">
- /// The import path. String.Empty or null will result in the default file being loaded.
- /// </param>
- public void RestoreQueue(string importPath)
- {
- string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
- string tempPath = !string.IsNullOrEmpty(importPath)
- ? importPath
- : (appDataPath + string.Format(this.queueFile, string.Empty));
-
- if (File.Exists(tempPath))
- {
- bool invokeUpdate = false;
- using (
- var strm = new FileStream(
- (!string.IsNullOrEmpty(importPath) ? importPath : tempPath), FileMode.Open, FileAccess.Read))
- {
- if (strm.Length != 0)
- {
- var serializer = new XmlSerializer(typeof(List<QueueTask>));
-
- List<QueueTask> list;
-
- try
- {
- list = serializer.Deserialize(strm) as List<QueueTask>;
- }
- catch (Exception exc)
- {
- throw new GeneralApplicationException(Resources.Queue_UnableToRestoreFile, Resources.Queue_UnableToRestoreFileExtended, exc);
- }
-
- if (list != null)
- {
- foreach (QueueTask item in list)
- {
- if (item.Status != QueueItemStatus.Completed)
- {
- // Reset InProgress/Error to Waiting so it can be processed
- if (item.Status == QueueItemStatus.InProgress)
- {
- item.Status = QueueItemStatus.Error;
- }
-
- this.queue.Add(item);
- }
- }
- }
-
- invokeUpdate = true;
- }
- }
-
- if (invokeUpdate)
- {
- this.InvokeQueueChanged(EventArgs.Empty);
- }
- }
- }
-
- /// <summary>
- /// Requests a pause of the encode queue.
- /// </summary>
- public void Pause()
- {
- this.IsProcessing = false;
- this.InvokeQueuePaused(EventArgs.Empty);
- }
-
- public void PauseEncode()
- {
- if (this.EncodeService.IsEncoding && !this.EncodeService.IsPasued)
- {
- this.EncodeService.Pause();
- this.LastProcessedJob.Statistics.SetPaused(true);
- }
-
- this.Pause();
- }
-
- /// <summary>
- /// Starts encoding the first job in the queue and continues encoding until all jobs
- /// have been encoded.
- /// </summary>
- /// <param name="isClearCompleted">
- /// The is Clear Completed.
- /// </param>
- public void Start(bool isClearCompleted)
- {
- if (this.IsProcessing)
- {
- return;
- }
-
- this.clearCompleted = isClearCompleted;
-
- this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted;
- this.EncodeService.EncodeCompleted += this.EncodeServiceEncodeCompleted;
-
- if (this.EncodeService.IsPasued)
- {
- this.EncodeService.Resume();
- this.IsProcessing = true;
- this.InvokeJobProcessingStarted(new QueueProgressEventArgs(this.LastProcessedJob));
- this.LastProcessedJob.Statistics.SetPaused(false);
- }
-
- if (!this.EncodeService.IsEncoding)
- {
- this.ProcessNextJob();
- }
- }
-
- public void Stop()
- {
- if (this.EncodeService.IsEncoding)
- {
- this.EncodeService.Stop();
- }
- this.IsProcessing = false;
- this.InvokeQueuePaused(EventArgs.Empty);
- }
-
- #endregion
-
- #region Methods
-
- /// <summary>
- /// The on queue completed.
- /// </summary>
- /// <param name="e">
- /// The e.
- /// </param>
- protected virtual void OnQueueCompleted(QueueCompletedEventArgs e)
- {
- QueueCompletedEventDelegate handler = this.QueueCompleted;
- if (handler != null)
- {
- handler(this, e);
- }
-
- this.IsProcessing = false;
- }
-
- /// <summary>
- /// After an encode is complete, move onto the next job.
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The EncodeCompletedEventArgs.
- /// </param>
- private void EncodeServiceEncodeCompleted(object sender, EncodeCompletedEventArgs e)
- {
- this.LastProcessedJob.Status = QueueItemStatus.Completed;
- this.LastProcessedJob.Statistics.EndTime = DateTime.Now;
- this.LastProcessedJob.Statistics.CompletedActivityLogPath = e.ActivityLogPath;
- this.LastProcessedJob.Statistics.FinalFileSize = e.FinalFilesizeInBytes;
-
- // Clear the completed item of the queue if the setting is set.
- if (this.clearCompleted)
- {
- this.ClearCompleted();
- }
-
- if (!e.Successful)
- {
- this.LastProcessedJob.Status = QueueItemStatus.Error;
- }
-
- // Move onto the next job.
- if (this.IsProcessing)
- {
- this.ProcessNextJob();
- }
- else
- {
- this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted;
- this.BackupQueue(string.Empty);
- this.OnQueueCompleted(new QueueCompletedEventArgs(true));
- }
- }
-
- /// <summary>
- /// Invoke the JobProcessingStarted event
- /// </summary>
- /// <param name="e">
- /// The QueueProgressEventArgs.
- /// </param>
- private void InvokeJobProcessingStarted(QueueProgressEventArgs e)
- {
- QueueProgressStatus handler = this.JobProcessingStarted;
- if (handler != null)
- {
- handler(this, e);
- }
- }
-
- /// <summary>
- /// Invoke the Queue Changed Event
- /// </summary>
- /// <param name="e">
- /// The e.
- /// </param>
- private void InvokeQueueChanged(EventArgs e)
- {
- try
- {
- this.BackupQueue(string.Empty);
- }
- catch (Exception)
- {
- // Do Nothing.
- }
-
- EventHandler handler = this.QueueChanged;
- if (handler != null)
- {
- handler(this, e);
- }
- }
-
- /// <summary>
- /// Invoke the QueuePaused event
- /// </summary>
- /// <param name="e">
- /// The EventArgs.
- /// </param>
- private void InvokeQueuePaused(EventArgs e)
- {
- this.IsProcessing = false;
-
- EventHandler handler = this.QueuePaused;
- if (handler != null)
- {
- handler(this, e);
- }
- }
-
- /// <summary>
- /// Run through all the jobs on the queue.
- /// </summary>
- private void ProcessNextJob()
- {
- QueueTask job = this.GetNextJobForProcessing();
- if (job != null)
- {
- if (this.userSettingService.GetUserSetting<bool>(UserSettingConstants.PauseOnLowDiskspace) && !DriveUtilities.HasMinimumDiskSpace(job.Task.Destination, this.userSettingService.GetUserSetting<long>(UserSettingConstants.PauseOnLowDiskspaceLevel)))
- {
- LogService.GetLogger().LogMessage(Resources.PauseOnLowDiskspace, LogMessageType.ScanOrEncode, LogLevel.Info);
- job.Status = QueueItemStatus.Waiting;
- this.Pause();
- this.BackupQueue(string.Empty);
- return; // Don't start the next job.
- }
-
- job.Status = QueueItemStatus.InProgress;
- job.Statistics.StartTime = DateTime.Now;
- this.LastProcessedJob = job;
- this.IsProcessing = true;
- this.InvokeQueueChanged(EventArgs.Empty);
- this.InvokeJobProcessingStarted(new QueueProgressEventArgs(job));
-
- if (!Directory.Exists(Path.GetDirectoryName(job.Task.Destination)))
- {
- this.EncodeServiceEncodeCompleted(null, new EncodeCompletedEventArgs(false, null, "Destination Directory Missing", null, null, 0));
- this.BackupQueue(string.Empty);
- return;
- }
- this.EncodeService.Start(job.Task, job.Configuration);
- this.BackupQueue(string.Empty);
- }
- else
- {
- // No more jobs to process, so unsubscribe the event
- this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted;
-
- this.BackupQueue(string.Empty);
-
- // Fire the event to tell connected services.
- this.OnQueueCompleted(new QueueCompletedEventArgs(false));
- }
- }
-
- #endregion
- }
+// -------------------------------------------------------------------------------------------------------------------- +// <copyright file="QueueService.cs" company="HandBrake Project (http://handbrake.fr)"> +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// </copyright> +// <summary> +// The HandBrake Queue +// </summary> +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.Services.Queue +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.ComponentModel; + using System.Diagnostics; + using System.IO; + using System.Linq; + + using HandBrake.Interop.Interop.Json.Queue; + using HandBrake.Interop.Model; + using HandBrake.Interop.Utilities; + + using HandBrakeWPF.Factories; + using HandBrakeWPF.Helpers; + using HandBrakeWPF.Properties; + using HandBrakeWPF.Services.Encode.Factories; + using HandBrakeWPF.Services.Encode.Model; + using HandBrakeWPF.Services.Interfaces; + using HandBrakeWPF.Services.Queue.Model; + using HandBrakeWPF.Utilities; + + using Newtonsoft.Json; + + using EncodeCompletedEventArgs = HandBrakeWPF.Services.Encode.EventArgs.EncodeCompletedEventArgs; + using Execute = Caliburn.Micro.Execute; + using GeneralApplicationException = HandBrakeWPF.Exceptions.GeneralApplicationException; + using IEncode = HandBrakeWPF.Services.Encode.Interfaces.IEncode; + using LogLevel = HandBrakeWPF.Services.Logging.Model.LogLevel; + using LogMessageType = HandBrakeWPF.Services.Logging.Model.LogMessageType; + using LogService = HandBrakeWPF.Services.Logging.LogService; + using QueueCompletedEventArgs = HandBrakeWPF.EventArgs.QueueCompletedEventArgs; + using QueueProgressEventArgs = HandBrakeWPF.EventArgs.QueueProgressEventArgs; + + /// <summary> + /// The HandBrake Queue + /// </summary> + public class QueueService : Interfaces.IQueueService + { + #region Constants and Fields + private static readonly object QueueLock = new object(); + private readonly IUserSettingService userSettingService; + private readonly ObservableCollection<QueueTask> queue = new ObservableCollection<QueueTask>(); + private readonly string queueFile; + private bool clearCompleted; + + #endregion + + #region Constructors and Destructors + + /// <summary> + /// Initializes a new instance of the <see cref="QueueService"/> class. + /// </summary> + /// <param name="encodeService"> + /// The encode Service. + /// </param> + /// <param name="userSettingService"> + /// The user settings service. + /// </param> + /// <exception cref="ArgumentNullException"> + /// Services are not setup + /// </exception> + public QueueService(IEncode encodeService, IUserSettingService userSettingService) + { + this.userSettingService = userSettingService; + this.EncodeService = encodeService; + + // If this is the first instance, just use the main queue file, otherwise add the instance id to the filename. + this.queueFile = string.Format("{0}{1}.json", QueueRecoveryHelper.QueueFileName, GeneralUtilities.ProcessId); + } + + #endregion + + #region Delegates + + /// <summary> + /// Queue Progress Status + /// </summary> + /// <param name="sender"> + /// The sender. + /// </param> + /// <param name="e"> + /// The QueueProgressEventArgs. + /// </param> + public delegate void QueueProgressStatus(object sender, QueueProgressEventArgs e); + + /// <summary> + /// The queue completed. + /// </summary> + /// <param name="sender"> + /// The sender. + /// </param> + /// <param name="e"> + /// The e. + /// </param> + public delegate void QueueCompletedEventDelegate(object sender, QueueCompletedEventArgs e); + + #endregion + + #region Events + + /// <summary> + /// Fires when the Queue has started + /// </summary> + public event QueueProgressStatus JobProcessingStarted; + + /// <summary> + /// Fires when a job is Added, Removed or Re-Ordered. + /// Should be used for triggering an update of the Queue Window. + /// </summary> + public event EventHandler QueueChanged; + + /// <summary> + /// Fires when the entire encode queue has completed. + /// </summary> + public event QueueCompletedEventDelegate QueueCompleted; + + /// <summary> + /// Fires when a pause to the encode queue has been requested. + /// </summary> + public event EventHandler QueuePaused; + + #endregion + + #region Properties + + /// <summary> + /// Gets the number of jobs in the queue; + /// </summary> + public int Count + { + get + { + return this.queue.Count(item => item.Status == QueueItemStatus.Waiting); + } + } + + /// <summary> + /// The number of errors detected. + /// </summary> + public int ErrorCount + { + get + { + return this.queue.Count(item => item.Status == QueueItemStatus.Error); + } + } + + /// <summary> + /// Gets the IEncodeService instance. + /// </summary> + public IEncode EncodeService { get; private set; } + + /// <summary> + /// Gets a value indicating whether IsProcessing. + /// </summary> + public bool IsProcessing { get; private set; } + + /// <summary> + /// Gets or sets Last Processed Job. + /// This is set when the job is poped of the queue by GetNextJobForProcessing(); + /// </summary> + public QueueTask LastProcessedJob { get; set; } + + /// <summary> + /// Gets The current queue. + /// </summary> + public ObservableCollection<QueueTask> Queue + { + get + { + return this.queue; + } + } + + #endregion + + #region Public Methods + + /// <summary> + /// Add a job to the Queue. + /// This method is Thread Safe. + /// </summary> + /// <param name="job"> + /// The encode Job object. + /// </param> + public void Add(QueueTask job) + { + lock (QueueLock) + { + this.queue.Add(job); + this.InvokeQueueChanged(EventArgs.Empty); + } + } + + /// <summary> + /// Backup any changes to the queue file + /// </summary> + /// <param name="exportPath"> + /// If this is not null or empty, this will be used instead of the standard backup location. + /// </param> + public void BackupQueue(string exportPath) + { + Stopwatch watch = Stopwatch.StartNew(); + + string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly()); + string tempPath = !string.IsNullOrEmpty(exportPath) + ? exportPath + : Path.Combine(appDataPath, string.Format(this.queueFile, string.Empty)); + + using (StreamWriter writer = new StreamWriter(tempPath)) + { + List<QueueTask> tasks = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList(); + string queueJson = JsonConvert.SerializeObject(tasks, Formatting.Indented); + writer.Write(queueJson); + } + + watch.Stop(); + Debug.WriteLine("Queue Save (ms): " + watch.ElapsedMilliseconds); + } + + public void ExportJson(string exportPath) + { + List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList(); + List<EncodeTask> workUnits = jobs.Select(job => job.Task).ToList(); + HBConfiguration config = HBConfigurationFactory.Create(); // Default to current settings for now. These will hopefully go away in the future. + + string json = QueueFactory.GetQueueJson(workUnits, config); + + using (var strm = new StreamWriter(exportPath, false)) + { + strm.Write(json); + strm.Close(); + strm.Dispose(); + } + } + + public void ImportJson(string path) + { + List<Task> tasks; + using (StreamReader reader = new StreamReader(path)) + { + string fileContent = reader.ReadToEnd(); + tasks = QueueFactory.GetQueue(fileContent); + + if (tasks != null) + { + foreach (Task task in tasks) + { + // TODO flesh out. + EncodeTask encodeTask = EncodeTaskImportFactory.Create(task.Job); + QueueTask queueTask = new QueueTask(); + queueTask.Task = encodeTask; + + this.queue.Add(queueTask); + } + } + } + } + + /// <summary> + /// Checks the current queue for an existing instance of the specified destination. + /// </summary> + /// <param name="destination"> + /// The destination of the encode. + /// </param> + /// <returns> + /// Whether or not the supplied destination is already in the queue. + /// </returns> + public bool CheckForDestinationPathDuplicates(string destination) + { + foreach (QueueTask job in this.queue) + { + if (string.Equals( + job.Task.Destination, + destination.Replace("\\\\", "\\"), + StringComparison.OrdinalIgnoreCase) && (job.Status == QueueItemStatus.Waiting || job.Status == QueueItemStatus.InProgress)) + { + return true; + } + } + + return false; + } + + /// <summary> + /// Clear down all Queue Items + /// </summary> + public void Clear() + { + List<QueueTask> deleteList = this.queue.ToList(); + foreach (QueueTask item in deleteList) + { + this.queue.Remove(item); + } + this.InvokeQueueChanged(EventArgs.Empty); + } + + /// <summary> + /// Clear down the Queue´s completed items + /// </summary> + public void ClearCompleted() + { + Execute.OnUIThread( + () => + { + List<QueueTask> deleteList = + this.queue.Where(task => task.Status == QueueItemStatus.Completed).ToList(); + foreach (QueueTask item in deleteList) + { + this.queue.Remove(item); + } + this.InvokeQueueChanged(EventArgs.Empty); + }); + } + + /// <summary> + /// Get the first job on the queue for processing. + /// This also removes the job from the Queue and sets the LastProcessedJob + /// </summary> + /// <returns> + /// An encode Job object. + /// </returns> + public QueueTask GetNextJobForProcessing() + { + if (this.queue.Count > 0) + { + return this.queue.FirstOrDefault(q => q.Status == QueueItemStatus.Waiting); + } + + return null; + } + + /// <summary> + /// Moves an item down one position in the queue. + /// </summary> + /// <param name="index"> + /// The zero-based location of the job in the queue. + /// </param> + public void MoveDown(int index) + { + if (index < this.queue.Count - 1) + { + QueueTask item = this.queue[index]; + + this.queue.RemoveAt(index); + this.queue.Insert((index + 1), item); + } + + this.InvokeQueueChanged(EventArgs.Empty); + } + + /// <summary> + /// Moves an item up one position in the queue. + /// </summary> + /// <param name="index"> + /// The zero-based location of the job in the queue. + /// </param> + public void MoveUp(int index) + { + if (index > 0) + { + QueueTask item = this.queue[index]; + + this.queue.RemoveAt(index); + this.queue.Insert((index - 1), item); + } + + this.InvokeQueueChanged(EventArgs.Empty); + } + + /// <summary> + /// Remove a job from the Queue. + /// This method is Thread Safe + /// </summary> + /// <param name="job"> + /// The job. + /// </param> + public void Remove(QueueTask job) + { + lock (QueueLock) + { + this.queue.Remove(job); + this.InvokeQueueChanged(EventArgs.Empty); + } + } + + /// <summary> + /// Reset a Queued Item from Error or Completed to Waiting + /// </summary> + /// <param name="job"> + /// The job. + /// </param> + public void ResetJobStatusToWaiting(QueueTask job) + { + if (job.Status != QueueItemStatus.Error && job.Status != QueueItemStatus.Completed) + { + throw new GeneralApplicationException( + Resources.Error, Resources.Queue_UnableToResetJob, null); + } + + job.Status = QueueItemStatus.Waiting; + } + + /// <summary> + /// Restore a Queue from file or from the queue backup file. + /// </summary> + /// <param name="importPath"> + /// The import path. String.Empty or null will result in the default file being loaded. + /// </param> + public void RestoreQueue(string importPath) + { + string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly()); + string tempPath = !string.IsNullOrEmpty(importPath) + ? importPath + : (appDataPath + string.Format(this.queueFile, string.Empty)); + + if (File.Exists(tempPath)) + { + bool invokeUpdate = false; + using (StreamReader stream = new StreamReader(!string.IsNullOrEmpty(importPath) ? importPath : tempPath)) + { + string queueJson = stream.ReadToEnd(); + List<QueueTask> list; + + try + { + list = JsonConvert.DeserializeObject<List<QueueTask>>(queueJson); + } + catch (Exception exc) + { + throw new GeneralApplicationException(Resources.Queue_UnableToRestoreFile, Resources.Queue_UnableToRestoreFileExtended, exc); + } + + if (list != null) + { + foreach (QueueTask item in list) + { + if (item.Status != QueueItemStatus.Completed) + { + // Reset InProgress/Error to Waiting so it can be processed + if (item.Status == QueueItemStatus.InProgress) + { + item.Status = QueueItemStatus.Error; + } + + this.queue.Add(item); + } + } + } + + invokeUpdate = true; + } + + if (invokeUpdate) + { + this.InvokeQueueChanged(EventArgs.Empty); + } + } + } + + /// <summary> + /// Requests a pause of the encode queue. + /// </summary> + public void Pause() + { + this.IsProcessing = false; + this.InvokeQueuePaused(EventArgs.Empty); + } + + public void PauseEncode() + { + if (this.EncodeService.IsEncoding && !this.EncodeService.IsPasued) + { + this.EncodeService.Pause(); + this.LastProcessedJob.Statistics.SetPaused(true); + } + + this.Pause(); + } + + /// <summary> + /// Starts encoding the first job in the queue and continues encoding until all jobs + /// have been encoded. + /// </summary> + /// <param name="isClearCompleted"> + /// The is Clear Completed. + /// </param> + public void Start(bool isClearCompleted) + { + if (this.IsProcessing) + { + return; + } + + this.clearCompleted = isClearCompleted; + + this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted; + this.EncodeService.EncodeCompleted += this.EncodeServiceEncodeCompleted; + + if (this.EncodeService.IsPasued) + { + this.EncodeService.Resume(); + this.IsProcessing = true; + this.InvokeJobProcessingStarted(new QueueProgressEventArgs(this.LastProcessedJob)); + this.LastProcessedJob.Statistics.SetPaused(false); + } + + if (!this.EncodeService.IsEncoding) + { + this.ProcessNextJob(); + } + } + + public void Stop() + { + if (this.EncodeService.IsEncoding) + { + this.EncodeService.Stop(); + } + this.IsProcessing = false; + this.InvokeQueuePaused(EventArgs.Empty); + } + + #endregion + + #region Methods + + /// <summary> + /// The on queue completed. + /// </summary> + /// <param name="e"> + /// The e. + /// </param> + protected virtual void OnQueueCompleted(QueueCompletedEventArgs e) + { + QueueCompletedEventDelegate handler = this.QueueCompleted; + if (handler != null) + { + handler(this, e); + } + + this.IsProcessing = false; + } + + /// <summary> + /// After an encode is complete, move onto the next job. + /// </summary> + /// <param name="sender"> + /// The sender. + /// </param> + /// <param name="e"> + /// The EncodeCompletedEventArgs. + /// </param> + private void EncodeServiceEncodeCompleted(object sender, EncodeCompletedEventArgs e) + { + this.LastProcessedJob.Status = QueueItemStatus.Completed; + this.LastProcessedJob.Statistics.EndTime = DateTime.Now; + this.LastProcessedJob.Statistics.CompletedActivityLogPath = e.ActivityLogPath; + this.LastProcessedJob.Statistics.FinalFileSize = e.FinalFilesizeInBytes; + + // Clear the completed item of the queue if the setting is set. + if (this.clearCompleted) + { + this.ClearCompleted(); + } + + if (!e.Successful) + { + this.LastProcessedJob.Status = QueueItemStatus.Error; + } + + // Move onto the next job. + if (this.IsProcessing) + { + this.ProcessNextJob(); + } + else + { + this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted; + this.BackupQueue(string.Empty); + this.OnQueueCompleted(new QueueCompletedEventArgs(true)); + } + } + + /// <summary> + /// Invoke the JobProcessingStarted event + /// </summary> + /// <param name="e"> + /// The QueueProgressEventArgs. + /// </param> + private void InvokeJobProcessingStarted(QueueProgressEventArgs e) + { + QueueProgressStatus handler = this.JobProcessingStarted; + if (handler != null) + { + handler(this, e); + } + } + + /// <summary> + /// Invoke the Queue Changed Event + /// </summary> + /// <param name="e"> + /// The e. + /// </param> + private void InvokeQueueChanged(EventArgs e) + { + try + { + this.BackupQueue(string.Empty); + } + catch (Exception) + { + // Do Nothing. + } + + EventHandler handler = this.QueueChanged; + if (handler != null) + { + handler(this, e); + } + } + + /// <summary> + /// Invoke the QueuePaused event + /// </summary> + /// <param name="e"> + /// The EventArgs. + /// </param> + private void InvokeQueuePaused(EventArgs e) + { + this.IsProcessing = false; + + EventHandler handler = this.QueuePaused; + if (handler != null) + { + handler(this, e); + } + } + + /// <summary> + /// Run through all the jobs on the queue. + /// </summary> + private void ProcessNextJob() + { + QueueTask job = this.GetNextJobForProcessing(); + if (job != null) + { + if (this.userSettingService.GetUserSetting<bool>(UserSettingConstants.PauseOnLowDiskspace) && !DriveUtilities.HasMinimumDiskSpace(job.Task.Destination, this.userSettingService.GetUserSetting<long>(UserSettingConstants.PauseOnLowDiskspaceLevel))) + { + LogService.GetLogger().LogMessage(Resources.PauseOnLowDiskspace, LogMessageType.ScanOrEncode, LogLevel.Info); + job.Status = QueueItemStatus.Waiting; + this.Pause(); + this.BackupQueue(string.Empty); + return; // Don't start the next job. + } + + job.Status = QueueItemStatus.InProgress; + job.Statistics.StartTime = DateTime.Now; + this.LastProcessedJob = job; + this.IsProcessing = true; + this.InvokeQueueChanged(EventArgs.Empty); + this.InvokeJobProcessingStarted(new QueueProgressEventArgs(job)); + + if (!Directory.Exists(Path.GetDirectoryName(job.Task.Destination))) + { + this.EncodeServiceEncodeCompleted(null, new EncodeCompletedEventArgs(false, null, "Destination Directory Missing", null, null, 0)); + this.BackupQueue(string.Empty); + return; + } + this.EncodeService.Start(job.Task, job.Configuration); + this.BackupQueue(string.Empty); + } + else + { + // No more jobs to process, so unsubscribe the event + this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted; + + this.BackupQueue(string.Empty); + + // Fire the event to tell connected services. + this.OnQueueCompleted(new QueueCompletedEventArgs(false)); + } + } + + #endregion + } }
\ No newline at end of file diff --git a/win/CS/HandBrakeWPF/Startup/AppBootstrapper.cs b/win/CS/HandBrakeWPF/Startup/AppBootstrapper.cs index 458c071c3..4f1f6c159 100644 --- a/win/CS/HandBrakeWPF/Startup/AppBootstrapper.cs +++ b/win/CS/HandBrakeWPF/Startup/AppBootstrapper.cs @@ -60,7 +60,7 @@ namespace HandBrakeWPF.Startup this.container.Singleton<IPrePostActionService, PrePostActionService>();
this.container.Singleton<IUserSettingService, UserSettingService>();
this.container.Singleton<IPresetService, PresetService>();
- this.container.Singleton<IQueueProcessor, QueueProcessor>();
+ this.container.Singleton<IQueueService, QueueService>();
// Commands
diff --git a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs index d39975244..c93a005d3 100644 --- a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs @@ -70,7 +70,7 @@ namespace HandBrakeWPF.ViewModels {
#region Private Variables and Services
- private readonly IQueueProcessor queueProcessor;
+ private readonly IQueueService queueProcessor;
private readonly IPresetService presetService;
private readonly IErrorService errorService;
private readonly IUpdateService updateService;
@@ -126,7 +126,7 @@ namespace HandBrakeWPF.ViewModels this.notifyIconService = notifyIconService;
this.QueueViewModel = queueViewModel;
this.userSettingService = userSettingService;
- this.queueProcessor = IoC.Get<IQueueProcessor>();
+ this.queueProcessor = IoC.Get<IQueueService>();
this.SummaryViewModel = summaryViewModel;
this.PictureSettingsViewModel = pictureSettingsViewModel;
diff --git a/win/CS/HandBrakeWPF/ViewModels/MiniViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MiniViewModel.cs index 3e5fb83c1..59de994df 100644 --- a/win/CS/HandBrakeWPF/ViewModels/MiniViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/MiniViewModel.cs @@ -25,7 +25,7 @@ namespace HandBrakeWPF.ViewModels public class MiniViewModel : ViewModelBase, IMiniViewModel
{
private readonly IEncode encodeService;
- private readonly IQueueProcessor queueProcessor;
+ private readonly IQueueService queueProcessor;
private string queueStatus;
private string progress;
private string task;
@@ -40,7 +40,7 @@ namespace HandBrakeWPF.ViewModels /// <param name="queueProcessor">
/// The queue Processor.
/// </param>
- public MiniViewModel(IEncode encodeService, IQueueProcessor queueProcessor)
+ public MiniViewModel(IEncode encodeService, IQueueService queueProcessor)
{
this.encodeService = encodeService;
this.queueProcessor = queueProcessor;
diff --git a/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs index a5df085b0..15602f79d 100644 --- a/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs @@ -44,7 +44,7 @@ namespace HandBrakeWPF.ViewModels private readonly IErrorService errorService;
private readonly IUserSettingService userSettingService;
- private readonly IQueueProcessor queueProcessor;
+ private readonly IQueueService queueProcessor;
private string jobStatus;
private string jobsPending;
private string whenDoneAction;
@@ -70,7 +70,7 @@ namespace HandBrakeWPF.ViewModels /// <param name="errorService">
/// The Error Service
/// </param>
- public QueueViewModel(IUserSettingService userSettingService, IQueueProcessor queueProcessor, IErrorService errorService)
+ public QueueViewModel(IUserSettingService userSettingService, IQueueService queueProcessor, IErrorService errorService)
{
this.userSettingService = userSettingService;
this.queueProcessor = queueProcessor;
diff --git a/win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs index 60706c3fd..c75981ef2 100644 --- a/win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs @@ -18,7 +18,7 @@ namespace HandBrakeWPF.ViewModels using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.ViewModels.Interfaces;
- using IQueueProcessor = HandBrakeWPF.Services.Queue.Interfaces.IQueueProcessor;
+ using IQueueService = HandBrakeWPF.Services.Queue.Interfaces.IQueueService;
/// <summary>
/// The Shell View Model
@@ -189,7 +189,7 @@ namespace HandBrakeWPF.ViewModels /// </returns>
public bool CanClose()
{
- IQueueProcessor processor = IoC.Get<IQueueProcessor>();
+ IQueueService processor = IoC.Get<IQueueService>();
if (processor != null && processor.EncodeService.IsEncoding)
{
MessageBoxResult result =
|