/* frmActivityWindow.cs $ This file is part of the HandBrake source code. Homepage: . It may be used under the terms of the GNU General Public License. */ namespace Handbrake { using System; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Text; using System.Threading; using System.Windows.Forms; using Functions; using Model; using Services; using Timer = System.Threading.Timer; /// /// The Activity Log Window /// public partial class frmActivityWindow : Form { /// /// The current position in the log file /// private int position; /// /// A Timer for this window /// private Timer windowTimer; /// /// The Encode Object /// private Encode encode; /// /// The Scan Object /// private Scan scan; /// /// The Type of log that the window is currently dealing with /// private ActivityLogMode mode; /// /// Initializes a new instance of the class. /// /// /// The mode. /// /// /// The encode. /// /// /// The scan. /// public frmActivityWindow(ActivityLogMode mode, Encode encode, Scan scan) { InitializeComponent(); this.encode = encode; this.scan = scan; this.mode = mode; this.position = 0; } /// /// A callback function for updating the ui /// /// /// The text. /// private delegate void SetTextCallback(StringBuilder text); /// /// Clear text callback /// private delegate void SetTextClearCallback(); // Public /// /// Set the window to scan mode /// /// /// The set Mode. /// public void SetMode(ActivityLogMode setMode) { Reset(); this.mode = setMode; this.Text = mode == ActivityLogMode.Scan ? "Activity Window (Scan Log)" : "Activity Window (Enocde Log)"; } // Logging /// /// On Window load, start a new timer /// /// /// The sender. /// /// /// The e. /// private void NewActivityWindow_Load(object sender, EventArgs e) { windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000); } /// /// Append new text to the window /// /// /// The n. /// private void LogMonitor(object n) { AppendWindowText(GetLog()); } /// /// New Code for getting the Activity log from the Services rather than reading a file. /// /// /// The StringBuilder containing a log /// private StringBuilder GetLog() { StringBuilder appendText = new StringBuilder(); if (this.mode == ActivityLogMode.Scan) { if (scan == null || scan.ActivityLog == string.Empty) { appendText.AppendFormat("Waiting for the log to be generated ...\n"); position = 0; ClearWindowText(); PrintLogHeader(); return appendText; } using (StringReader reader = new StringReader(scan.ActivityLog)) { LogReader(reader, appendText); } } else { if (encode == null || encode.ActivityLog == string.Empty) { appendText.AppendFormat("Waiting for the log to be generated ...\n"); position = 0; ClearWindowText(); PrintLogHeader(); return appendText; } using (StringReader reader = new StringReader(encode.ActivityLog)) { LogReader(reader, appendText); } } return appendText; } /// /// Reads the log data from a Scan or Encode object /// /// /// The reader. /// /// /// The append text. /// private void LogReader(StringReader reader, StringBuilder appendText) { string line; int i = 1; while ((line = reader.ReadLine()) != null) { if (i > position) { appendText.AppendLine(line); position++; } i++; } } /// /// Append text to the RTF box /// /// /// The text. /// private void AppendWindowText(StringBuilder text) { try { if (IsHandleCreated) { if (rtf_actLog.InvokeRequired) { IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text }); EndInvoke(invoked); } else lock (rtf_actLog) rtf_actLog.AppendText(text.ToString()); } } catch (Exception) { return; } } /// /// Clear the contents of the log window /// private void ClearWindowText() { try { if (IsHandleCreated) { if (rtf_actLog.InvokeRequired) { IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText)); EndInvoke(invoked); } else lock (rtf_actLog) rtf_actLog.Clear(); } } catch (Exception) { return; } } /// /// Display the log header /// private void PrintLogHeader() { try { if (IsHandleCreated) { if (rtf_actLog.InvokeRequired) { IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(PrintLogHeader)); EndInvoke(invoked); } else { lock (rtf_actLog) { // Print the log header. This function will be re-implimented later. Do not delete. StringBuilder header = new StringBuilder(); header.Append(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version)); header.Append(String.Format("### Running: {0} \n###\n", Environment.OSVersion)); header.Append(String.Format("### CPU: {0} \n", SystemInfo.GetCpuCount)); header.Append(String.Format("### Ram: {0} MB \n", SystemInfo.TotalPhysicalMemory)); header.Append(String.Format("### Screen: {0}x{1} \n", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height)); header.Append(String.Format("### Temp Dir: {0} \n", Path.GetTempPath())); header.Append(String.Format("### Install Dir: {0} \n", Application.StartupPath)); header.Append(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath)); header.Append("#########################################\n\n"); rtf_actLog.AppendText(header.ToString()); } } } } catch (Exception) { return; } } /// /// Reset Everything /// private void Reset() { if (windowTimer != null) windowTimer.Dispose(); position = 0; ClearWindowText(); PrintLogHeader(); windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000); } // Menus and Buttons /// /// Copy log to clipboard /// /// /// The sender. /// /// /// The e. /// private void MnuCopyLogClick(object sender, EventArgs e) { Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true); } /// /// Open the log folder /// /// /// The sender. /// /// /// The e. /// private void MnuOpenLogFolderClick(object sender, EventArgs e) { string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs"; string windir = Environment.GetEnvironmentVariable("WINDIR"); Process prc = new Process { StartInfo = { FileName = windir + @"\explorer.exe", Arguments = logDir } }; prc.Start(); } /// /// Copy the log /// /// /// The sender. /// /// /// The e. /// private void BtnCopyClick(object sender, EventArgs e) { Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true); } /// /// Set scan mode /// /// /// The sender. /// /// /// The e. /// private void BtnScanLogClick(object sender, EventArgs e) { SetMode(ActivityLogMode.Scan); } /// /// Set the encode mode /// /// /// The sender. /// /// /// The e. /// private void BtnEncodeLogClick(object sender, EventArgs e) { SetMode(ActivityLogMode.Encode); } // Overrides /// /// override onclosing /// /// /// The e. /// protected override void OnClosing(CancelEventArgs e) { windowTimer.Dispose(); e.Cancel = true; this.Dispose(); base.OnClosing(e); } } }