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                         Preset newPreset = new Preset\r
171                                                {\r
172                                                    Category = category,\r
173                                                    Name = presetName[0].Replace("+", "").Trim(),\r
174                                                    Query = presetName[2],\r
175                                                    Version = Properties.Settings.Default.hb_version,\r
176                                                    PictureSettings = true\r
177                                                };\r
178                         _presets.Add(newPreset);\r
179                     }\r
180                 }\r
181                 presetInput.Close();\r
182                 presetInput.Dispose();\r
183             }\r
184 \r
185             // Finally, Create a new or update the current _presets.xml file\r
186             UpdatePresetFiles();\r
187         }\r
188 \r
189         /// <summary>\r
190         /// Load in the preset data from _presets.xml and _userPresets.xml\r
191         /// Load it into the 2 arraylist's _presets and _userPresets\r
192         /// </summary>\r
193         private void LoadPresetData()\r
194         {\r
195             // First clear the _presets arraylists\r
196             _presets.Clear();\r
197             _userPresets.Clear();\r
198 \r
199             try\r
200             {\r
201                 // Load in the users _presets from _userPresets.xml\r
202                 if (File.Exists(_hbPresetFile))\r
203                 {\r
204                     using (FileStream strm = new FileStream(_hbPresetFile, FileMode.Open, FileAccess.Read))\r
205                     {\r
206                         if (strm.Length != 0)\r
207                         {\r
208                             List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
209 \r
210                             if (list != null)\r
211                                 foreach (Preset preset in list)\r
212                                     _presets.Add(preset);\r
213                         }\r
214                     }\r
215                 }\r
216             }\r
217             catch (Exception)\r
218             {\r
219                 MessageBox.Show(\r
220                     "HandBrakes preset file appears to have been corrupted. This file will now be re-generated!\n" +\r
221                     "If the problem presists, please delete the file: \n\n" + _hbPresetFile, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
222                 UpdateBuiltInPresets();\r
223             }\r
224 \r
225             try\r
226             {\r
227                 // Load in the users _presets from _userPresets.xml\r
228                 if (File.Exists(_userPresetFile))\r
229                 {\r
230                     using (FileStream strm = new FileStream(_userPresetFile, FileMode.Open, FileAccess.Read))\r
231                     {\r
232                         if (strm.Length != 0)\r
233                         {\r
234                             List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
235 \r
236                             if (list != null)\r
237                                 foreach (Preset preset in list)\r
238                                     _userPresets.Add(preset);\r
239                         }\r
240                     }\r
241                 }\r
242             }\r
243             catch (Exception)\r
244             {\r
245                 MessageBox.Show(\r
246                     "Your User presets file appears to have been corrupted.\n" +\r
247                     "Your presets will not be loaded. You may need to re-create your presets.\n\n" +\r
248                     "Your user presets file has been renamed to 'user_presets.xml.old' and is located in:\n " +\r
249                     Path.GetDirectoryName(_userPresetFile) + "\n" +\r
250                     "You may be able to recover some presets if you know the XML language.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
251 \r
252                 // Recover from Error.\r
253                 if (File.Exists(_userPresetFile))\r
254                 {\r
255                     string disabledFile = _userPresetFile + ".old";\r
256                     if (File.Exists(disabledFile))\r
257                         File.Delete(disabledFile);\r
258                     File.Move(_userPresetFile, disabledFile);\r
259                 }\r
260 \r
261             }\r
262         }\r
263 \r
264         /// <summary>\r
265         /// Setup the frmMain preset panel\r
266         /// </summary>\r
267         /// <param name="presetPanel"></param>\r
268         public void GetPresetPanel(ref TreeView presetPanel)\r
269         {\r
270             this.LoadPresetData();\r
271             presetPanel.Nodes.Clear();\r
272             string category = string.Empty;\r
273             TreeNode rootNode = null;\r
274 \r
275             if (_presets.Count != 0) // Built In Presets\r
276             {\r
277 \r
278                 foreach (Preset preset in _presets)\r
279                 {\r
280                     if (preset.Category != category)\r
281                     {\r
282                         rootNode = new TreeNode(preset.Category);\r
283                         presetPanel.Nodes.Add(rootNode);\r
284                         category = preset.Category;\r
285                     }\r
286 \r
287                     if (preset.Category == category && rootNode != null)\r
288                         rootNode.Nodes.Add(preset.Name);\r
289                 }\r
290             }\r
291 \r
292             rootNode = null; category = null;\r
293             foreach (Preset preset in _userPresets) // User Presets\r
294             {\r
295                 if (preset.Category != category && preset.Category != null)\r
296                 {\r
297                     rootNode = new TreeNode(preset.Category) { ForeColor = Color.Black };\r
298                     presetPanel.Nodes.Add(rootNode);\r
299                     category = preset.Category;\r
300                 }\r
301 \r
302                 if (preset.Category == category && rootNode != null)\r
303                     rootNode.Nodes.Add(new TreeNode(preset.Name) { ForeColor = Color.Black });\r
304                 else\r
305                     presetPanel.Nodes.Add(new TreeNode(preset.Name) { ForeColor = Color.Black });\r
306             }\r
307         }\r
308 \r
309         /// <summary>\r
310         /// Update the preset files\r
311         /// </summary>\r
312         private void UpdatePresetFiles()\r
313         {\r
314             try\r
315             {\r
316                 using (FileStream strm = new FileStream(_hbPresetFile, FileMode.Create, FileAccess.Write))\r
317                 {\r
318                     Ser.Serialize(strm, _presets);\r
319                     strm.Close();\r
320                     strm.Dispose();\r
321                 }\r
322 \r
323                 using (FileStream strm = new FileStream(_userPresetFile, FileMode.Create, FileAccess.Write))\r
324                 {\r
325                     Ser.Serialize(strm, _userPresets);\r
326                     strm.Close();\r
327                     strm.Dispose();\r
328                 }\r
329             }\r
330             catch (Exception exc)\r
331             {\r
332                 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
333             }\r
334         }\r
335 \r
336         /// <summary>\r
337         /// Check if the preset "name" exists in either _presets or _userPresets lists.\r
338         /// </summary>\r
339         /// <param name="name"></param>\r
340         /// <returns></returns>\r
341         private Boolean CheckIfPresetExists(string name)\r
342         {\r
343             if (name == string.Empty)\r
344                 return true;\r
345 \r
346             // Built In Presets\r
347             foreach (Preset item in _presets)\r
348             {\r
349                 if (item.Name == name)\r
350                     return true;\r
351             }\r
352 \r
353             // User Presets\r
354             foreach (Preset item in _userPresets)\r
355             {\r
356                 if (item.Name == name)\r
357                     return true;\r
358             }\r
359 \r
360             return false;\r
361         }\r
362 \r
363         /// <summary>\r
364         /// Check if the user preset "name" exists in _userPresets list.\r
365         /// </summary>\r
366         /// <param name="name"></param>\r
367         /// <returns></returns>\r
368         public Boolean CheckIfUserPresetExists(string name)\r
369         {\r
370             if (name == string.Empty)\r
371                 return false;\r
372 \r
373             // User Presets\r
374             foreach (Preset item in _userPresets)\r
375             {\r
376                 if (item.Name == name)\r
377                     return true;\r
378             }\r
379 \r
380             return false;\r
381         }\r
382 \r
383         /// <summary>\r
384         /// Check if the built in _presets stored are not out of date.\r
385         /// Update them if they are.\r
386         /// </summary>\r
387         /// <returns></returns>\r
388         public Boolean CheckIfPresetsAreOutOfDate()\r
389         {\r
390             LoadPresetData();\r
391             // Update built-in _presets if the built-in _presets belong to an older version.\r
392             if (_presets.Count != 0)\r
393                 if (_presets[0].Version != Properties.Settings.Default.hb_version)\r
394                 {\r
395                     UpdateBuiltInPresets();\r
396                     return true;\r
397                 }\r
398 \r
399             return false;\r
400         }\r
401     }\r
402 }