OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Presets / PresetsHandler.cs
1 /*  PresetHandler.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 using System;\r
7 using System.Collections.Generic;\r
8 using System.Drawing;\r
9 using System.Windows.Forms;\r
10 using System.IO;\r
11 using System.Text.RegularExpressions;\r
12 using System.Diagnostics;\r
13 using System.Xml.Serialization;\r
14 \r
15 namespace Handbrake.Presets\r
16 {\r
17     public class PresetsHandler\r
18     {\r
19         List<Preset> Presets = new List<Preset>();\r
20         List<Preset> UserPresets = new List<Preset>();\r
21         private static readonly XmlSerializer Ser = new XmlSerializer(typeof(List<Preset>));\r
22         readonly string UserPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\user_presets.xml";\r
23         readonly string HbPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\presets.xml";\r
24 \r
25         /// <summary>\r
26         /// Add a new preset to the system\r
27         /// </summary>\r
28         /// <param name="presetName">String, The name of the new preset</param>\r
29         /// <param name="query">String, the CLI query for the new preset</param>\r
30         /// <param name="pictureSettings"> Bool, store crop/picture sizes in the Presets</param>\r
31         public Boolean Add(string presetName, string query, Boolean pictureSettings)\r
32         {\r
33             if (CheckIfPresetExists(presetName) == false)\r
34             {\r
35                 Preset newPreset = new Preset { Name = presetName, Query = query, PictureSettings = pictureSettings, Version = Properties.Settings.Default.hb_version };\r
36                 UserPresets.Add(newPreset);\r
37                 UpdatePresetFiles();\r
38                 return true;\r
39             }\r
40             return false;\r
41         }\r
42 \r
43         /// <summary>\r
44         /// Remove a preset with a given name from either the built in or user preset list.\r
45         /// </summary>\r
46         /// <param name="name">String, the preset name</param>\r
47         public void Remove(string name)\r
48         {\r
49             List<Preset> newPresets = new List<Preset>();\r
50             List<Preset> newUserPresets = new List<Preset>();\r
51 \r
52             // Built In Presets\r
53             foreach (Preset item in Presets)\r
54             {\r
55                 if (item.Name != name)\r
56                 {\r
57                     newPresets.Add(item);\r
58                 }\r
59             }\r
60             Presets = newPresets;\r
61 \r
62             // User Presets\r
63             foreach (Preset item in UserPresets)\r
64             {\r
65                 if (item.Name != name)\r
66                 {\r
67                     newUserPresets.Add(item);\r
68                 }\r
69             }\r
70             UserPresets = newUserPresets;\r
71 \r
72             // Rebuild the UserPresets.xml file\r
73             UpdatePresetFiles();\r
74             UpdatePresetFiles();\r
75         }\r
76 \r
77         /// <summary>\r
78         /// Remove all built in Presets;\r
79         /// </summary>\r
80         public void RemoveBuiltInPresets()\r
81         {\r
82             Presets.Clear();\r
83             UpdatePresetFiles();\r
84         }\r
85 \r
86         /// <summary>\r
87         /// Save changes to a given preset in the user preset list.\r
88         /// </summary>\r
89         /// <param name="presetName">String, The name of the new preset</param>\r
90         /// <param name="query">String, the CLI query for the new preset</param>\r
91         /// <param name="pictureSettings"> Bool, store crop/picture sizes in the preset</param>\r
92         public void Update(string presetName, string query, Boolean pictureSettings)\r
93         {\r
94             // User Presets\r
95             foreach (Preset item in UserPresets)\r
96             {\r
97                 if (item.Name == presetName)\r
98                 {\r
99                     item.Query = query;\r
100                     item.PictureSettings = pictureSettings;\r
101                     MessageBox.Show("Changes to \"" + presetName + "\" Saved", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
102                     UpdatePresetFiles();\r
103                 }\r
104             }\r
105         }\r
106 \r
107         /// <summary>\r
108         /// Return the CLI query for a preset name given in name\r
109         /// </summary>\r
110         /// <param name="name">String, The preset's name</param>\r
111         /// <returns>String, the CLI query for the given preset name</returns>    not\r
112         public Preset GetPreset(string name)\r
113         {\r
114             // Built In Presets\r
115             foreach (Preset item in Presets)\r
116             {\r
117                 if (item.Name == name)\r
118                     return item;\r
119             }\r
120 \r
121             // User Presets\r
122             foreach (Preset item in UserPresets)\r
123             {\r
124                 if (item.Name == name)\r
125                     return item;\r
126             }\r
127 \r
128             return null;\r
129         }\r
130 \r
131         /// <summary>\r
132         /// Reads the CLI's CLI output format and load's them into the preset List<Preset>\r
133         /// </summary>\r
134         public void UpdateBuiltInPresets()\r
135         {\r
136             // Create a new tempory file and execute the CLI to get the built in Presets.\r
137             string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");\r
138             string presetsPath = Path.Combine(Path.GetTempPath(), "temp_presets.dat");\r
139             string strCmdLine = String.Format(@"cmd /c """"{0}"" --preset-list >""{1}"" 2>&1""", handbrakeCLIPath, presetsPath);\r
140 \r
141             ProcessStartInfo hbGetPresets = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };\r
142             Process hbproc = Process.Start(hbGetPresets);\r
143             if (hbproc != null)\r
144             {\r
145                 hbproc.WaitForExit();\r
146                 hbproc.Dispose();\r
147                 hbproc.Close();\r
148             }\r
149 \r
150             // Clear the current built in Presets and now parse the tempory Presets file.\r
151             Presets.Clear();\r
152 \r
153             if (File.Exists(presetsPath))\r
154             {\r
155                 StreamReader presetInput = new StreamReader(presetsPath);\r
156 \r
157                 string category = String.Empty;\r
158 \r
159                 while (!presetInput.EndOfStream)\r
160                 {\r
161                     string line = presetInput.ReadLine();\r
162                     if (line.Contains("<") && !line.Contains("<<")) // Found the beginning of a preset block \r
163                         category = line.Replace("<", "").Trim();\r
164 \r
165                     if (line.Contains("+")) // A Preset\r
166                     {\r
167                         Regex r = new Regex("(:  )"); // Split on hyphens. \r
168                         string[] presetName = r.Split(line);\r
169 \r
170                         bool pic = false;\r
171                         if (presetName[2].Contains("crop"))\r
172                             pic = true;\r
173 \r
174                         Preset newPreset = new Preset\r
175                                                {\r
176                                                    Category = category,\r
177                                                    Name = presetName[0].Replace("+", "").Trim(),\r
178                                                    Query = presetName[2],\r
179                                                    Version = Properties.Settings.Default.hb_version,\r
180                                                    PictureSettings = pic\r
181                                                };\r
182                         Presets.Add(newPreset);\r
183                     }\r
184                 }\r
185                 presetInput.Close();\r
186                 presetInput.Dispose();\r
187             }\r
188 \r
189             // Finally, Create a new or update the current Presets.xml file\r
190             UpdatePresetFiles();\r
191         }\r
192 \r
193         /// <summary>\r
194         /// Load in the preset data from Presets.xml and UserPresets.xml\r
195         /// Load it into the 2 arraylist's Presets and UserPresets\r
196         /// </summary>\r
197         private void LoadPresetData()\r
198         {\r
199             // First clear the Presets arraylists\r
200             Presets.Clear();\r
201             UserPresets.Clear();\r
202 \r
203             try\r
204             {\r
205                 // Load in the users Presets from UserPresets.xml\r
206                 if (File.Exists(HbPresetFile))\r
207                 {\r
208                     using (FileStream strm = new FileStream(HbPresetFile, FileMode.Open, FileAccess.Read))\r
209                     {\r
210                         if (strm.Length != 0)\r
211                         {\r
212                             List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
213 \r
214                             if (list != null)\r
215                                 foreach (Preset preset in list)\r
216                                     Presets.Add(preset);\r
217                         }\r
218                     }\r
219                 }\r
220             }\r
221             catch (Exception)\r
222             {\r
223                 MessageBox.Show(\r
224                     "HandBrakes preset file appears to have been corrupted. This file will now be re-generated!\n" +\r
225                     "If the problem presists, please delete the file: \n\n" + HbPresetFile, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
226                 UpdateBuiltInPresets();\r
227             }\r
228 \r
229             try\r
230             {\r
231                 // Load in the users Presets from UserPresets.xml\r
232                 if (File.Exists(UserPresetFile))\r
233                 {\r
234                     using (FileStream strm = new FileStream(UserPresetFile, FileMode.Open, FileAccess.Read))\r
235                     {\r
236                         if (strm.Length != 0)\r
237                         {\r
238                             List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
239 \r
240                             if (list != null)\r
241                                 foreach (Preset preset in list)\r
242                                     UserPresets.Add(preset);\r
243                         }\r
244                     }\r
245                 }\r
246             }\r
247             catch (Exception)\r
248             {\r
249                 MessageBox.Show(\r
250                     "Your User presets file appears to have been corrupted.\n" +\r
251                     "Your presets will not be loaded. You may need to re-create your presets.\n\n" +\r
252                     "Your user presets file has been renamed to 'user_presets.xml.old' and is located in:\n " +\r
253                     Path.GetDirectoryName(UserPresetFile) + "\n" +\r
254                     "You may be able to recover some presets if you know the XML language.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
255 \r
256                 // Recover from Error.\r
257                 if (File.Exists(UserPresetFile))\r
258                 {\r
259                     string disabledFile = UserPresetFile + ".old";\r
260                     if (File.Exists(disabledFile))\r
261                         File.Delete(disabledFile);\r
262                     File.Move(UserPresetFile, disabledFile);\r
263                 }\r
264 \r
265             }\r
266         }\r
267 \r
268         /// <summary>\r
269         /// Setup the frmMain preset panel\r
270         /// </summary>\r
271         /// <param name="presetPanel"></param>\r
272         public void GetPresetPanel(ref TreeView presetPanel)\r
273         {\r
274             this.LoadPresetData();\r
275             presetPanel.Nodes.Clear();\r
276             string category = string.Empty;\r
277             TreeNode rootNode = null;\r
278 \r
279             if (Presets.Count != 0) // Built In Presets\r
280             {\r
281 \r
282                 foreach (Preset preset in Presets)\r
283                 {\r
284                     if (preset.Category != category)\r
285                     {\r
286                         rootNode = new TreeNode(preset.Category);\r
287                         presetPanel.Nodes.Add(rootNode);\r
288                         category = preset.Category;\r
289                     }\r
290 \r
291                     if (preset.Category == category && rootNode != null)\r
292                         rootNode.Nodes.Add(preset.Name);\r
293                 }\r
294             }\r
295 \r
296             rootNode = null; category = null;\r
297             foreach (Preset preset in UserPresets) // User Presets\r
298             {\r
299                 if (preset.Category != category && preset.Category != null)\r
300                 {\r
301                     rootNode = new TreeNode(preset.Category) { ForeColor = Color.Black };\r
302                     presetPanel.Nodes.Add(rootNode);\r
303                     category = preset.Category;\r
304                 }\r
305 \r
306                 if (preset.Category == category && rootNode != null)\r
307                     rootNode.Nodes.Add(new TreeNode(preset.Name) { ForeColor = Color.Black });\r
308                 else\r
309                     presetPanel.Nodes.Add(new TreeNode(preset.Name) { ForeColor = Color.Black });\r
310             }\r
311         }\r
312 \r
313         /// <summary>\r
314         /// Update the preset files\r
315         /// </summary>\r
316         private void UpdatePresetFiles()\r
317         {\r
318             try\r
319             {\r
320                 using (FileStream strm = new FileStream(HbPresetFile, FileMode.Create, FileAccess.Write))\r
321                 {\r
322                     Ser.Serialize(strm, Presets);\r
323                     strm.Close();\r
324                     strm.Dispose();\r
325                 }\r
326 \r
327                 using (FileStream strm = new FileStream(UserPresetFile, FileMode.Create, FileAccess.Write))\r
328                 {\r
329                     Ser.Serialize(strm, UserPresets);\r
330                     strm.Close();\r
331                     strm.Dispose();\r
332                 }\r
333             }\r
334             catch (Exception exc)\r
335             {\r
336                 MessageBox.Show("Unable to write to the file. Please make sure the location has the correct permissions for file writing.\n Error Information: \n\n" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
337             }\r
338         }\r
339 \r
340         /// <summary>\r
341         /// Check if the preset "name" exists in either Presets or UserPresets lists.\r
342         /// </summary>\r
343         /// <param name="name"></param>\r
344         /// <returns></returns>\r
345         private Boolean CheckIfPresetExists(string name)\r
346         {\r
347             if (name == string.Empty)\r
348                 return true;\r
349 \r
350             // Built In Presets\r
351             foreach (Preset item in Presets)\r
352             {\r
353                 if (item.Name == name)\r
354                     return true;\r
355             }\r
356 \r
357             // User Presets\r
358             foreach (Preset item in UserPresets)\r
359             {\r
360                 if (item.Name == name)\r
361                     return true;\r
362             }\r
363 \r
364             return false;\r
365         }\r
366 \r
367         /// <summary>\r
368         /// Check if the user preset "name" exists in UserPresets list.\r
369         /// </summary>\r
370         /// <param name="name"></param>\r
371         /// <returns></returns>\r
372         public Boolean CheckIfUserPresetExists(string name)\r
373         {\r
374             if (name == string.Empty)\r
375                 return false;\r
376 \r
377             // User Presets\r
378             foreach (Preset item in UserPresets)\r
379             {\r
380                 if (item.Name == name)\r
381                     return true;\r
382             }\r
383 \r
384             return false;\r
385         }\r
386 \r
387         /// <summary>\r
388         /// Check if the built in Presets stored are not out of date.\r
389         /// Update them if they are.\r
390         /// </summary>\r
391         /// <returns></returns>\r
392         public Boolean CheckIfPresetsAreOutOfDate()\r
393         {\r
394             LoadPresetData();\r
395             // Update built-in Presets if the built-in Presets belong to an older version.\r
396             if (Presets.Count != 0)\r
397                 if (Presets[0].Version != Properties.Settings.Default.hb_version)\r
398                 {\r
399                     UpdateBuiltInPresets();\r
400                     return true;\r
401                 }\r
402 \r
403             return false;\r
404         }\r
405     }\r
406 }