/// <summary> /// Converts Xml of settings to a settings object /// </summary> /// <typeparam name="T">Type of the settings you want</typeparam> /// <param name="xml">Xml string of settings</param> /// <returns>Instance of Settings Class</returns> internal static T GetSettingsInstance <T>(string xml) where T : ITrinitySetting <T> { var serializer = new DataContractSerializer(typeof(T)); using (var reader = XmlReader.Create(new StringReader(xml))) { XmlReader migrator = new SettingsMigrator(reader); var loadedSetting = (T)serializer.ReadObject(migrator); return(loadedSetting); } }
public void Load() { bool loadSuccessful = false; bool migrateConfig = false; // Only load once every 500ms (prevents duplicate Load calls) if (DateTime.UtcNow.Subtract(_LastLoadedSettings).TotalMilliseconds <= 500) { return; } _LastLoadedSettings = DateTime.UtcNow; string filename = GlobalSettingsFile; lock (this) { try { if (File.Exists(GlobalSettingsFile)) { Logger.Log(TrinityLogLevel.Info, LogCategory.UserInformation, "Loading Global Settings, You can use per-battletag settings by removing the Trinity.xml file under your Demonbuddy settings directory"); } else if (File.Exists(BattleTagSettingsFile)) { Logger.Log(TrinityLogLevel.Info, LogCategory.UserInformation, "Loading BattleTag Settings"); filename = BattleTagSettingsFile; } else if (File.Exists(OldBattleTagSettingsFile)) { Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Old configuration file found, need to migrate!"); filename = OldBattleTagSettingsFile; migrateConfig = true; } if (File.Exists(filename)) { DateTime fsChangeStart = DateTime.UtcNow; while (FileManager.IsFileReadLocked(new FileInfo(GlobalSettingsFile))) { Thread.Sleep(10); if (DateTime.UtcNow.Subtract(fsChangeStart).TotalMilliseconds > 5000) { break; } } using (Stream stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { DataContractSerializer serializer = new DataContractSerializer(typeof(TrinitySetting)); XmlReader reader = XmlReader.Create(stream); XmlReader migrator = new SettingsMigrator(reader); TrinitySetting loadedSetting = (TrinitySetting)serializer.ReadObject(migrator); loadedSetting.CopyTo(this); stream.Close(); Logger.Log("Configuration file loaded"); // this tests to make sure we didn't load anything null, and our load was succesful if (Advanced != null && Combat != null && Combat.Misc != null) { loadSuccessful = true; } } } else { Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Configuration file not found."); Reset(); } } catch (Exception ex) { Logger.Log(TrinityLogLevel.Error, LogCategory.UserInformation, "Error while loading Config file: {0}", ex); loadSuccessful = false; migrateConfig = false; } if (migrateConfig && loadSuccessful) { Logger.Log(TrinityLogLevel.Debug, LogCategory.UserInformation, "Migrating configuration to new Trinity.xml"); Save(); File.Delete(OldBattleTagSettingsFile); } } }