private void SaveSettings(ISettingsFile settingsFile, XmlDocument document, string settingsPath) { Type settingsClass = settingsFile.GetType(); Logging.Debug(LogOptions.MethodAndClassName, "Saving settings document {0} to location {1}", settingsClass.Name, settingsPath); //add declaration document.AppendChild(document.CreateXmlDeclaration("1.0", "UTF-8", "yes")); //create root settings holder XmlElement settingsHolder = document.CreateElement(settingsClass.Name); settingsHolder.SetAttribute("documentVersion", "1.1"); document.AppendChild(settingsHolder); //add setting values from fields and properties List <MemberInfo> memberInfos = new List <MemberInfo>(); memberInfos.AddRange(settingsClass.GetFields().ToList()); memberInfos.AddRange(settingsClass.GetProperties().ToList()); //filter out components from exclude list Logging.Debug("Components to save before exclude list: {0}", memberInfos.Count); memberInfos = memberInfos.FindAll(meme => !settingsFile.MembersToExclude.Contains(meme.Name)); Logging.Debug("Components to save after exclude list: {0}", memberInfos.Count); //loop through each member foreach (MemberInfo member in memberInfos) { XmlElement element = document.CreateElement(member.Name); if (member is FieldInfo fieldInfo) { element.InnerText = fieldInfo.GetValue(settingsFile).ToString(); } else if (member is PropertyInfo propertyInfo) { element.InnerText = propertyInfo.GetValue(settingsFile).ToString(); } else { Logging.Error("Failed to save property {0} from settings type {1}", member.Name, settingsClass.Name); continue; } settingsHolder.AppendChild(element); } //save to disk if (File.Exists(settingsPath)) { File.Delete(settingsPath); } document.Save(settingsPath); Logging.Debug(LogOptions.MethodAndClassName, "Saved settings document {0} to location {1}", settingsClass.Name, settingsPath); }
private void LoadSettings(ISettingsFile settingsFile, XDocument document) { if (settingsFile == null) { throw new NullReferenceException(); } //add setting values from fields and properties Type settingsClass = settingsFile.GetType(); List <MemberInfo> memberInfos = new List <MemberInfo>(); memberInfos.AddRange(settingsClass.GetFields().ToList()); Logging.Debug(LogOptions.MethodName, "Added {0} Fields to memberInfos", memberInfos.Count); int fieldsCount = memberInfos.Count; memberInfos.AddRange(settingsClass.GetProperties().ToList()); Logging.Debug(LogOptions.MethodName, "Added {0} Properties to memberInfos", memberInfos.Count - fieldsCount); //filter out components from exclude list Logging.Debug("Components to save before exclude list: {0}", memberInfos.Count); memberInfos = memberInfos.FindAll(meme => !settingsFile.MembersToExclude.Contains(meme.Name)); Logging.Debug("Components to save after exclude list: {0}", memberInfos.Count); //get the top level xml node of the document. it should be the name of the class, like "ModpackSettings" List <XElement> settingsXml = document.XPathSelectElements(string.Format("/{0}/*", settingsClass.Name)).ToList(); //legacy compatibility if (settingsClass.Equals(typeof(ModpackSettings))) { ((ModpackSettings)settingsFile).ApplyLegacySettings(settingsXml); } foreach (XElement settingsElement in settingsXml) { if (settingsFile.MembersToExclude.Contains(settingsElement.Name.LocalName)) { Logging.Info("Skipping loading property/field {0}, is on exclude list", settingsElement.Name.LocalName); continue; } FieldInfo fi = settingsClass.GetField(settingsElement.Name.LocalName); PropertyInfo pi = settingsClass.GetProperty(settingsElement.Name.LocalName); if (fi != null) { if (!CommonUtils.SetObjectField(settingsFile, fi, settingsElement.Value)) { Logging.Error("Failed to set value for field {0}, value {1}, line {2}", fi.Name, settingsElement.Value, ((IXmlLineInfo)settingsElement).LineNumber); continue; } } else if (pi != null) { if (!CommonUtils.SetObjectProperty(settingsFile, pi, settingsElement.Value)) { Logging.Error("Failed to set value for property {0}, value {1}, line {2}", pi.Name, settingsElement.Value, ((IXmlLineInfo)settingsElement).LineNumber); continue; } } else { Logging.Warning("Settings xml element '{0}' not found in class structure, skipping (is it in the exclude list?)"); } } }
/// <summary> /// Load the settings object with values from the given xml file path /// </summary> /// <param name="settingsFile">The instance of the settings class object to load settings into</param> public void LoadSettings(ISettingsFile settingsFile) { if (!File.Exists(settingsFile.Filename)) { Logging.Info(LogOptions.MethodName, "Settings document {0} does not exist, loading defaults", settingsFile.Filename); return; } Logging.Debug(LogOptions.MethodAndClassName, "Loading settings document {0} from location {1}", settingsFile.GetType().Name, settingsFile.Filename); LoadSettings(settingsFile, XmlUtils.LoadXDocument(settingsFile.Filename, XmlLoadType.FromFile)); Logging.Debug(LogOptions.MethodAndClassName, "Loaded settings document {0} from location {1}", settingsFile.GetType().Name, settingsFile.Filename); }