using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Configuration;
using System.Xml.Serialization;
using System.IO;
using System.Collections;
using System.Security.Policy;
using System.Security.Cryptography;
namespace RomCheater.UserSettingsSupport
{
public sealed class SettingSubscriber
{
#region t
#endregion
public SettingSubscriber() { }
//public void AddSubscriber(System.Configuration.ApplicationSettingsBase settings) { AddSubscriber(null, settings); }
public void AddSubscriber(object consumer, System.Configuration.ApplicationSettingsBase ownersettings)
{
this.OwnerSettings = ownersettings;
if (this.OwnerSettings == null)
{
throw new ArgumentNullException("ownersettings", "ownersettings cannot be null");
}
this.Consumer = consumer;
LoadSettings();
this.UpgradeSettingsIfNeeded();
}
private object _Consumer;
///
/// The object that will consume the settings
///
private object Consumer
{
get { return _Consumer; }
set { _Consumer = value; }
}
///
/// The Assembly that owns the settings
///
private Assembly OwningAsembly
{
get { return this.OwnerSettings.GetType().Assembly; }
}
///
/// The Assembly that will consume the settings
///
private Assembly ConsumerAssembly
{
get { return this.Consumer == null ? Assembly.GetExecutingAssembly() : this.Consumer.GetType().Assembly; }
}
private System.Configuration.ApplicationSettingsBase _OwnerSettings;
public System.Configuration.ApplicationSettingsBase OwnerSettings
{
get { return _OwnerSettings; }
private set { _OwnerSettings = value; }
}
///
/// Indicates if the consumer is the owning assemlby of the settings
/// If the value is false, then the settings are being accessed remotely
///
private bool IsOwningAssembly
{
get { return this.ConsumerAssembly == this.OwningAsembly; }
}
private Configuration _config = null;
#region LoadSettings()
private void LoadSettings()
{
if (!this.IsOwningAssembly)
{
//// we need to read the settings in
////string ConfigFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
////string ConfigFile = ConfigurationManager.OpenExeConfiguration(SettingsAssmebly.Location).FilePath;
//string path = string.Empty;
//string profile_dir = Environment.GetEnvironmentVariable("LocalAppData");
//string company_name = ((AssemblyCompanyAttribute)Attribute.GetCustomAttribute(this.OwningAsembly, typeof(AssemblyCompanyAttribute), false)).Company;
//string app_fullname = new FileInfo(this.OwningAsembly.Location).Name;
//string evidence_type = this.OwningAsembly.GetName().GetPublicKey().Length == 0 ? EVIDENCE_URL : EVIDENCE_STRONGNAME;
//string evidence_hash = "";
//string version = this.OwningAsembly.GetName().Version.ToString();
//string config = "user.config";
//StringBuilder builder = new StringBuilder();
//builder.AppendFormat(@"{0}", profile_dir);
//if (company_name != string.Empty)
//{
// builder.AppendFormat(@"\{0}", company_name.Replace(" ", "_"));
//}
//builder.AppendFormat(@"\{0}", app_fullname);
//builder.AppendFormat(@"_{0}", evidence_type);
//builder.AppendFormat(@"_{0}", evidence_hash);
//builder.AppendFormat(@"\{0}", version);
//builder.AppendFormat(@"\{0}", config);
//path = builder.ToString();
//#region Hash testing
//Hash owner = new Hash(this.OwningAsembly);
//Hash consumer = new Hash(this.ConsumerAssembly);
//#endregion
IsolatedStoragePath isp1 = new IsolatedStoragePath(this.OwningAsembly);
IsolatedStoragePath isp2 = new IsolatedStoragePath(this.ConsumerAssembly);
}
else
{
string ConfigFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
}
}
#endregion
public void UpgradeSettings()
{
if (this.OwnerSettings != null)
{
this.OwnerSettings.Upgrade();
return;
}
throw new ArgumentNullException("Settings", "Settings cannot be null");
}
public void SaveSettings()
{
if (this.OwnerSettings != null)
{
this.OwnerSettings.Save();
return;
}
throw new ArgumentNullException("Settings", "Settings cannot be null");
}
public void ReloadSettings()
{
if (this.OwnerSettings != null)
{
this.OwnerSettings.Reload();
return;
}
throw new ArgumentNullException("Settings", "Settings cannot be null");
}
public void ResetSettings()
{
if (this.OwnerSettings != null)
{
this.OwnerSettings.Reset();
return;
}
throw new ArgumentNullException("Settings", "Settings cannot be null");
}
public void UpgradeSettingsIfNeeded()
{
if (this.OwnerSettings != null)
{
//SettingCollections.Add(e.Settings);
foreach (SettingsProperty prop in this.OwnerSettings.Properties)
{
if (prop.Name == "UpgradeRequired")
{
bool UpgradeRequired = Convert.ToBoolean(this.OwnerSettings[prop.Name]);
try
{
if (UpgradeRequired)
{
UpgradeSettings();
//Settings.Reload();
SetValue(prop.Name, false);
SaveSettings();
}
}
catch { ResetSettings(); }
break;
}
}
}
else
{
throw new ArgumentNullException("Settings", "Settings cannot be null");
}
}
public void SetValue(string propertyName, object value)
{
if (this.OwnerSettings != null)
{
try
{
this.OwnerSettings[propertyName] = value;
}
catch (Exception ex)
{
throw new KeyNotFoundException(string.Format("Could not find property: '{0}'"), ex);
}
}
else
{
throw new ArgumentNullException("Settings", "Settings cannot be null");
}
}
public object GetValue(string propertyName)
{
if (this.OwnerSettings != null)
{
try
{
return this.OwnerSettings[propertyName];
}
catch (Exception ex)
{
throw new KeyNotFoundException(string.Format("Could not find property: '{0}'"), ex);
}
}
else
{
throw new ArgumentNullException("Settings", "Settings cannot be null");
}
}
}
}