OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmActivityWindow.cs
1 /*  frmActivityWindow.cs $\r
2     This file is part of the HandBrake source code.\r
3     Homepage: <http://handbrake.fr>.\r
4     It may be used under the terms of the GNU General Public License. */\r
5 \r
6 namespace Handbrake\r
7 {\r
8     using System;\r
9     using System.ComponentModel;\r
10     using System.Diagnostics;\r
11     using System.IO;\r
12     using System.Text;\r
13     using System.Threading;\r
14     using System.Windows.Forms;\r
15     using Functions;\r
16     using Timer = System.Threading.Timer;\r
17 \r
18     /// <summary>\r
19     /// The Activity Log Window\r
20     /// </summary>\r
21     public partial class frmActivityWindow : Form\r
22     {\r
23         /// <summary>\r
24         /// The current position in the log file\r
25         /// </summary>\r
26         private int position;\r
27 \r
28         /// <summary>\r
29         /// The previous mode\r
30         /// </summary>\r
31         private string lastMode;\r
32 \r
33         /// <summary>\r
34         /// The current mode\r
35         /// </summary>\r
36         private string currentMode;\r
37 \r
38         /// <summary>\r
39         /// A Timer for this window\r
40         /// </summary>\r
41         private Timer windowTimer;\r
42 \r
43         /// <summary>\r
44         /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.\r
45         /// </summary>\r
46         /// <param name="mode">\r
47         /// The mode.\r
48         /// </param>\r
49         public frmActivityWindow(string mode)\r
50         {\r
51             InitializeComponent();\r
52 \r
53             position = 0;\r
54             if (mode == "scan")\r
55                 SetScanMode();\r
56             else\r
57                 SetEncodeMode();\r
58         }\r
59 \r
60         /// <summary>\r
61         /// A callback function for updating the ui\r
62         /// </summary>\r
63         /// <param name="text">\r
64         /// The text.\r
65         /// </param>\r
66         private delegate void SetTextCallback(StringBuilder text);\r
67 \r
68         /// <summary>\r
69         /// Clear text callback\r
70         /// </summary>\r
71         private delegate void SetTextClearCallback();\r
72 \r
73         // Public\r
74 \r
75         /// <summary>\r
76         /// Gets or sets SetLogFile.\r
77         /// </summary>\r
78         public string SetLogFile\r
79         {\r
80             get { return string.IsNullOrEmpty(currentMode) ? string.Empty : currentMode; }\r
81             set { currentMode = value; }\r
82         }\r
83 \r
84         /// <summary>\r
85         /// Set the window to scan mode\r
86         /// </summary>\r
87         public void SetScanMode()\r
88         {\r
89             Reset();\r
90             SetLogFile = "last_scan_log.txt";\r
91             this.Text = "Activity Window (Scan Log)";\r
92         }\r
93 \r
94         /// <summary>\r
95         /// Set the window to encode mode\r
96         /// </summary>\r
97         public void SetEncodeMode()\r
98         {\r
99             Reset();\r
100             SetLogFile = "last_encode_log.txt";\r
101             this.Text = "Activity Window (Enocde Log)";\r
102         }\r
103 \r
104         // Logging\r
105 \r
106         /// <summary>\r
107         /// On Window load, start a new timer\r
108         /// </summary>\r
109         /// <param name="sender">\r
110         /// The sender.\r
111         /// </param>\r
112         /// <param name="e">\r
113         /// The e.\r
114         /// </param>\r
115         private void NewActivityWindow_Load(object sender, EventArgs e)\r
116         {\r
117             windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
118         }\r
119 \r
120         /// <summary>\r
121         /// Append new text to the window\r
122         /// </summary>\r
123         /// <param name="n">\r
124         /// The n.\r
125         /// </param>\r
126         private void LogMonitor(object n)\r
127         {\r
128             if (SetLogFile != lastMode) Reset();\r
129 \r
130             // Perform the window update\r
131             switch (SetLogFile)\r
132             {\r
133                 case "last_scan_log.txt":\r
134                     AppendWindowText(ReadFile("last_scan_log.txt"));\r
135                     lastMode = "last_scan_log.txt";\r
136                     break;\r
137                 case "last_encode_log.txt":\r
138                     AppendWindowText(ReadFile("last_encode_log.txt"));\r
139                     lastMode = "last_encode_log.txt";\r
140                     break;\r
141             }\r
142         }\r
143 \r
144         /// <summary>\r
145         /// Read the log file\r
146         /// </summary>\r
147         /// <param name="file">\r
148         /// The file.\r
149         /// </param>\r
150         /// <returns>\r
151         /// A string builder containing the log data\r
152         /// </returns>\r
153         private StringBuilder ReadFile(string file)\r
154         {\r
155             StringBuilder appendText = new StringBuilder();\r
156             lock (this)\r
157             {\r
158                 // last_encode_log.txt is the primary log file. Since .NET can't read this file whilst the CLI is outputing to it (Not even in read only mode),\r
159                 // we'll need to make a copy of it.\r
160                 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +\r
161                                 "\\HandBrake\\logs";\r
162                 string logFile = Path.Combine(logDir, file);\r
163                 string logFile2 = Path.Combine(logDir, "tmp_appReadable_log.txt");\r
164 \r
165                 try\r
166                 {\r
167                     // Make sure the application readable log file does not already exist. FileCopy fill fail if it does.\r
168                     if (File.Exists(logFile2))\r
169                         File.Delete(logFile2);\r
170 \r
171                     // Copy the log file.\r
172                     if (File.Exists(logFile))\r
173                         File.Copy(logFile, logFile2, true);\r
174                     else\r
175                     {\r
176                         appendText.AppendFormat("Waiting for the log file to be generated ...\n");\r
177                         position = 0;\r
178                         ClearWindowText();\r
179                         PrintLogHeader();\r
180                         return appendText;\r
181                     }\r
182 \r
183                     // Start the Reader\r
184                     // Only use text which continues on from the last read line\r
185                     StreamReader sr = new StreamReader(logFile2);\r
186                     string line;\r
187                     int i = 1;\r
188                     while ((line = sr.ReadLine()) != null)\r
189                     {\r
190                         if (i > position)\r
191                         {\r
192                             appendText.AppendLine(line);\r
193                             position++;\r
194                         }\r
195                         i++;\r
196                     }\r
197                     sr.Close();\r
198                     sr.Dispose();\r
199                 }\r
200                 catch (Exception)\r
201                 {\r
202                     Reset();\r
203                     appendText = new StringBuilder();\r
204                     appendText.AppendLine("\nThe Log file is currently in use. Waiting for the log file to become accessible ...\n");\r
205                 }\r
206             }\r
207             return appendText;\r
208         }\r
209 \r
210         /// <summary>\r
211         /// Append text to the RTF box\r
212         /// </summary>\r
213         /// <param name="text">\r
214         /// The text.\r
215         /// </param>\r
216         private void AppendWindowText(StringBuilder text)\r
217         {\r
218             try\r
219             {\r
220                 if (IsHandleCreated)\r
221                 {\r
222                     if (rtf_actLog.InvokeRequired)\r
223                     {\r
224                         IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });\r
225                         EndInvoke(invoked);\r
226                     }\r
227                     else\r
228                         lock (rtf_actLog)\r
229                             rtf_actLog.AppendText(text.ToString());\r
230                 }\r
231             }\r
232             catch (Exception)\r
233             {\r
234                 return;\r
235             }\r
236         }\r
237 \r
238         /// <summary>\r
239         /// Clear the contents of the log window\r
240         /// </summary>\r
241         private void ClearWindowText()\r
242         {\r
243             try\r
244             {\r
245                 if (IsHandleCreated)\r
246                 {\r
247                     if (rtf_actLog.InvokeRequired)\r
248                     {\r
249                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));\r
250                         EndInvoke(invoked);\r
251                     }\r
252                     else\r
253                         lock (rtf_actLog)\r
254                             rtf_actLog.Clear();\r
255                 }\r
256             }\r
257             catch (Exception)\r
258             {\r
259                 return;\r
260             }\r
261         }\r
262 \r
263         /// <summary>\r
264         /// Display the log header\r
265         /// </summary>\r
266         private void PrintLogHeader()\r
267         {\r
268             try\r
269             {\r
270                 if (IsHandleCreated)\r
271                 {\r
272                     if (rtf_actLog.InvokeRequired)\r
273                     {\r
274                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(PrintLogHeader));\r
275                         EndInvoke(invoked);\r
276                     }\r
277                     else\r
278                     {\r
279                         lock (rtf_actLog)\r
280                         {\r
281                             // Print the log header. This function will be re-implimented later. Do not delete.\r
282                             StringBuilder header = new StringBuilder();\r
283 \r
284                             header.AppendLine(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version));\r
285                             header.AppendLine(String.Format("### Running: {0} \n###\n", Environment.OSVersion));\r
286                             header.AppendLine(String.Format("### CPU: {0} \n", SystemInfo.GetCpuCount));\r
287                             header.AppendLine(String.Format("### Ram: {0} MB \n", SystemInfo.TotalPhysicalMemory));\r
288                             header.AppendLine(String.Format("### Screen: {0}x{1} \n", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height));\r
289                             header.AppendLine(String.Format("### Temp Dir: {0} \n", Path.GetTempPath()));\r
290                             header.AppendLine(String.Format("### Install Dir: {0} \n", Application.StartupPath));\r
291                             header.AppendLine(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));\r
292                             header.AppendLine("#########################################\n\n");\r
293 \r
294                             rtf_actLog.AppendText(header.ToString());\r
295                         }\r
296                     }\r
297                 }\r
298             }\r
299             catch (Exception)\r
300             {\r
301                 return;\r
302             }\r
303         }\r
304 \r
305         /// <summary>\r
306         /// Reset Everything\r
307         /// </summary>\r
308         private void Reset()\r
309         {\r
310             if (windowTimer != null)\r
311                 windowTimer.Dispose();\r
312             position = 0;\r
313             ClearWindowText();\r
314             PrintLogHeader();\r
315             windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
316         }\r
317 \r
318         // Menus and Buttons\r
319 \r
320         /// <summary>\r
321         /// Copy log to clipboard\r
322         /// </summary>\r
323         /// <param name="sender">\r
324         /// The sender.\r
325         /// </param>\r
326         /// <param name="e">\r
327         /// The e.\r
328         /// </param>\r
329         private void MnuCopyLogClick(object sender, EventArgs e)\r
330         {\r
331             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
332         }\r
333 \r
334         /// <summary>\r
335         /// Open the log folder\r
336         /// </summary>\r
337         /// <param name="sender">\r
338         /// The sender.\r
339         /// </param>\r
340         /// <param name="e">\r
341         /// The e.\r
342         /// </param>\r
343         private void MnuOpenLogFolderClick(object sender, EventArgs e)\r
344         {\r
345             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
346             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
347             Process prc = new Process\r
348                               {\r
349                                   StartInfo =\r
350                                       {\r
351                                           FileName = windir + @"\explorer.exe",\r
352                                           Arguments = logDir\r
353                                       }\r
354                               };\r
355             prc.Start();\r
356         }\r
357 \r
358         /// <summary>\r
359         /// Copy the log\r
360         /// </summary>\r
361         /// <param name="sender">\r
362         /// The sender.\r
363         /// </param>\r
364         /// <param name="e">\r
365         /// The e.\r
366         /// </param>\r
367         private void BtnCopyClick(object sender, EventArgs e)\r
368         {\r
369             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
370         }\r
371 \r
372         /// <summary>\r
373         /// Set scan mode\r
374         /// </summary>\r
375         /// <param name="sender">\r
376         /// The sender.\r
377         /// </param>\r
378         /// <param name="e">\r
379         /// The e.\r
380         /// </param>\r
381         private void BtnScanLogClick(object sender, EventArgs e)\r
382         {\r
383             SetScanMode();\r
384         }\r
385 \r
386         /// <summary>\r
387         /// Set the encode mode\r
388         /// </summary>\r
389         /// <param name="sender">\r
390         /// The sender.\r
391         /// </param>\r
392         /// <param name="e">\r
393         /// The e.\r
394         /// </param>\r
395         private void BtnEncodeLogClick(object sender, EventArgs e)\r
396         {\r
397             SetEncodeMode();\r
398         }\r
399 \r
400         // Overrides\r
401 \r
402         /// <summary>\r
403         /// override onclosing\r
404         /// </summary>\r
405         /// <param name="e">\r
406         /// The e.\r
407         /// </param>\r
408         protected override void OnClosing(CancelEventArgs e)\r
409         {\r
410             windowTimer.Dispose();\r
411             e.Cancel = true;\r
412             this.Dispose();\r
413             base.OnClosing(e);\r
414         }\r
415     }\r
416 }