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.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
}
}
- /// <summary>
- /// The number of errors detected.
- /// </summary>
public int ErrorCount
{
get
}
}
- /// <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
}
}
- #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)
}
}
- /// <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();
Debug.WriteLine("Queue Save (ms): " + watch.ElapsedMilliseconds);
}
- public void ExportJson(string exportPath)
+ public void ExportCliJson(string exportPath)
{
List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
List<EncodeTask> workUnits = jobs.Select(job => job.Task).ToList();
}
}
+ public void ExportJson(string exportPath)
+ {
+ List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
+
+ JsonSerializerSettings settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
+
+ string json = JsonConvert.SerializeObject(jobs, Formatting.Indented, settings);
+
+ 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 (string.IsNullOrEmpty(fileContent))
+ {
+ return;
+ }
+
+ List<QueueTask> reloadedQueue = JsonConvert.DeserializeObject<List<QueueTask>>(fileContent);
- if (tasks != null)
+ if (reloadedQueue == null)
{
- foreach (Task task in tasks)
- {
- // TODO flesh out.
- EncodeTask encodeTask = EncodeTaskImportFactory.Create(task.Job);
- QueueTask queueTask = new QueueTask();
- queueTask.Task = encodeTask;
+ return;
+ }
- this.queue.Add(queueTask);
- }
+ foreach (QueueTask task in reloadedQueue)
+ {
+ this.queue.Add(task);
}
}
}
- /// <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)
return false;
}
- /// <summary>
- /// Clear down all Queue Items
- /// </summary>
public void Clear()
{
List<QueueTask> deleteList = this.queue.ToList();
this.InvokeQueueChanged(EventArgs.Empty);
}
- /// <summary>
- /// Clear down the Queue´s completed items
- /// </summary>
public void ClearCompleted()
{
Execute.OnUIThread(
});
}
- /// <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 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)
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)
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)
}
}
- /// <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)
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());
}
}
- /// <summary>
- /// Requests a pause of the encode queue.
- /// </summary>
public void Pause()
{
this.IsProcessing = false;
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)
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;
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;
}
}
- /// <summary>
- /// Invoke the JobProcessingStarted event
- /// </summary>
- /// <param name="e">
- /// The QueueProgressEventArgs.
- /// </param>
private void InvokeJobProcessingStarted(QueueProgressEventArgs e)
{
QueueProgressStatus handler = this.JobProcessingStarted;
}
}
- /// <summary>
- /// Invoke the Queue Changed Event
- /// </summary>
- /// <param name="e">
- /// The e.
- /// </param>
private void InvokeQueueChanged(EventArgs e)
{
try
}
}
- /// <summary>
- /// Invoke the QueuePaused event
- /// </summary>
- /// <param name="e">
- /// The EventArgs.
- /// </param>
private void InvokeQueuePaused(EventArgs e)
{
this.IsProcessing = false;
}
}
- /// <summary>
- /// Run through all the jobs on the queue.
- /// </summary>
private void ProcessNextJob()
{
QueueTask job = this.GetNextJobForProcessing();
this.OnQueueCompleted(new QueueCompletedEventArgs(false));
}
}
-
- #endregion
}
}
\ No newline at end of file