1 /* PresetHandler.cs $
\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
9 using System.Collections.Generic;
\r
10 using System.Diagnostics;
\r
11 using System.Drawing;
\r
13 using System.Text.RegularExpressions;
\r
14 using System.Windows.Forms;
\r
15 using System.Xml.Serialization;
\r
17 public class PresetsHandler
\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
23 private readonly string UserPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
\r
24 "\\HandBrake\\user_presets.xml";
\r
26 private readonly string HbPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
\r
27 "\\HandBrake\\presets.xml";
\r
30 /// Add a new preset to the system
\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
37 if (CheckIfPresetExists(presetName) == false)
\r
39 Preset newPreset = new Preset
\r
43 PictureSettings = pictureSettings,
\r
44 Version = Properties.Settings.Default.hb_version
\r
46 UserPresets.Add(newPreset);
\r
47 UpdatePresetFiles();
\r
54 /// Remove a preset with a given name from either the built in or user preset list.
\r
56 /// <param name="name">String, the preset name</param>
\r
57 public void Remove(string name)
\r
59 List<Preset> newPresets = new List<Preset>();
\r
60 List<Preset> newUserPresets = new List<Preset>();
\r
63 foreach (Preset item in Presets)
\r
65 if (item.Name != name)
\r
67 newPresets.Add(item);
\r
70 Presets = newPresets;
\r
73 foreach (Preset item in UserPresets)
\r
75 if (item.Name != name)
\r
77 newUserPresets.Add(item);
\r
80 UserPresets = newUserPresets;
\r
82 // Rebuild the UserPresets.xml file
\r
83 UpdatePresetFiles();
\r
84 UpdatePresetFiles();
\r
88 /// Remove all built in Presets;
\r
90 public void RemoveBuiltInPresets()
\r
93 UpdatePresetFiles();
\r
97 /// Save changes to a given preset in the user preset list.
\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
105 foreach (Preset item in UserPresets)
\r
107 if (item.Name == presetName)
\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
119 /// Return the CLI query for a preset name given in name
\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
125 // Built In Presets
\r
126 foreach (Preset item in Presets)
\r
128 if (item.Name == name)
\r
133 foreach (Preset item in UserPresets)
\r
135 if (item.Name == name)
\r
143 /// Reads the CLI's CLI output format and load's them into the preset List<Preset>
\r
145 public void UpdateBuiltInPresets()
\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
153 ProcessStartInfo hbGetPresets = new ProcessStartInfo("CMD.exe", strCmdLine)
\r
155 WindowStyle = ProcessWindowStyle.Hidden
\r
157 Process hbproc = Process.Start(hbGetPresets);
\r
158 if (hbproc != null)
\r
160 hbproc.WaitForExit();
\r
165 // Clear the current built in Presets and now parse the tempory Presets file.
\r
168 if (File.Exists(presetsPath))
\r
170 StreamReader presetInput = new StreamReader(presetsPath);
\r
172 string category = String.Empty;
\r
174 while (!presetInput.EndOfStream)
\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
180 if (line.Contains("+")) // A Preset
\r
182 Regex r = new Regex("(: )"); // Split on hyphens.
\r
183 string[] presetName = r.Split(line);
\r
186 if (presetName[2].Contains("crop"))
\r
189 Preset newPreset = new Preset
\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
197 Presets.Add(newPreset);
\r
200 presetInput.Close();
\r
201 presetInput.Dispose();
\r
204 // Finally, Create a new or update the current Presets.xml file
\r
205 UpdatePresetFiles();
\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
212 private void LoadPresetData()
\r
214 // First clear the Presets arraylists
\r
216 UserPresets.Clear();
\r
220 // Load in the users Presets from UserPresets.xml
\r
221 if (File.Exists(HbPresetFile))
\r
223 using (FileStream strm = new FileStream(HbPresetFile, FileMode.Open, FileAccess.Read))
\r
225 if (strm.Length != 0)
\r
227 List<Preset> list = Ser.Deserialize(strm) as List<Preset>;
\r
230 foreach (Preset preset in list)
\r
231 Presets.Add(preset);
\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
247 // Load in the users Presets from UserPresets.xml
\r
248 if (File.Exists(UserPresetFile))
\r
250 using (FileStream strm = new FileStream(UserPresetFile, FileMode.Open, FileAccess.Read))
\r
252 if (strm.Length != 0)
\r
254 List<Preset> list = Ser.Deserialize(strm) as List<Preset>;
\r
257 foreach (Preset preset in list)
\r
258 UserPresets.Add(preset);
\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
273 // Recover from Error.
\r
274 if (File.Exists(UserPresetFile))
\r
276 string disabledFile = UserPresetFile + ".old";
\r
277 if (File.Exists(disabledFile))
\r
278 File.Delete(disabledFile);
\r
279 File.Move(UserPresetFile, disabledFile);
\r
285 /// Setup the frmMain preset panel
\r
287 /// <param name="presetPanel"></param>
\r
288 public void GetPresetPanel(ref TreeView presetPanel)
\r
290 this.LoadPresetData();
\r
291 presetPanel.Nodes.Clear();
\r
292 string category = string.Empty;
\r
293 TreeNode rootNode = null;
\r
295 if (Presets.Count != 0) // Built In Presets
\r
297 foreach (Preset preset in Presets)
\r
299 if (preset.Category != category)
\r
301 rootNode = new TreeNode(preset.Category);
\r
302 presetPanel.Nodes.Add(rootNode);
\r
303 category = preset.Category;
\r
306 if (preset.Category == category && rootNode != null)
\r
307 rootNode.Nodes.Add(preset.Name);
\r
313 foreach (Preset preset in UserPresets) // User Presets
\r
315 if (preset.Category != category && preset.Category != null)
\r
317 rootNode = new TreeNode(preset.Category) {ForeColor = Color.Black};
\r
318 presetPanel.Nodes.Add(rootNode);
\r
319 category = preset.Category;
\r
322 if (preset.Category == category && rootNode != null)
\r
323 rootNode.Nodes.Add(new TreeNode(preset.Name) {ForeColor = Color.Black});
\r
325 presetPanel.Nodes.Add(new TreeNode(preset.Name) {ForeColor = Color.Black});
\r
330 /// Update the preset files
\r
332 private void UpdatePresetFiles()
\r
336 using (FileStream strm = new FileStream(HbPresetFile, FileMode.Create, FileAccess.Write))
\r
338 Ser.Serialize(strm, Presets);
\r
343 using (FileStream strm = new FileStream(UserPresetFile, FileMode.Create, FileAccess.Write))
\r
345 Ser.Serialize(strm, UserPresets);
\r
350 catch (Exception exc)
\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
359 /// Check if the preset "name" exists in either Presets or UserPresets lists.
\r
361 /// <param name="name"></param>
\r
362 /// <returns></returns>
\r
363 private bool CheckIfPresetExists(string name)
\r
365 if (name == string.Empty)
\r
368 // Built In Presets
\r
369 foreach (Preset item in Presets)
\r
371 if (item.Name == name)
\r
376 foreach (Preset item in UserPresets)
\r
378 if (item.Name == name)
\r
386 /// Check if the user preset "name" exists in UserPresets list.
\r
388 /// <param name="name"></param>
\r
389 /// <returns></returns>
\r
390 public bool CheckIfUserPresetExists(string name)
\r
392 if (name == string.Empty)
\r
396 foreach (Preset item in UserPresets)
\r
398 if (item.Name == name)
\r
406 /// Check if the built in Presets stored are not out of date.
\r
407 /// Update them if they are.
\r
409 /// <returns></returns>
\r
410 public bool CheckIfPresetsAreOutOfDate()
\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
417 UpdateBuiltInPresets();
\r