using System.IO; using System.Collections.Generic; /* All of this is pretty much stolen from COM3D2.CacheEditMenu. Thanks Mr. Horsington. https://git.coder.horse/ghorsington/COM3D2.CacheEditMenu */ namespace MeidoPhotoStudio.Plugin { using static MenuFileUtility; public class MenuFileCache { private const int cacheVersion = 765; public static readonly string cachePath = Path.Combine(Constants.configPath, "cache.dat"); private readonly Dictionary modItems; private bool rebuild; public ModItem this[string menu] { get => modItems[menu]; set { if (!modItems.ContainsKey(menu)) { rebuild = true; modItems[menu] = value; } } } public MenuFileCache() { modItems = new Dictionary(); if (File.Exists(cachePath)) Deserialize(); } public bool Has(string menuFileName) => modItems.ContainsKey(menuFileName); private void Deserialize() { using BinaryReader binaryReader = new BinaryReader(File.OpenRead(cachePath)); if (binaryReader.ReadInt32() != cacheVersion) { Utility.LogInfo("Cache version out of date. Rebuilding"); return; } while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length) { ModItem item = ModItem.Deserialize(binaryReader); modItems[item.MenuFile] = item; } } public void Serialize() { if (!rebuild) return; using BinaryWriter binaryWriter = new BinaryWriter(File.OpenWrite(cachePath)); binaryWriter.Write(cacheVersion); foreach (ModItem item in modItems.Values) item.Serialize(binaryWriter); } } }