using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core; using Tango.Integration.Storage; namespace Tango.Integration.Upgrade { public class FirmwareUpgradeHandler : ExtendedObject { private Action _cancelAction; public event EventHandler Progress; public event EventHandler Completed; public event EventHandler Canceled; public event EventHandler Failed; internal FirmwareUpgradeHandler() { IsIndeterminate = true; Total = 100; Message = "Initializing..."; } internal FirmwareUpgradeHandler(Action cancelAction) : this() { _cancelAction = cancelAction; } private String _message; public String Message { get { return _message; } set { _message = value; RaisePropertyChangedAuto(); } } private FirmwareUpgradeStatus _status; public FirmwareUpgradeStatus Status { get { return _status; } private set { _status = value; RaisePropertyChangedAuto(); } } private double _current; public double Current { get { return _current; } internal set { _current = value; RaisePropertyChangedAuto(); } } private double _total; public double Total { get { return _total; } internal set { _total = value; RaisePropertyChangedAuto(); } } private bool _isIndeterminate; public bool IsIndeterminate { get { return _isIndeterminate; } set { _isIndeterminate = value; RaisePropertyChangedAuto(); } } public Task Cancel() { return Task.Factory.StartNew(() => { _cancelAction.Invoke(); Message = "Canceled."; Status = FirmwareUpgradeStatus.Canceled; Canceled?.Invoke(this, new EventArgs()); }); } internal void RaiseCompleted() { RaiseProgress(FirmwareUpgradeStatus.Completed, "Firmware upgrade completed.", false, 100, 100); Completed?.Invoke(this, new EventArgs()); } internal void RaiseCanceled() { RaiseProgress(FirmwareUpgradeStatus.Canceled, "Firmware upgrade canceled by user.", false, 100, 0); Canceled?.Invoke(this, new EventArgs()); } internal void RaiseFailed(Exception ex) { RaiseProgress(FirmwareUpgradeStatus.Failed, "Firmware upgrade failed.", false, 100, 0); Failed?.Invoke(this, ex); } internal void RaiseProgress(FirmwareUpgradeStatus status, String message, bool isIndeterminate = true, double total = 100, double current = 0) { Total = total; Current = current; IsIndeterminate = isIndeterminate; Status = status; Message = message; Progress?.Invoke(this, new FirmwareUpgradeProgressEventArgs() { Current = Current, Status = Status, Total = Total, Message = Message, IsIndeterminate = IsIndeterminate }); } } }