// --------------------------------------------------------------------------------------------------------------------
//
// 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.Exceptions;
using HandBrakeWPF.Services.Interfaces;
using SettingChangedEventArgs = HandBrakeWPF.EventArgs.SettingChangedEventArgs;
///
/// 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();
}
}
}