// --------------------------------------------------------------------------------------------------------------------
//
// 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.IO;
using System.Linq;
using System.Reflection;
using System.Xml.Serialization;
using HandBrake.ApplicationServices.Utilities;
using HandBrakeWPF.Properties;
using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.Utilities;
using GeneralApplicationException = HandBrakeWPF.Exceptions.GeneralApplicationException;
using SettingChangedEventArgs = HandBrakeWPF.EventArgs.SettingChangedEventArgs;
///
/// The User Setting Serivce
///
public class UserSettingService : IUserSettingService
{
///
/// The Settings File
///
private readonly string settingsFile = Path.Combine(DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly()), "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);
}
///
/// 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(
Resources.UserSettings_AnErrorOccured,
Resources.SettingService_SaveErrorReset,
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 if (VersionHelper.IsNightly() && File.Exists(Path.Combine(DirectoryUtilities.GetUserStoragePath(false), "settings.xml")))
{
// Port the release versions config to the nightly.
string releasePresetFile = Path.Combine(DirectoryUtilities.GetUserStoragePath(false), "settings.xml");
if (!Directory.Exists(DirectoryUtilities.GetUserStoragePath(true)))
{
Directory.CreateDirectory(DirectoryUtilities.GetUserStoragePath(true));
}
File.Copy(releasePresetFile, Path.Combine(DirectoryUtilities.GetUserStoragePath(true), "settings.xml"));
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(Resources.UserSettings_YourSettingsHaveBeenReset, Resources.UserSettings_YourSettingsAreCorrupt, exc);
}
catch (Exception)
{
throw new GeneralApplicationException(string.Format(Resources.UserSettings_UnableToLoad, this.settingsFile), Resources.UserSettings_UnableToLoadSolution, 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();
}
}
}