using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core; using Tango.FileSystem; using Tango.FSE.Common.Connection; using Tango.FSE.Common.FileSystem; using Tango.FSE.Common.Logging; using Tango.Integration.ExternalBridge; using Tango.Integration.Logging; using Tango.Logging; using Tango.PPC.Shared.Logs; namespace Tango.FSE.UI.Logging { /// /// Represents the default implementation. /// /// public class DefaultLoggingProvider : ExtendedObject, ILoggingProvider { private IFileSystemProvider _fileSystemProvider; private IMachineProvider _machineProvider; public event EventHandler FSELogAvailable; /// /// Occurs when a new PPC application log is available. /// public event EventHandler ApplicationLogAvailable; /// /// Occurs when a new embedded log is available. /// public event EventHandler FirmwareLogAvailable; /// /// Gets the last retrieved history of the application log files. /// public ObservableCollection ApplicationLogFiles { get; private set; } /// /// Gets the last retrieved history of the embedded firmware log files. /// public ObservableCollection FirmwareLogFiles { get; private set; } /// /// Initializes a new instance of the class. /// /// The machine provider. public DefaultLoggingProvider(IMachineProvider machineProvider, IFileSystemProvider fileSystemProvider) { ApplicationLogFiles = new ObservableCollection(); FirmwareLogFiles = new ObservableCollection(); _machineProvider = machineProvider; _fileSystemProvider = fileSystemProvider; if (machineProvider.MachineOperator is ExternalBridgeTcpClient) { (machineProvider.MachineOperator as ExternalBridgeTcpClient).ApplicationLogAvailable += DefaultLoggingProvider_ApplicationLogAvailable; } machineProvider.MachineOperator.DebugLogAvailable += MachineOperator_DebugLogAvailable; LogManager.NewLog += LogManager_NewLog; } /// /// Gets the history of application log files. /// /// public async Task> GetApplicationLogFiles() { var response = await _machineProvider.MachineOperator.SendGenericRequest(new GetLogFilesRequest() { LogFileType = RemoteLogFileType.Application }); ApplicationLogFiles.Clear(); foreach (var item in response.LogFiles) { ApplicationLogFiles.Add(item); } return response.LogFiles; } /// /// Gets the history of the embedded firmware log files. /// /// public async Task> GetFirmwareLogFiles() { var response = await _machineProvider.MachineOperator.SendGenericRequest(new GetLogFilesRequest() { LogFileType = RemoteLogFileType.Firmware }); FirmwareLogFiles.Clear(); foreach (var item in response.LogFiles) { FirmwareLogFiles.Add(item); } return response.LogFiles; } /// /// Downloads the specified remote log file. /// /// The log file. /// Target local file. /// public async Task DownloadLogFile(RemoteLogFile logFile, String targetFile) { var tempFolder = TemporaryManager.CreateFolder(); var handler = await _fileSystemProvider.Download(new FileItem() { Path = logFile.Path }, tempFolder); handler.StatusChanged += (x, status) => { if (status == FileSystemHandlerStatus.Completed) { File.Move(Path.Combine(tempFolder, logFile.Name), targetFile); } }; return handler; } private void LogManager_NewLog(object sender, LogItemBase log) { FSELogAvailable?.Invoke(this, log); } private void DefaultLoggingProvider_ApplicationLogAvailable(object sender, LogItemBase log) { ApplicationLogAvailable?.Invoke(this, log); } private void MachineOperator_DebugLogAvailable(object sender, PMR.Debugging.StartDebugLogResponse log) { FirmwareLogAvailable?.Invoke(this, new EmbeddedLogItem(log) { TimeStamp = DateTime.Now }); } } }