OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmActivityWindow.cs
1 /*  frmActivityWindow.cs $\r
2         \r
3            This file is part of the HandBrake source code.\r
4            Homepage: <http://handbrake.fr>.\r
5            It may be used under the terms of the GNU General Public License. */\r
6 \r
7 namespace Handbrake\r
8 {\r
9     using System;\r
10     using System.ComponentModel;\r
11     using System.Diagnostics;\r
12     using System.IO;\r
13     using System.Text;\r
14     using System.Threading;\r
15     using System.Windows.Forms;\r
16     using Functions;\r
17     using Timer = System.Threading.Timer;\r
18 \r
19     public partial class frmActivityWindow : Form\r
20     {\r
21         private delegate void SetTextCallback(StringBuilder text);\r
22 \r
23         private delegate void SetTextClearCallback();\r
24 \r
25         private int Position;\r
26         private string LastMode;\r
27         private string CurrentMode;\r
28         private Timer WindowTimer;\r
29 \r
30         public frmActivityWindow(string mode)\r
31         {\r
32             InitializeComponent();\r
33 \r
34             Position = 0;\r
35             if (mode == "scan")\r
36                 SetScanMode();\r
37             else\r
38                 SetEncodeMode();\r
39         }\r
40 \r
41         private void NewActivityWindow_Load(object sender, EventArgs e)\r
42         {\r
43             WindowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
44         }\r
45 \r
46         private void LogMonitor(object n)\r
47         {\r
48             if (SetLogFile != LastMode) Reset();\r
49 \r
50             // Perform the window update\r
51             switch (SetLogFile)\r
52             {\r
53                 case "last_scan_log.txt":\r
54                     AppendWindowText(ReadFile("last_scan_log.txt"));\r
55                     LastMode = "last_scan_log.txt";\r
56                     break;\r
57                 case "last_encode_log.txt":\r
58                     AppendWindowText(ReadFile("last_encode_log.txt"));\r
59                     LastMode = "last_encode_log.txt";\r
60                     break;\r
61             }\r
62         }\r
63 \r
64         private StringBuilder ReadFile(string file)\r
65         {\r
66             StringBuilder appendText = new StringBuilder();\r
67             lock (this)\r
68             {\r
69                 // 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
70                 // we'll need to make a copy of it.\r
71                 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +\r
72                                 "\\HandBrake\\logs";\r
73                 string logFile = Path.Combine(logDir, file);\r
74                 string logFile2 = Path.Combine(logDir, "tmp_appReadable_log.txt");\r
75 \r
76                 try\r
77                 {\r
78                     // Make sure the application readable log file does not already exist. FileCopy fill fail if it does.\r
79                     if (File.Exists(logFile2))\r
80                         File.Delete(logFile2);\r
81 \r
82                     // Copy the log file.\r
83                     if (File.Exists(logFile))\r
84                         File.Copy(logFile, logFile2, true);\r
85                     else\r
86                     {\r
87                         appendText.AppendFormat("Waiting for the log file to be generated ...\n");\r
88                         Position = 0;\r
89                         ClearWindowText();\r
90                         PrintLogHeader();\r
91                         return appendText;\r
92                     }\r
93 \r
94                     // Start the Reader\r
95                     // Only use text which continues on from the last read line\r
96                     StreamReader sr = new StreamReader(logFile2);\r
97                     string line;\r
98                     int i = 1;\r
99                     while ((line = sr.ReadLine()) != null)\r
100                     {\r
101                         if (i > Position)\r
102                         {\r
103                             appendText.AppendLine(line);\r
104                             Position++;\r
105                         }\r
106                         i++;\r
107                     }\r
108                     sr.Close();\r
109                     sr.Dispose();\r
110                 }\r
111                 catch (Exception)\r
112                 {\r
113                     Reset();\r
114                     appendText = new StringBuilder();\r
115                     appendText.AppendFormat(\r
116                         "\nThe Log file is currently in use. Waiting for the log file to become accessible ...\n");\r
117                 }\r
118             }\r
119             return appendText;\r
120         }\r
121 \r
122         private void AppendWindowText(StringBuilder text)\r
123         {\r
124             try\r
125             {\r
126                 if (IsHandleCreated)\r
127                 {\r
128                     if (rtf_actLog.InvokeRequired)\r
129                     {\r
130                         IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] {text});\r
131                         EndInvoke(invoked);\r
132                     }\r
133                     else\r
134                         lock (rtf_actLog)\r
135                             rtf_actLog.AppendText(text.ToString());\r
136                 }\r
137             }\r
138             catch (Exception)\r
139             {\r
140                 return;\r
141             }\r
142         }\r
143 \r
144         private void ClearWindowText()\r
145         {\r
146             try\r
147             {\r
148                 if (IsHandleCreated)\r
149                 {\r
150                     if (rtf_actLog.InvokeRequired)\r
151                     {\r
152                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));\r
153                         EndInvoke(invoked);\r
154                     }\r
155                     else\r
156                         lock (rtf_actLog)\r
157                             rtf_actLog.Clear();\r
158                 }\r
159             }\r
160             catch (Exception)\r
161             {\r
162                 return;\r
163             }\r
164         }\r
165 \r
166         private void PrintLogHeader()\r
167         {\r
168             try\r
169             {\r
170                 if (IsHandleCreated)\r
171                 {\r
172                     if (rtf_actLog.InvokeRequired)\r
173                     {\r
174                         IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(PrintLogHeader));\r
175                         EndInvoke(invoked);\r
176                     }\r
177                     else\r
178                     {\r
179                         lock (rtf_actLog)\r
180                         {\r
181                             // Print the log header. This function will be re-implimented later. Do not delete.\r
182                             rtf_actLog.AppendText(String.Format("### Windows GUI {1} {0} \n", \r
183                                                                 Properties.Settings.Default.hb_build, \r
184                                                                 Properties.Settings.Default.hb_version));\r
185                             rtf_actLog.AppendText(String.Format("### Running: {0} \n###\n", Environment.OSVersion));\r
186                             rtf_actLog.AppendText(String.Format("### CPU: {0} \n", SystemInfo.GetCpuCount));\r
187                             rtf_actLog.AppendText(String.Format("### Ram: {0} MB \n", SystemInfo.TotalPhysicalMemory));\r
188                             rtf_actLog.AppendText(String.Format("### Screen: {0}x{1} \n", \r
189                                                                 SystemInfo.ScreenBounds.Bounds.Width, \r
190                                                                 SystemInfo.ScreenBounds.Bounds.Height));\r
191                             rtf_actLog.AppendText(String.Format("### Temp Dir: {0} \n", Path.GetTempPath()));\r
192                             rtf_actLog.AppendText(String.Format("### Install Dir: {0} \n", Application.StartupPath));\r
193                             rtf_actLog.AppendText(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));\r
194                             rtf_actLog.AppendText("#########################################\n\n");\r
195                         }\r
196                     }\r
197                 }\r
198             }\r
199             catch (Exception)\r
200             {\r
201                 return;\r
202             }\r
203         }\r
204 \r
205         private void Reset()\r
206         {\r
207             if (WindowTimer != null)\r
208                 WindowTimer.Dispose();\r
209             Position = 0;\r
210             ClearWindowText();\r
211             PrintLogHeader();\r
212             WindowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
213         }\r
214 \r
215         #region Public\r
216 \r
217         public string SetLogFile\r
218         {\r
219             get { return string.IsNullOrEmpty(CurrentMode) ? string.Empty : CurrentMode; }\r
220             set { CurrentMode = value; }\r
221         }\r
222 \r
223         public void SetScanMode()\r
224         {\r
225             Reset();\r
226             SetLogFile = "last_scan_log.txt";\r
227             this.Text = "Activity Window (Scan Log)";\r
228         }\r
229 \r
230         public void SetEncodeMode()\r
231         {\r
232             Reset();\r
233             SetLogFile = "last_encode_log.txt";\r
234             this.Text = "Activity Window (Enocde Log)";\r
235         }\r
236 \r
237         #endregion\r
238 \r
239         #region User Interface\r
240 \r
241         private void mnu_copy_log_Click(object sender, EventArgs e)\r
242         {\r
243             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
244         }\r
245 \r
246         private void mnu_openLogFolder_Click(object sender, EventArgs e)\r
247         {\r
248             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
249             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
250             Process prc = new Process\r
251                               {\r
252                                   StartInfo =\r
253                                       {\r
254                                           FileName = windir + @"\explorer.exe", \r
255                                           Arguments = logDir\r
256                                       }\r
257                               };\r
258             prc.Start();\r
259         }\r
260 \r
261         private void btn_copy_Click(object sender, EventArgs e)\r
262         {\r
263             Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
264         }\r
265 \r
266         private void btn_scan_log_Click(object sender, EventArgs e)\r
267         {\r
268             SetScanMode();\r
269         }\r
270 \r
271         private void btn_encode_log_Click(object sender, EventArgs e)\r
272         {\r
273             SetEncodeMode();\r
274         }\r
275 \r
276         #endregion\r
277 \r
278         protected override void OnClosing(CancelEventArgs e)\r
279         {\r
280             WindowTimer.Dispose();\r
281             e.Cancel = true;\r
282             this.Dispose();\r
283             base.OnClosing(e);\r
284         }\r
285     }\r
286 }