using System; using System.ComponentModel; using System.IO; using System.Reflection; using DiscImageChef.CommonTypes.Interop; using DiscImageChef.Console; using Eto.Drawing; using Eto.Forms; using Eto.Serialization.Xaml; using PlatformID = DiscImageChef.CommonTypes.Interop.PlatformID; using Version = DiscImageChef.CommonTypes.Interop.Version; namespace DiscImageChef.Gui { public class frmConsole : Form { public frmConsole() { XamlReader.Load(this); grdMessages.DataStore = ConsoleHandler.Entries; grdMessages.Columns.Add(new GridColumn { DataCell = new TextBoxCell {Binding = Binding.Property(r => $"{r.Timestamp}")}, HeaderText = "Time", Sortable = true }); grdMessages.Columns.Add(new GridColumn { DataCell = new TextBoxCell {Binding = Binding.Property(r => r.Type)}, HeaderText = "Type", Sortable = true }); grdMessages.Columns.Add(new GridColumn { DataCell = new TextBoxCell {Binding = Binding.Property(r => r.Module)}, HeaderText = "Module", Sortable = true }); grdMessages.Columns.Add(new GridColumn { DataCell = new TextBoxCell {Binding = Binding.Property(r => r.Message)}, HeaderText = "Message", Sortable = true }); grdMessages.AllowMultipleSelection = false; grdMessages.CellFormatting += (sender, e) => { if(((LogEntry)e.Item).Type.ToLower() != "error") return; e.BackgroundColor = Colors.Red; e.ForegroundColor = Colors.Black; }; grdMessages.AllowColumnReordering = true; chkDebug.Checked = ConsoleHandler.Debug; Closing += OnClosing; } void OnClosing(object sender, CancelEventArgs e) { // Otherwise if this closes it does not stop hearing events from collection, preventing console to keep working. grdMessages.DataStore = null; } protected void OnChkDebugChecked(object sender, EventArgs e) { ConsoleHandler.Debug = chkDebug.Checked.Value; } protected void OnBtnClearClicked(object sender, EventArgs e) { ConsoleHandler.Entries.Clear(); } protected void OnBtnSaveClicked(object sender, EventArgs e) { SaveFileDialog dlgSave = new SaveFileDialog {CheckFileExists = true}; dlgSave.Filters.Add(new FileFilter {Extensions = new[] {"log"}, Name = "Log files"}); DialogResult result = dlgSave.ShowDialog(this); if(result != DialogResult.Ok) return; try { FileStream logFs = new FileStream(dlgSave.FileName, FileMode.Create, FileAccess.ReadWrite); StreamWriter logSw = new StreamWriter(logFs); logSw.WriteLine("Log saved at {0}", DateTime.Now); PlatformID platId = DetectOS.GetRealPlatformID(); string platVer = DetectOS.GetVersion(); AssemblyInformationalVersionAttribute assemblyVersion = Attribute.GetCustomAttribute(typeof(DicConsole).Assembly, typeof(AssemblyInformationalVersionAttribute)) as AssemblyInformationalVersionAttribute; logSw.WriteLine("################# System information #################"); logSw.WriteLine("{0} {1} ({2}-bit)", DetectOS.GetPlatformName(platId, platVer), platVer, Environment.Is64BitOperatingSystem ? 64 : 32); if(DetectOS.IsMono) logSw.WriteLine("Mono {0}", Version.GetMonoVersion()); else logSw.WriteLine(".NET Framework {0}", Environment.Version); logSw.WriteLine(); logSw.WriteLine("################# Program information ################"); logSw.WriteLine("DiscImageChef {0}", assemblyVersion?.InformationalVersion); logSw.WriteLine("Running in {0}-bit", Environment.Is64BitProcess ? 64 : 32); logSw.WriteLine("Running GUI mode using {0}", Application.Instance.Platform.ID); #if DEBUG logSw.WriteLine("DEBUG version"); #endif logSw.WriteLine("Command line: {0}", Environment.CommandLine); logSw.WriteLine(); logSw.WriteLine("################# Console ################"); foreach(LogEntry entry in ConsoleHandler.Entries) if(entry.Type != "Info") logSw.WriteLine("{0}: ({1}) {2}", entry.Timestamp, entry.Type.ToLower(), entry.Message); else logSw.WriteLine("{0}: {1}", entry.Timestamp, entry.Message); logSw.Close(); logFs.Close(); } catch(Exception exception) { MessageBox.Show("Exception {0} trying to save logfile, details has been sent to console.", exception.Message); DicConsole.ErrorWriteLine("Console", exception.Message); DicConsole.ErrorWriteLine("Console", exception.StackTrace); } } #region XAML controls GridView grdMessages; CheckBox chkDebug; Button btnClear; Button btnSave; #endregion } }