/[RomCheater]/trunk/RomCheater.Logging/LogWriter.cs
ViewVC logotype

Annotation of /trunk/RomCheater.Logging/LogWriter.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 105 - (hide annotations) (download)
Thu May 10 10:53:07 2012 UTC (8 years, 9 months ago) by william
File size: 9681 byte(s)

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     //if (txtLog.InvokeRequired)
133     //{
134     // this.Invoke(HandleSetLogText, new object[] { value });
135     //}
136     //else
137     //{
138     // txtLog.AppendText(value);
139     //}
140 william 18 FileStream fs = new FileStream(LOG_PATH, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
141     StreamWriter writer = new StreamWriter(fs);
142     writer.AutoFlush = true;
143 william 19 if (value == Log.NewLine) { writer.Write(System.Environment.NewLine); }
144     else { writer.Write(value); }
145 william 18 writer.Close();
146 william 17 sw.Write(value);
147 william 105 Application.DoEvents();
148 william 17 }
149 william 105
150 william 17 new public string Text
151     {
152     get
153     {
154     throw new InvalidOperationException("Please use GetLogText()");
155     }
156     private set
157     {
158     throw new InvalidOperationException("Please use SetLogText(string value)");
159     }
160     }
161 william 23 public void CreateNewLog(bool delete)
162 william 22 {
163 william 23 if (delete)
164     {
165     FileInfo fi = new FileInfo(LOG_PATH);
166     if (fi.Exists)
167     fi.Delete();
168     }
169 william 105 Log.WriteLine("{0} ({2} v{3} {4}) created on {1}", LoggingConstants.AppLogFile, DateTime.Now.ToString(), LoggingConstants.AppName, LoggingConstants.AppVersion, LoggingConstants.AppBuild);
170 william 22 }
171 william 18 public void Clear()
172 william 17 {
173     Clear(false);
174     }
175     private void Clear(bool force)
176     {
177     bool allow_log_clearing = false;
178     #if ALLOW_LOG_CLEARING
179     allow_log_clearing = true;
180     #endif
181     if (force || allow_log_clearing)
182     {
183 william 18
184 william 17 txtLog.Clear();
185     ms = new MemoryStream();
186     sw = new StreamWriter(ms);
187     sw.AutoFlush = true;
188     sr = new StreamReader(ms);
189     }
190     }
191     #region sub-classes
192     public class LogStream : TextWriter
193 william 18 {
194 william 105 private StringBuilder strMessage = new StringBuilder();
195 william 17 public LogStream() : this(null) { }
196     public LogStream(LogWriter text) : base() { _text_writer = text; this.NewLine = "\n"; }
197     private LogWriter _text_writer;
198 william 105 private void _write(string message)
199     {
200     if (_text_writer == null) return;
201    
202     if (message.EndsWith("\n"))
203     {
204     //_text_writer.SetLogText(string.Format("{0}", strMessage.ToString()));
205     while (_text_writer.logupdater.IsBusy)
206     {
207     Application.DoEvents();
208     }
209     _text_writer.logupdater.RunWorkerAsync((string.Format("{0}", strMessage.ToString())));
210     strMessage = new StringBuilder();
211     }
212     strMessage.Append(message);
213     }
214 william 17 #region Overriden Methods
215     public override Encoding Encoding { get { return Encoding.UTF8; } }
216     public override void Write(char value) { base.Write(value); _write(value.ToString()); if (!_text_writer.BeginUpdate) _text_writer.EndLogUpdate(); }
217 william 18 #endregion
218 william 17 }
219 william 18 #endregion
220 william 105
221     private void autoscroll_timer_Tick(object sender, EventArgs e)
222     {
223     if (this.DesignMode) { return; }
224     //txtLog.ScrollToEnd();
225     //txtLog.SelectionStart = txtLog.Text.Length-100;
226     //txtLog.ScrollToCaret();
227     //txtLog.Refresh();
228    
229     txtLog.SelectionStart = 0;
230     txtLog.ScrollToCaret();
231     txtLog.Refresh();
232    
233     int last_line_position = -1;
234     int position = -1;
235     int len = txtLog.Text.Length;
236     StringReader sr = new StringReader(this.StreamToString());
237     string line = "";
238     while ((line = sr.ReadLine()) != null)
239     {
240     position += (line.Length);
241     last_line_position = (line.Length*2);
242     //if (line.EndsWith("/n"))
243     //{
244     // position++;
245     //}
246     //logger.VerboseDebug.WriteLine("current line: {0}", line);
247     }
248     txtLog.SelectionStart = position;
249     txtLog.ScrollToCaret();
250     txtLog.Refresh();
251     //autoscroll_timer.Enabled = false;
252     }
253    
254     private void logupdater_DoWork(object sender, DoWorkEventArgs e)
255     {
256     string message = e.Argument.ToString();
257     SetLogText(string.Format("{0}", message));
258     }
259    
260     private void logupdater_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
261     {
262    
263     }
264 william 17 }
265     }
266 william 105

  ViewVC Help
Powered by ViewVC 1.1.22