using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core; namespace Tango.Integration.Storage { public class StorageFileHandler : ExtendedObject { private Action _cancelAction; public event EventHandler Progress; public event EventHandler Completed; public event EventHandler Canceled; public event EventHandler Failed; internal StorageFileHandler() { } internal StorageFileHandler(StorageFile storageFile, Action cancelAction) { _cancelAction = cancelAction; StorageFile = storageFile; } public StorageFile StorageFile { get; set; } private StorageFileHandlerStatus _status; public StorageFileHandlerStatus Status { get { return _status; } private set { _status = value; RaisePropertyChangedAuto(); } } private long _current; public long Current { get { return _current; } internal set { long previous = _current; _current = value; RaisePropertyChangedAuto(); Progress?.Invoke(this, new StorageFileHandlerProgressEventArgs() { Current = _current, Total = _total, Delta = _current - previous, }); if (Status != StorageFileHandlerStatus.Active) { Status = StorageFileHandlerStatus.Active; } } } private long _total; public long Total { get { return _total; } internal set { _total = value; RaisePropertyChangedAuto(); } } public bool IsPaused { get; set; } public Task Cancel() { return Task.Factory.StartNew(() => { _cancelAction.Invoke(); Status = StorageFileHandlerStatus.Canceled; }); } internal void RaiseCompleted() { Status = StorageFileHandlerStatus.Completed; Completed?.Invoke(this, new EventArgs()); } internal void RaiseCanceled() { Status = StorageFileHandlerStatus.Canceled; Canceled?.Invoke(this, new EventArgs()); } internal void RaiseFailed(Exception ex) { Status = StorageFileHandlerStatus.Failed; Failed?.Invoke(this, ex); } } }