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