Files
VRCX/Dotnet/VRCXStorage.cs
Natsumi 938fff63d0 Electron support for Linux (#1074)
* init

* SQLite changes

* Move html folder, edit build scripts

* AppApi interface

* Build flags

* AppApi inheritance

* Finishing touches

* Merge upstream changes

* Test CI

* Fix class inits

* Rename AppApi

* Merge upstream changes

* Fix SQLiteLegacy on Linux, Add Linux interop, build tools

* Linux specific localisation strings

* Make it run

* Bring back most of Linux functionality

* Clean up

* Fix TTS voices

* Fix UI var

* Changes

* Electron minimise to tray

* Remove separate toggle for WlxOverlay

* Fixes

* Touchups

* Move csproj

* Window zoom, Desktop Notifications, VR check on Linux

* Fix desktop notifications, VR check spam

* Fix building on Linux

* Clean up

* Fix WebApi headers

* Rewrite VRCX updater

* Clean up

* Linux updater

* Add Linux to build action

* init

* SQLite changes

* Move html folder, edit build scripts

* AppApi interface

* Build flags

* AppApi inheritance

* Finishing touches

* Merge upstream changes

* Test CI

* Fix class inits

* Rename AppApi

* Merge upstream changes

* Fix SQLiteLegacy on Linux, Add Linux interop, build tools

* Linux specific localisation strings

* Make it run

* Bring back most of Linux functionality

* Clean up

* Fix TTS voices

* Changes

* Electron minimise to tray

* Remove separate toggle for WlxOverlay

* Fixes

* Touchups

* Move csproj

* Window zoom, Desktop Notifications, VR check on Linux

* Fix desktop notifications, VR check spam

* Fix building on Linux

* Clean up

* Fix WebApi headers

* Rewrite VRCX updater

* Clean up

* Linux updater

* Add Linux to build action

* Test updater

* Rebase and handle merge conflicts

* Fix Linux updater

* Fix Linux app restart

* Fix friend order

* Handle AppImageInstaller, show an install message on Linux

* Updates to the AppImage installer

* Fix Linux updater, fix set version, check for .NET, copy wine prefix

* Handle random errors

* Rotate tall prints

* try fix Linux restart bug

* Final

---------

Co-authored-by: rs189 <35667100+rs189@users.noreply.github.com>
2025-01-11 13:09:44 +13:00

142 lines
3.3 KiB
C#

// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Threading;
namespace VRCX
{
public class VRCXStorage
{
public static readonly VRCXStorage Instance;
private static readonly ReaderWriterLockSlim m_Lock = new ReaderWriterLockSlim();
private static Dictionary<string, string> m_Storage = new Dictionary<string, string>();
private static readonly string m_JsonPath = Path.Combine(Program.AppDataDirectory, "VRCX.json");
private static bool m_Dirty;
static VRCXStorage()
{
Instance = new VRCXStorage();
}
public void Load()
{
m_Lock.EnterWriteLock();
try
{
JsonFileSerializer.Deserialize(m_JsonPath, ref m_Storage);
m_Dirty = false;
}
finally
{
m_Lock.ExitWriteLock();
}
}
public void Save()
{
m_Lock.EnterReadLock();
try
{
if (m_Dirty)
{
JsonFileSerializer.Serialize(m_JsonPath, m_Storage);
m_Dirty = false;
}
}
finally
{
m_Lock.ExitReadLock();
}
}
public void Flush()
{
Save();
}
public void Clear()
{
m_Lock.EnterWriteLock();
try
{
if (m_Storage.Count > 0)
{
m_Storage.Clear();
m_Dirty = true;
}
}
finally
{
m_Lock.ExitWriteLock();
}
}
public bool Remove(string key)
{
m_Lock.EnterWriteLock();
try
{
var result = m_Storage.Remove(key);
if (result)
{
m_Dirty = true;
}
return result;
}
finally
{
m_Lock.ExitWriteLock();
}
}
public string Get(string key)
{
m_Lock.EnterReadLock();
try
{
return m_Storage.TryGetValue(key, out string value)
? value
: string.Empty;
}
finally
{
m_Lock.ExitReadLock();
}
}
public void Set(string key, string value)
{
m_Lock.EnterWriteLock();
try
{
m_Storage[key] = value;
m_Dirty = true;
}
finally
{
m_Lock.ExitWriteLock();
}
}
public string GetAll()
{
m_Lock.EnterReadLock();
try
{
return JsonSerializer.Serialize(m_Storage);
}
finally
{
m_Lock.ExitReadLock();
}
}
}
}