// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // The User Setting Serivce // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF.Services { using System; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Reflection; using System.Xml.Serialization; using HandBrake.ApplicationServices.EventArgs; using HandBrake.ApplicationServices.Exceptions; using HandBrakeWPF.Services.Interfaces; /// /// The User Setting Serivce /// public class UserSettingService : IUserSettingService { /// /// The Settings File /// private readonly string settingsFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\settings.xml"; /// /// The XML Serializer /// readonly XmlSerializer serializer = new XmlSerializer(typeof(Collections.SerializableDictionary)); /// /// The User Settings /// private Collections.SerializableDictionary userSettings; /// /// Initializes a new instance of the class. /// public UserSettingService() { this.Load(); } /// /// The setting changed. /// public event SettingEventHandler SettingChanged; /// /// Set the specified user setting. /// /// /// Name of the property /// /// /// The value to store. /// public void SetUserSetting(string name, object value) { this.userSettings[name] = value; this.Save(); this.OnSettingChanged(new SettingChangedEventArgs { Key = name, Value = value }); } /// /// Get user setting for a given key. /// /// /// The name. /// /// /// The Type of the setting /// /// /// The user setting /// public T GetUserSetting(string name) { if (this.userSettings.ContainsKey(name)) { return (T)this.userSettings[name]; } return default(T); } /// /// Get an StringCollection type user setting /// /// /// The setting name /// /// /// The settings value /// public StringCollection GetUserSettingStringCollection(string name) { return (StringCollection)this.userSettings[name]; } /// /// The on setting changed. /// /// /// The e. /// protected virtual void OnSettingChanged(SettingChangedEventArgs e) { SettingEventHandler handler = this.SettingChanged; if (handler != null) { handler(this, e); } } /// /// Save the User Settings /// private void Save() { try { string directory = Path.GetDirectoryName(this.settingsFile); if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); } using (FileStream strm = new FileStream(this.settingsFile, FileMode.Create, FileAccess.Write)) { this.serializer.Serialize(strm, this.userSettings); } } catch (Exception exc) { throw new GeneralApplicationException( "A problem occured when trying to save your preferences.", "Any settings you changed may need to be reset the next time HandBrake launches.", exc); } } /// /// Load the User Settings /// private void Load() { try { // Load up the users current settings file. if (File.Exists(this.settingsFile)) { using (StreamReader reader = new StreamReader(this.settingsFile)) { Collections.SerializableDictionary data = (Collections.SerializableDictionary)this.serializer.Deserialize(reader); this.userSettings = data; } } else { this.userSettings = new Collections.SerializableDictionary(); } // Add any missing / new settings Collections.SerializableDictionary defaults = this.GetDefaults(); foreach (var item in defaults.Where(item => !this.userSettings.Keys.Contains(item.Key))) { this.userSettings.Add(item.Key, item.Value); this.Save(); } } catch (Exception exc) { try { this.userSettings = this.GetDefaults(); if (File.Exists(this.settingsFile)) { File.Delete(this.settingsFile); } this.Save(); throw new GeneralApplicationException("Warning, your settings have been reset!", "Your user settings file was corrupted or inaccessible. Settings have been reset to defaults.", exc); } catch (Exception) { throw new GeneralApplicationException("Unable to load user settings file: " + this.settingsFile, "Your user settings file appears to be inaccessible or corrupted. You may have to delete the file and let HandBrake generate a new one.", exc); } } } /// /// Load Default Settings /// /// /// The get defaults. /// private Collections.SerializableDictionary GetDefaults() { try { Assembly assembly = Assembly.GetEntryAssembly(); Stream stream = assembly.GetManifestResourceStream("HandBrakeWPF.defaultsettings.xml"); if (stream != null) { return (Collections.SerializableDictionary)this.serializer.Deserialize(stream); } } catch (Exception) { return new Collections.SerializableDictionary(); } return new Collections.SerializableDictionary(); } } }