| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 | using InABox.Core;using System;using System.Collections.Generic;using System.Diagnostics.CodeAnalysis;using System.Linq;using System.Text;using System.Threading.Tasks;namespace InABox.Avalonia;public static class CacheManager{    private static Dictionary<string, DateTime> _expiries = new();    private static Timer? _timer;    private static void StartTimer()    {        if (_timer is not null) return;        // _timer = new Timer(ProcessCache, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));    }    private static void ProcessCache(object? state)    {        var now = DateTime.Now;        var toDelete = _expiries.Where(x => x.Value < now).Select(x => x.Key).ToArray();        foreach (var item in toDelete)        {            try            {                File.Delete(CacheFileName(item));            }            catch(Exception e)            {                MobileLogging.Log(e);            }        }        lock (_expiries)        {            foreach (var item in toDelete)            {                _expiries.Remove(item);            }        }    }    private static void AddExpiry(string key, DateTime expiry)    {        // lock (_expiries)        // {        //     _expiries[key] = expiry;        // }        // SaveExpiries();    }    private static Guid CacheID { get; set; }    private static bool IsCached(string key) => File.Exists(CacheFileName(key));        private static string CacheFileName(string key) =>        Path.Combine(CacheFolder(), key);    private static string CacheFolder()    {        var result = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);        if (OperatingSystem.IsWindows())        {            var assembly = Path.GetFileNameWithoutExtension(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName);            result = Path.Combine(result, assembly);        }        if (CacheID != Guid.Empty)            result = Path.Combine(result, CacheID.ToString());        if (!Directory.Exists(result))            Directory.CreateDirectory(result);        return result;    }    private const string EXPIRY_FILE = "cache_expiry.json";    private static void LoadExpiries()    {        var filename = CacheFileName(EXPIRY_FILE);        if (File.Exists(filename))        {            var json = File.ReadAllText(filename);            lock (_expiries)            {                _expiries = Serialization.Deserialize<Dictionary<string, DateTime>>(json) ?? [];            }        }        else        {            lock (_expiries)            {                _expiries = [];            }        }    }    private static void SaveExpiries()    {        try        {            lock (_expiries)            {                var file = CacheFileName(EXPIRY_FILE);                var json = Serialization.Serialize(_expiries);                File.WriteAllText(file, json);            }        }        catch (Exception e)        {            MobileLogging.Log(e);        }    }    #region Public Interface    public static void Initialise(Guid cacheID)    {        CacheID = cacheID;        // LoadExpiries();        StartTimer();    }    public static bool TryLoadBinary<T>(string key, [NotNullWhen(true)] out T? value, out DateTime lastUpdated)        where T : class, ISerializeBinary, new()    {        var filename = CacheFileName(key);        if (File.Exists(filename))        {            lastUpdated = File.GetLastWriteTime(filename);            using var stream = new FileStream(filename, FileMode.Open);            value = Serialization.ReadBinary<T>(stream, BinarySerializationSettings.Latest);            return true;        }        else        {            lastUpdated = default;            value = null;            return false;        }    }    public static void SaveBinary<T>(string key, T value, DateTime expiry)        where T : class, ISerializeBinary, new()    {        var data = value.WriteBinary(BinarySerializationSettings.Latest);        try        {            var file = CacheFileName(key);            File.WriteAllBytes(file, data);            AddExpiry(key, expiry);        }        catch (Exception e)        {            MobileLogging.Log(e);        }    }    public static bool TryLoadJSON<T>(string key, [NotNullWhen(true)] out T? value, out DateTime lastUpdated)        where T : class, new()    {        var filename = CacheFileName(key);        if (File.Exists(filename))        {            lastUpdated = File.GetLastWriteTime(filename);            var json = File.ReadAllText(filename);            value = Serialization.Deserialize<T>(json);            return value is not null;        }        else        {            lastUpdated = default;            value = null;            return false;        }    }    public static void SaveJSON<T>(string key, T value, DateTime expiry)        where T : class, new()    {        try        {            var file = CacheFileName(key);            var json = Serialization.Serialize(value);            File.WriteAllText(file, json);            AddExpiry(key, expiry);        }        catch (Exception e)        {            MobileLogging.Log(e);        }    }    #endregion}
 |