using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Data; using Tango.Core; using Tango.Core.Commands; using Tango.Core.DI; using Tango.Core.Json; using Tango.FSE.Common.FileSystem; using Tango.Logging; using Tango.PPC.Shared.Logs; using Tango.SharedUI.Components; namespace Tango.FSE.Common.Logging { /// /// Represents a remote log file model. /// /// /// public class RemoteLogFileModel : ExtendedObject where T : LogItemBase { private ILogFileParser _parser; /// /// Occurs when the remote log file has downloaded successfully. /// public event EventHandler DownloadCompleted; [TangoInject] private ILoggingProvider LoggingProvider { get; set; } /// /// Gets or sets the remote log file. /// public RemoteLogFile RemoteLogFile { get; set; } /// /// Gets the duration of the remote log file. /// public TimeSpan Duration { get { return RemoteLogFile.DateModified - RemoteLogFile.DateCreated; } } private RemoteLogFileStatus _status; /// /// Gets or sets the remote log file status. /// public RemoteLogFileStatus Status { get { return _status; } set { _status = value; RaisePropertyChangedAuto(); } } private FileSystemHandler _handler; /// /// Gets or sets the remote log file download handler. /// public FileSystemHandler Handler { get { return _handler; } set { _handler = value; RaisePropertyChangedAuto(); } } /// /// Gets or sets the temporary file (where the actual log file is stored locally). /// public String TemporaryFile { get; set; } private ObservableCollection _logItems; /// /// Gets or sets the log items. /// public ObservableCollection LogItems { get { return _logItems; } set { _logItems = value; RaisePropertyChangedAuto(); } } /// /// Gets or sets the download command. /// public RelayCommand DownloadCommand { get; set; } /// /// Initializes a new instance of the class. /// /// The parser. public RemoteLogFileModel(ILogFileParser parser) { TangoIOC.Default.Inject(this); _parser = parser; LogItems = new ObservableCollection(); DownloadCommand = new RelayCommand(DownloadLogFile); } /// /// Downloads the log file. /// public async void DownloadLogFile() { if (Status == RemoteLogFileStatus.None || Status == RemoteLogFileStatus.Failed) { Status = RemoteLogFileStatus.Downloading; String tempLogFile = TemporaryManager.CreateImaginaryFile(".log"); Handler = await LoggingProvider.DownloadLogFile(RemoteLogFile, tempLogFile); Handler.StatusChanged += (x, status) => { if (status == FileSystemHandlerStatus.Completed) { TemporaryFile = tempLogFile; LogItems = new ObservableCollection(_parser.Parse(tempLogFile, RemoteLogFile.DateCreated.ToLocalTime())); Status = RemoteLogFileStatus.Downloaded; RemoteLogFile.DateModified = LogItems.Last().TimeStamp.ToUniversalTime(); RaisePropertyChanged(nameof(Duration)); DownloadCompleted?.Invoke(this, new EventArgs()); } else if (status == FileSystemHandlerStatus.Failed) { Status = RemoteLogFileStatus.Failed; } }; } } } }