public static void SetVersions(List <ModMetaHeader> metaHeaders)
        {
            if (xdoc == null)
            {
                throw new Exception("Invoke BeginReading before using this method");
            }

            var meta            = xdoc.Root.Element("meta");
            var modVersionsNode = GetElementWithForceCreation(meta, MOD_META_DATAS);

            modVersionsNode.RemoveAll();

            if (meta.Element(MOD_META_DATAS) == null)
            {
                throw new Exception("F");
            }

            for (int i = 0; i < metaHeaders.Count; i++)
            {
                var data   = metaHeaders[i];
                var liNode = new XElement("li");
                liNode.Add(new XElement(MOD_IDENTIFIER_NODENAME)
                {
                    Value = data.Identifier
                });
                liNode.Add(new XElement(VERSION_NODENAME)
                {
                    Value = data.Version
                });
                SimpleLog.Log($"Writing {data.Identifier} {data.Version} to versionNode");
                modVersionsNode.Add(liNode);
            }
        }
 public static void EndReading()
 {
     xdoc.Save(CurrnetUsingFilePath);
     SimpleLog.Log("Saving xdoc");
     xdoc = null;
     CurrnetUsingFilePath = null;
     isVersionDictDirty   = true;
 }
        public static bool isVersionSame(List <Madeline.ModMismatchFormatter.Mod> saveMods, List <Madeline.ModMismatchFormatter.Mod> activeMods)
        { // saveMods와 activeMods는 길이가 무조건 같음
            SimpleLog.Log("Checking version difference...");
            if (saveMods.Count != activeMods.Count)
            {
                string ListOfSaveMods   = string.Join(", ", saveMods.Select(mod => mod.Identifier));
                string ListOfActiveMods = string.Join(", ", activeMods.Select(mod => mod.Identifier));

                StringBuilder exceptionMessage = new StringBuilder();

                exceptionMessage.AppendLine("saveMods length and activeMods length are different.");
                exceptionMessage.AppendLine($"Save Mod Count : {saveMods.Count} Active Mods Count : {activeMods.Count}");
                exceptionMessage.AppendLine("Active Mods List");
                exceptionMessage.AppendLine(ListOfActiveMods);
                exceptionMessage.AppendLine("Save Mods List");
                exceptionMessage.AppendLine(ListOfSaveMods);

                throw new Exception(exceptionMessage.ToString());
            }

            int length = saveMods.Count;

            for (int i = 0; i < length; i++)
            {
                var save   = saveMods[i];
                var active = activeMods[i];

                SimpleLog.Log($"Comparing {save.Identifier} ({save.Version}) - {active.Identifier} ({active.Version})");

                if (save.Identifier != active.Identifier)
                {
                    string ListOfSaveMods   = string.Join(", ", saveMods.Select(mod => mod.Identifier));
                    string ListOfActiveMods = string.Join(", ", activeMods.Select(mod => mod.Identifier));

                    StringBuilder exceptionMessage = new StringBuilder();

                    exceptionMessage.AppendLine($"two mod's identifier is different while comparing version, save mod identifier : {save.Identifier}, active mod identifier : {active.Identifier}");
                    exceptionMessage.AppendLine($"Save Mod Count : {saveMods.Count} Active Mods Count : {activeMods.Count}");
                    exceptionMessage.AppendLine("Active Mods List");
                    exceptionMessage.AppendLine(ListOfActiveMods);
                    exceptionMessage.AppendLine("Save Mods List");
                    exceptionMessage.AppendLine(ListOfSaveMods);

                    throw new Exception(exceptionMessage.ToString());
                }

                if (save.Version != active.Version)
                {
                    return(false);
                }
            }

            return(true);
        }
 public static void BeginReading(string filePath)
 {
     if (xdoc != null || string.IsNullOrEmpty(CurrnetUsingFilePath))
     {
         Log.Warning("xdoc is still open. force-closing");
         xdoc = null;
         CurrnetUsingFilePath = null;
     }
     SimpleLog.Log($"Trying to load {filePath}");
     xdoc = XDocument.Load(filePath);
     CurrnetUsingFilePath = filePath;
 }
        static void RebuildVersionDict()
        {
            SimpleLog.Log("Rebuilding VersionDict");
            isVersionDictDirty = false;
            versionDict.Clear();

            if (xdoc == null)
            {
                Log.Error($"invoke BeginReading before calling {nameof(RebuildVersionDict)}");
                return;
            }

            try
            {
                var ModMetaHeaders = xdoc.Root.Element("meta")?.Element(MOD_META_DATAS);
                if (ModMetaHeaders == null)
                {
                    return;
                }

                var elements = ModMetaHeaders.Elements();
                foreach (var node in elements)
                {
                    var Identifier = node.Element(MOD_IDENTIFIER_NODENAME)?.Value;
                    var Version    = node.Element(VERSION_NODENAME)?.Value;

                    if (Identifier == null || Version == null) // variable sanity check
                    {
                        continue;
                    }

                    versionDict[Identifier] = Version;

                    SimpleLog.Log($"Set {Identifier} {Version}");
                }
            }
            catch (Exception ex)
            {
                Log.Error($"Exception while rebuilding VersionDict, exception : {ex.Message}");
                return;
            }
        }
        public static void UpdateModVersionMetaHeader()
        {
            string rawFilePath = SaveFilePathCache;
            string filePath    = GenFilePaths.FilePathForSavedGame(rawFilePath);

            MetaHeaderUtility.BeginReading(filePath);
            List <ModMetaHeader> metaHeaders = new List <ModMetaHeader>();

            foreach (var modContentPack in LoadedModManager.RunningMods)
            {
                // var metadata = modContentPack.GetMetaData();
                var version = MetaHeaderUtility.GetVersionFromManifestFile(modContentPack);
                metaHeaders.Add(new ModMetaHeader()
                {
                    Identifier = modContentPack.PackageId, Version = version
                });
                SimpleLog.Log($"Add metadata to metaHeaders list : {modContentPack.PackageId}, {version}");
            }
            MetaHeaderUtility.SetVersions(metaHeaders);
            MetaHeaderUtility.EndReading();
        }