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