ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/RomCheater/trunk/RomCheater.Logging/LogWriter.cs
Revision: 246
Committed: Sun Jun 3 15:15:51 2012 UTC (11 years, 6 months ago) by william
File size: 9104 byte(s)
Log Message:

File Contents

# User Rev Content
1 william 17 #define ALLOW_LOG_CLEARING // when defined will allow the log to be cleared
2     using System;
3     using System.Collections.Generic;
4     using System.ComponentModel;
5     using System.Drawing;
6     using System.Data;
7     using System.Linq;
8     using System.Text;
9     using System.Windows.Forms;
10     using System.IO;
11 william 23 using System.Reflection;
12 william 17
13     namespace RomCheater.Logging
14     {
15     public partial class LogWriter : UserControl
16     {
17 william 61 private static string LOG_PATH { get { return string.Format(@"{0}\{1}", typeof(LogWriter).Assembly.Location.Replace("RomCheater.Logging.dll", ""), LoggingConstants.AppLogFile); } }
18 william 18
19 william 17 private delegate string OnGetLogText();
20     private delegate void OnSetLogText(string value);
21     private delegate void GenericVoidDelegate();
22    
23     private OnGetLogText HandleGetLogText = null;
24     private OnSetLogText HandleSetLogText = null;
25     private GenericVoidDelegate delegate_EndLogUpdate = null;
26    
27     public LogWriter() : this(false) { }
28     public LogWriter(bool redirectConsole)
29     {
30     InitializeComponent();
31     this.Log = new LogStream(this);
32     HandleGetLogText += new OnGetLogText(GetLogText);
33     HandleSetLogText += new OnSetLogText(SetLogText);
34    
35     delegate_EndLogUpdate += new GenericVoidDelegate(EndLogUpdate);
36    
37     this.RedirectConsoleOutput = redirectConsole;
38     toolTip1.SetToolTip(btnClearLog, "Clears the Log");
39     toolTip1.SetToolTip(btnCopyLogToClipboard, "Copies the Log to the Clipboard");
40 william 18
41 william 17 ms = new MemoryStream();
42     sw = new StreamWriter(ms);
43     sw.AutoFlush = true;
44     sr = new StreamReader(ms);
45     }
46     private LogStream _Log;
47 william 18 public LogStream Log { get { return _Log; } private set { _Log = value; } }
48 william 17
49    
50     private MemoryStream ms;
51     private StreamWriter sw;
52     private StreamReader sr;
53 william 105 private bool _AutoScroll;
54     new public bool AutoScroll { get { return _AutoScroll; } set { _AutoScroll = value; autoscroll_timer.Enabled = value; } }
55 william 17
56     private bool _RedirectConsoleOutput;
57     public bool RedirectConsoleOutput
58     {
59     get { return _RedirectConsoleOutput; }
60     set
61     {
62     _RedirectConsoleOutput = value;
63 william 18 if (value) { Console.SetOut(this.Log); }
64     else
65 william 17 {
66     Stream stream = Console.OpenStandardOutput(0x100);
67     TextWriter writer = null;
68     if (stream == Stream.Null) { writer = TextWriter.Synchronized(StreamWriter.Null); }
69     Encoding encoding = this.Log.Encoding;
70     StreamWriter writer2 = new StreamWriter(stream, encoding, 0x100);
71     //writer2.HaveWrittenPreamble = true;
72     writer2.AutoFlush = true;
73     writer = TextWriter.Synchronized(writer2);
74 william 18 Console.SetOut(writer);
75 william 17 }
76     }
77     }
78    
79     private void btnClearLog_Click(object sender, EventArgs e) { this.Clear(true); }
80     private void btnCopyLogToClipboard_Click(object sender, EventArgs e) { Clipboard.SetText(GetLogText()); }
81    
82    
83     private string PreserveLineEndings(string text) { return text.Replace("\n", System.Environment.NewLine); }
84    
85    
86     private bool BeginUpdate;
87     public void BeginLogUpdate()
88     {
89     BeginUpdate = true;
90     }
91     public void EndLogUpdate()
92     {
93     if (txtLog.InvokeRequired)
94     {
95     this.Invoke(delegate_EndLogUpdate);
96     }
97     else
98     {
99     StringReader _sr = new StringReader(GetLogText());
100     List<string> lines = new List<string>();
101     string line = "";
102     while ((line = _sr.ReadLine()) != null)
103     {
104     lines.Add(line);
105     }
106     txtLog.Lines = lines.ToArray();
107     BeginUpdate = false;
108     }
109     }
110     private string StreamToString()
111     {
112     string value = "";
113     sr = new StreamReader(ms);
114     sr.BaseStream.Seek(0, SeekOrigin.Begin);
115     value = sr.ReadToEnd();
116     return value;
117     }
118     public string GetLogText()
119     {
120     //if (txtLog.InvokeRequired)
121     //{
122     // return (string)this.Invoke(HandleGetLogText, new object[] { });
123     //}
124     //else
125     //{
126     return PreserveLineEndings(StreamToString());
127     //}
128    
129     }
130     public void SetLogText(string value)
131     {
132 william 18 FileStream fs = new FileStream(LOG_PATH, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
133     StreamWriter writer = new StreamWriter(fs);
134     writer.AutoFlush = true;
135 william 19 if (value == Log.NewLine) { writer.Write(System.Environment.NewLine); }
136     else { writer.Write(value); }
137 william 18 writer.Close();
138 william 106 //string text = value.Replace(System.Environment.NewLine,"");
139     string text = value.Replace(System.Environment.NewLine, Log.NewLine);
140 william 155 //if (text.StartsWith(Log.NewLine))
141     //{
142     // text = text.Remove(0, Log.NewLine.Length);
143     //}
144 william 106 sw.Write(text);
145 william 105 Application.DoEvents();
146 william 17 }
147 william 105
148 william 17 new public string Text
149     {
150     get
151     {
152     throw new InvalidOperationException("Please use GetLogText()");
153     }
154     private set
155     {
156     throw new InvalidOperationException("Please use SetLogText(string value)");
157     }
158     }
159 william 23 public void CreateNewLog(bool delete)
160 william 22 {
161 william 23 if (delete)
162     {
163     FileInfo fi = new FileInfo(LOG_PATH);
164     if (fi.Exists)
165     fi.Delete();
166     }
167 william 105 Log.WriteLine("{0} ({2} v{3} {4}) created on {1}", LoggingConstants.AppLogFile, DateTime.Now.ToString(), LoggingConstants.AppName, LoggingConstants.AppVersion, LoggingConstants.AppBuild);
168 william 22 }
169 william 18 public void Clear()
170 william 17 {
171     Clear(false);
172     }
173     private void Clear(bool force)
174     {
175     bool allow_log_clearing = false;
176     #if ALLOW_LOG_CLEARING
177     allow_log_clearing = true;
178     #endif
179     if (force || allow_log_clearing)
180     {
181 william 18
182 william 17 txtLog.Clear();
183     ms = new MemoryStream();
184     sw = new StreamWriter(ms);
185     sw.AutoFlush = true;
186     sr = new StreamReader(ms);
187     }
188     }
189     #region sub-classes
190     public class LogStream : TextWriter
191 william 18 {
192 william 105 private StringBuilder strMessage = new StringBuilder();
193 william 17 public LogStream() : this(null) { }
194     public LogStream(LogWriter text) : base() { _text_writer = text; this.NewLine = "\n"; }
195     private LogWriter _text_writer;
196 william 155 private void _write(string message) { if (_text_writer == null) return; _text_writer.SetLogText(string.Format("{0}", message)); }
197 william 17 #region Overriden Methods
198     public override Encoding Encoding { get { return Encoding.UTF8; } }
199     public override void Write(char value) { base.Write(value); _write(value.ToString()); if (!_text_writer.BeginUpdate) _text_writer.EndLogUpdate(); }
200 william 18 #endregion
201 william 17 }
202 william 18 #endregion
203 william 105
204     private void autoscroll_timer_Tick(object sender, EventArgs e)
205 william 155 {
206 william 113 try
207     {
208     if (this.DesignMode) { return; }
209 william 155 ////txtLog.ScrollToEnd();
210     //txtLog.SelectionStart = txtLog.Text.Length - 100;
211 william 113 //txtLog.ScrollToCaret();
212     //txtLog.Refresh();
213 william 105
214 william 246 //txtLog.SelectionStart = 0;
215     //txtLog.ScrollToCaret();
216     //txtLog.Refresh();
217 william 105
218 william 246 //int last_line_position = -1;
219     //int position = -1;
220 william 113 int len = txtLog.Text.Length;
221 william 246 //StringReader sr = new StringReader(this.StreamToString());
222     //string line = "";
223     //while ((line = sr.ReadLine()) != null)
224     //{
225     // position += (line.Length * 2);
226     // last_line_position = (line.Length * 2);
227     // //if (line.EndsWith("/n"))
228     // //{
229     // // position++;
230     // //}
231     // //logger.VerboseDebug.WriteLine("current line: {0}", line);
232     //}
233     txtLog.SelectionStart = len;
234 william 113 txtLog.ScrollToCaret();
235     txtLog.Refresh();
236     //autoscroll_timer.Enabled = false;
237 william 105 }
238 william 113 catch { }
239 william 105
240     }
241 william 17 }
242     }
243 william 105