OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmReadDVD.cs
1 /*  frmReadDVD.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.Collections.Generic;\r
9 using System.ComponentModel;\r
10 using System.Data;\r
11 using System.Drawing;\r
12 using System.Text;\r
13 using System.Windows.Forms;\r
14 using System.IO;\r
15 using System.Threading;\r
16 using System.Diagnostics;\r
17 using System.Collections;\r
18 \r
19 \r
20 namespace Handbrake\r
21 {\r
22     public partial class frmReadDVD : Form\r
23     {\r
24         private string inputFile;\r
25         private frmMain mainWindow;\r
26         private Parsing.DVD thisDvd;\r
27         private delegate void UpdateUIHandler();\r
28         Process hbproc;\r
29         Functions.Common hb_common_func = new Functions.Common();\r
30 \r
31         public frmReadDVD(string inputFile, frmMain parent)\r
32         {\r
33             InitializeComponent();\r
34             this.inputFile = inputFile;\r
35             this.mainWindow = parent;\r
36             startScan();\r
37         }\r
38 \r
39         private void startScan()\r
40         {\r
41             try\r
42             {\r
43                 lbl_status.Visible = true;\r
44                 ThreadPool.QueueUserWorkItem(startProc);\r
45             }\r
46             catch (Exception exc)\r
47             {\r
48                 MessageBox.Show("frmReadDVD.cs - startScan " + exc.ToString());\r
49             }\r
50         }\r
51 \r
52         private void updateUIElements()\r
53         {\r
54             try\r
55             {\r
56                 if (this.InvokeRequired)\r
57                 {\r
58                     this.BeginInvoke(new UpdateUIHandler(updateUIElements));\r
59                     return;\r
60                 }\r
61                 // Now pass this streamreader to frmMain so that it can be used there.\r
62                 mainWindow.setStreamReader(thisDvd);\r
63 \r
64                 mainWindow.drp_dvdtitle.Items.Clear();\r
65                 if (thisDvd.Titles.Count != 0)\r
66                     mainWindow.drp_dvdtitle.Items.AddRange(thisDvd.Titles.ToArray());\r
67                 mainWindow.drp_dvdtitle.Text = "Automatic";\r
68                 mainWindow.drop_chapterFinish.Text = "Auto";\r
69                 mainWindow.drop_chapterStart.Text = "Auto";\r
70 \r
71                 // Now select the longest title\r
72                 if (thisDvd.Titles.Count != 0)\r
73                     hb_common_func.selectLongestTitle(mainWindow);\r
74 \r
75                 this.Close();\r
76             }\r
77             catch (Exception exc)\r
78             {\r
79                 MessageBox.Show("frmReadDVD.cs - updateUIElements " + exc.ToString());\r
80                 this.Close();\r
81             }\r
82         }\r
83 \r
84         Functions.Encode process = new Functions.Encode();\r
85 \r
86         private void startProc(object state)\r
87         {\r
88             try\r
89             {\r
90                 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");\r
91                 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");\r
92 \r
93                 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)\r
94                 if (File.Exists(dvdInfoPath))\r
95                     File.Delete(dvdInfoPath);\r
96 \r
97                 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);\r
98 \r
99                 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);\r
100                 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;\r
101               \r
102                 using (hbproc = Process.Start(hbParseDvd))\r
103                 {\r
104                     hbproc.WaitForExit();\r
105                 }\r
106 \r
107                 if (!File.Exists(dvdInfoPath))\r
108                 {\r
109                     throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing.");\r
110                 }\r
111 \r
112                 using (StreamReader sr = new StreamReader(dvdInfoPath))\r
113                 {\r
114                     thisDvd = Parsing.DVD.Parse(sr);\r
115                     sr.Close();\r
116                     sr.Dispose();\r
117                 }\r
118 \r
119                 updateUIElements();\r
120             }\r
121             catch (Exception exc)\r
122             {\r
123                 MessageBox.Show("frmReadDVD.cs - startProc " + exc.ToString());\r
124                 this.Close();\r
125             }\r
126 \r
127         }\r
128 \r
129         private void btn_cancel_Click(object sender, EventArgs e)\r
130         {\r
131             // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,\r
132             // hbproc.kill/close just won't do the trick.\r
133             try\r
134             {\r
135                 string AppName = "HandBrakeCLI";\r
136 \r
137                 AppName = AppName.ToUpper();\r
138 \r
139                 System.Diagnostics.Process[] prs = System.Diagnostics.Process.GetProcesses();\r
140                 foreach (System.Diagnostics.Process proces in prs)\r
141                 {\r
142                     if (proces.ProcessName.ToUpper() == AppName)\r
143                     {\r
144                         proces.Refresh();\r
145                         if (!proces.HasExited)\r
146                             proces.Kill();\r
147                     }\r
148                 }\r
149             }\r
150             catch (Exception ex)\r
151             {\r
152                 MessageBox.Show(ex.Message);\r
153             }\r
154         }\r
155     }\r
156 }