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 });
}
}
}