using System; using FluentMigrator.Runner; using NzbDrone.Common.Messaging; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Tracking; namespace NzbDrone.Core.Messaging.Commands { public abstract class Command : ModelBase, IMessage { private static readonly object Mutex = new object(); private static int _idCounter; private readonly StopWatch _stopWatch; public CommandStatus State { get; private set; } public DateTime StateChangeTime { get; private set; } public virtual bool SendUpdatesToClient { get { return false; } } public TimeSpan Runtime { get { return _stopWatch.ElapsedTime(); } } public Exception Exception { get; private set; } public string Message { get; private set; } public string Name { get; private set; } protected Command() { Name = GetType().Name.Replace("Command", ""); StateChangeTime = DateTime.UtcNow; State = CommandStatus.Pending; _stopWatch = new StopWatch(); lock (Mutex) { Id = ++_idCounter; } } public void Start() { _stopWatch.Start(); StateChangeTime = DateTime.UtcNow; State = CommandStatus.Running; SetMessage("Starting"); } public void Failed(Exception exception) { _stopWatch.Stop(); StateChangeTime = DateTime.UtcNow; State = CommandStatus.Failed; Exception = exception; SetMessage("Failed"); } public void Completed() { _stopWatch.Stop(); StateChangeTime = DateTime.UtcNow; State = CommandStatus.Completed; SetMessage("Completed"); } public void SetMessage(string message) { Message = message; } } }