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"); } } } }