#define ALLOW_LOG_CLEARING // when defined will allow the log to be cleared using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace RomCheater.Logging { public partial class LogWriter : UserControl { private delegate string OnGetLogText(); private delegate void OnSetLogText(string value); private delegate void GenericVoidDelegate(); private OnGetLogText HandleGetLogText = null; private OnSetLogText HandleSetLogText = null; private GenericVoidDelegate delegate_EndLogUpdate = null; public LogWriter() : this(false) { } public LogWriter(bool redirectConsole) { InitializeComponent(); this.Log = new LogStream(this); HandleGetLogText += new OnGetLogText(GetLogText); HandleSetLogText += new OnSetLogText(SetLogText); delegate_EndLogUpdate += new GenericVoidDelegate(EndLogUpdate); this.RedirectConsoleOutput = redirectConsole; toolTip1.SetToolTip(btnClearLog, "Clears the Log"); toolTip1.SetToolTip(btnCopyLogToClipboard, "Copies the Log to the Clipboard"); ms = new MemoryStream(); sw = new StreamWriter(ms); sw.AutoFlush = true; sr = new StreamReader(ms); } private LogStream _Log; public LogStream Log { get { return _Log; } private set { _Log = value; } } private MemoryStream ms; private StreamWriter sw; private StreamReader sr; private bool _RedirectConsoleOutput; public bool RedirectConsoleOutput { get { return _RedirectConsoleOutput; } set { _RedirectConsoleOutput = value; if (value) { Console.SetOut(this.Log); } else { Stream stream = Console.OpenStandardOutput(0x100); TextWriter writer = null; if (stream == Stream.Null) { writer = TextWriter.Synchronized(StreamWriter.Null); } Encoding encoding = this.Log.Encoding; StreamWriter writer2 = new StreamWriter(stream, encoding, 0x100); //writer2.HaveWrittenPreamble = true; writer2.AutoFlush = true; writer = TextWriter.Synchronized(writer2); Console.SetOut(writer); } } } private void btnClearLog_Click(object sender, EventArgs e) { this.Clear(true); } private void btnCopyLogToClipboard_Click(object sender, EventArgs e) { Clipboard.SetText(GetLogText()); } private string PreserveLineEndings(string text) { return text.Replace("\n", System.Environment.NewLine); } private bool BeginUpdate; public void BeginLogUpdate() { BeginUpdate = true; } public void EndLogUpdate() { if (txtLog.InvokeRequired) { this.Invoke(delegate_EndLogUpdate); } else { StringReader _sr = new StringReader(GetLogText()); List lines = new List(); string line = ""; while ((line = _sr.ReadLine()) != null) { lines.Add(line); } txtLog.Lines = lines.ToArray(); BeginUpdate = false; } } private string StreamToString() { string value = ""; sr = new StreamReader(ms); sr.BaseStream.Seek(0, SeekOrigin.Begin); value = sr.ReadToEnd(); return value; } public string GetLogText() { //if (txtLog.InvokeRequired) //{ // return (string)this.Invoke(HandleGetLogText, new object[] { }); //} //else //{ return PreserveLineEndings(StreamToString()); //} } public void SetLogText(string value) { //if (txtLog.InvokeRequired) //{ // this.Invoke(HandleSetLogText, new object[] { value }); //} //else //{ // txtLog.AppendText(value); //} sw.Write(value); } new public string Text { get { throw new InvalidOperationException("Please use GetLogText()"); } private set { throw new InvalidOperationException("Please use SetLogText(string value)"); } } public void Clear() { Clear(false); } private void Clear(bool force) { bool allow_log_clearing = false; #if ALLOW_LOG_CLEARING allow_log_clearing = true; #endif if (force || allow_log_clearing) { txtLog.Clear(); ms = new MemoryStream(); sw = new StreamWriter(ms); sw.AutoFlush = true; sr = new StreamReader(ms); } } #region sub-classes public class LogStream : TextWriter { public LogStream() : this(null) { } public LogStream(LogWriter text) : base() { _text_writer = text; this.NewLine = "\n"; } private LogWriter _text_writer; private void _write(string message) { if (_text_writer == null) return; _text_writer.SetLogText(string.Format("{0}", message)); } #region Overriden Methods public override Encoding Encoding { get { return Encoding.UTF8; } } public override void Write(char value) { base.Write(value); _write(value.ToString()); if (!_text_writer.BeginUpdate) _text_writer.EndLogUpdate(); } #endregion } #endregion } }