/// <summary> /// Returns modder for the given XML file from the packages. /// </summary> /// <param name="fileName"></param> /// <returns></returns> public XmlModder GetXmlModder(string fileName) { fileName = NormalizePath(fileName); lock (_syncLock) { if (_xmlModders.ContainsKey(fileName)) { return(_xmlModders[fileName]); } } var isCompiled = false; if (!fileName.EndsWith(".xml") && !(isCompiled = fileName.EndsWith(".xml.compiled"))) { throw new ArgumentException("Expected XML file extension."); } var packReader = this.GetPackReader(); if (!packReader.Exists(fileName)) { throw new FileNotFoundException("File not found in packages: '" + fileName + "'"); } var entry = _packReader.GetEntry(fileName); var tmpFilePath = Path.GetTempFileName(); var modder = new XmlModder(); if (isCompiled) { var featuresFile = FeaturesFile.CompiledToXml(entry.GetDataAsStream()); using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(featuresFile))) modder.LoadFromStream(ms); } else { using (var stream = entry.GetDataAsStream()) using (var sr = new StreamReader(stream)) { var xml = sr.ReadToEnd(); xml = FixXmlCode(fileName, xml); modder.LoadFromString(xml); } } lock (_syncLock) _xmlModders[fileName] = modder; return(modder); }
/// <summary> /// Saves the modified XML file from the modder to the given path, /// either raw or compiled, depending on the extension. /// </summary> /// <param name="modder"></param> /// <param name="filePath"></param> private void SaveXmlModder(XmlModder modder, string filePath) { PrepareFolder(filePath); var isCompiled = filePath.EndsWith(".xml.compiled"); if (isCompiled) { var xml = modder.GetString(); FeaturesFile.SaveCompiledFromXml(filePath, xml); } else { modder.Save(filePath); } }