OSDN Git Service

70f62d5e99db6a1ce88707e3f97012d8c5e66a99
[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 \r
184                     // TODO This is just Experimental Code. Just ignore it.\r
185                     ////if (encode.ActivityLog == null)\r
186                     ////{\r
187                     ////    appendText.AppendFormat("Waiting for the log file to be generated ...\n");\r
188                     ////    position = 0;\r
189                     ////    ClearWindowText();\r
190                     ////    PrintLogHeader();\r
191                     ////    return appendText;\r
192                     ////}\r
193 \r
194                     ////using (StringReader reader = new StringReader(encode.ActivityLog))\r
195                     ////{\r
196                     ////    string line;\r
197                     ////    int i = 1;\r
198                     ////    while ((line = reader.ReadLine()) != null)\r
199                     ////    {\r
200                     ////        if (i > position)\r
201                     ////        {\r
202                     ////            appendText.AppendLine(line);\r
203                     ////            position++;\r
204                     ////        }\r
205                     ////        i++;\r
206                     ////    }\r
207 \r
208                     ////}\r
209 \r
210                     // Start the Reader\r
211                     // Only use text which continues on from the last read line\r
212                     StreamReader sr = new StreamReader(logFile2);\r
213                     string line;\r
214                     int i = 1;\r
215                     while ((line = sr.ReadLine()) != null)\r
216                     {\r
217                         if (i > position)\r
218                         {\r
219                             appendText.AppendLine(line);\r
220                             position++;\r
221                         }\r
222                         i++;\r
223                     }\r
224                     sr.Close();\r
225                     sr.Dispose();\r
226                 }\r
227                 catch (Exception)\r
228                 {\r
229                     Reset();\r
230                     appendText = new StringBuilder();\r
231                     appendText.AppendLine("\nThe Log file is currently in use. Waiting for the log file to become accessible ...\n");\r
232                 }\r
233             }\r
234             return appendText;\r
235         }\r
236 \r
237         /// <summary>\r
238         /// Append text to the RTF box\r
239         /// </summary>\r
240         /// <param name="text">\r
241         /// The text.\r
242         /// </param>\r
243         private void AppendWindowText(StringBuilder text)\r
244         {\r
245             try\r
246             {\r
247                 if (IsHandleCreated)\r
248                 {\r
249                     if (rtf_actLog.InvokeRequired)\r
250                     {\r
251                         IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });\r
252                         EndInvoke(invoked);\r
253                     }\r
254                     else\r
255                         lock (rtf_actLog)\r
256                             rtf_actLog.AppendText(text.ToString());\r
257                 }\r
258             }\r
259             catch (Exception)\r
260             {\r
261                 return;\r
262             }\r
263         }\r
264 \r
265         /// <summary>\r
266         /// Clear the contents of the log window\r
267         /// </summary>\r
268         private void ClearWindowText()\r
269         {\r
270             try\r
271             {\r
272                 if (IsHandleCreated)\r
273                 {\r
274                     if (rtf_actLog.InvokeRequired)\r
275                     {\r
276                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));\r
277                         EndInvoke(invoked);\r
278                     }\r
279                     else\r
280                         lock (rtf_actLog)\r
281                             rtf_actLog.Clear();\r
282                 }\r
283             }\r
284             catch (Exception)\r
285             {\r
286                 return;\r
287             }\r
288         }\r
289 \r
290         /// <summary>\r
291         /// Display the log header\r
292         /// </summary>\r
293         private void PrintLogHeader()\r
294         {\r
295             try\r
296             {\r
297                 if (IsHandleCreated)\r
298                 {\r
299                     if (rtf_actLog.InvokeRequired)\r
300                     {\r
301                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(PrintLogHeader));\r
302                         EndInvoke(invoked);\r
303                     }\r
304                     else\r
305                     {\r
306                         lock (rtf_actLog)\r
307                         {\r
308                             // Print the log header. This function will be re-implimented later. Do not delete.\r
309                             StringBuilder header = new StringBuilder();\r
310 \r
311                             header.AppendLine(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version));\r
312                             header.AppendLine(String.Format("### Running: {0} \n###\n", Environment.OSVersion));\r
313                             header.AppendLine(String.Format("### CPU: {0} \n", SystemInfo.GetCpuCount));\r
314                             header.AppendLine(String.Format("### Ram: {0} MB \n", SystemInfo.TotalPhysicalMemory));\r
315                             header.AppendLine(String.Format("### Screen: {0}x{1} \n", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height));\r
316                             header.AppendLine(String.Format("### Temp Dir: {0} \n", Path.GetTempPath()));\r
317                             header.AppendLine(String.Format("### Install Dir: {0} \n", Application.StartupPath));\r
318                             header.AppendLine(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));\r
319                             header.AppendLine("#########################################\n\n");\r
320 \r
321                             rtf_actLog.AppendText(header.ToString());\r
322                         }\r
323                     }\r
324                 }\r
325             }\r
326             catch (Exception)\r
327             {\r
328                 return;\r
329             }\r
330         }\r
331 \r
332         /// <summary>\r
333         /// Reset Everything\r
334         /// </summary>\r
335         private void Reset()\r
336         {\r
337             if (windowTimer != null)\r
338                 windowTimer.Dispose();\r
339             position = 0;\r
340             ClearWindowText();\r
341             PrintLogHeader();\r
342             windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
343         }\r
344 \r
345         // Menus and Buttons\r
346 \r
347         /// <summary>\r
348         /// Copy log to clipboard\r
349         /// </summary>\r
350         /// <param name="sender">\r
351         /// The sender.\r
352         /// </param>\r
353         /// <param name="e">\r
354         /// The e.\r
355         /// </param>\r
356         private void MnuCopyLogClick(object sender, EventArgs e)\r
357         {\r
358             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
359         }\r
360 \r
361         /// <summary>\r
362         /// Open the log folder\r
363         /// </summary>\r
364         /// <param name="sender">\r
365         /// The sender.\r
366         /// </param>\r
367         /// <param name="e">\r
368         /// The e.\r
369         /// </param>\r
370         private void MnuOpenLogFolderClick(object sender, EventArgs e)\r
371         {\r
372             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
373             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
374             Process prc = new Process\r
375                               {\r
376                                   StartInfo =\r
377                                       {\r
378                                           FileName = windir + @"\explorer.exe",\r
379                                           Arguments = logDir\r
380                                       }\r
381                               };\r
382             prc.Start();\r
383         }\r
384 \r
385         /// <summary>\r
386         /// Copy the log\r
387         /// </summary>\r
388         /// <param name="sender">\r
389         /// The sender.\r
390         /// </param>\r
391         /// <param name="e">\r
392         /// The e.\r
393         /// </param>\r
394         private void BtnCopyClick(object sender, EventArgs e)\r
395         {\r
396             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
397         }\r
398 \r
399         /// <summary>\r
400         /// Set scan mode\r
401         /// </summary>\r
402         /// <param name="sender">\r
403         /// The sender.\r
404         /// </param>\r
405         /// <param name="e">\r
406         /// The e.\r
407         /// </param>\r
408         private void BtnScanLogClick(object sender, EventArgs e)\r
409         {\r
410             SetScanMode();\r
411         }\r
412 \r
413         /// <summary>\r
414         /// Set the encode mode\r
415         /// </summary>\r
416         /// <param name="sender">\r
417         /// The sender.\r
418         /// </param>\r
419         /// <param name="e">\r
420         /// The e.\r
421         /// </param>\r
422         private void BtnEncodeLogClick(object sender, EventArgs e)\r
423         {\r
424             SetEncodeMode();\r
425         }\r
426 \r
427         // Overrides\r
428 \r
429         /// <summary>\r
430         /// override onclosing\r
431         /// </summary>\r
432         /// <param name="e">\r
433         /// The e.\r
434         /// </param>\r
435         protected override void OnClosing(CancelEventArgs e)\r
436         {\r
437             windowTimer.Dispose();\r
438             e.Cancel = true;\r
439             this.Dispose();\r
440             base.OnClosing(e);\r
441         }\r
442     }\r
443 }