aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Ui.Common
diff options
context:
space:
mode:
authorAndrey Sukharev <SukharevAndrey@users.noreply.github.com>2023-03-22 01:41:19 +0300
committerGitHub <noreply@github.com>2023-03-21 19:41:19 -0300
commit4ce4299ca2a6b11332f2341c69f40efd7205282f (patch)
tree595805d7b0288157c9e4e6598ce89de39e16b76c /Ryujinx.Ui.Common
parent17620d18db8d4a67e4b917596c760107d26fadc5 (diff)
Use source generated json serializers in order to improve code trimming (#4094)
* Use source generated json serializers in order to improve code trimming * Use strongly typed github releases model to fetch updates instead of raw Newtonsoft.Json parsing * Use separate model for LogEventArgs serialization * Make dynamic object formatter static. Fix string builder pooling. * Do not inherit json version of LogEventArgs from EventArgs * Fix extra space in object formatting * Write log json directly to stream instead of using buffer writer * Rebase fixes * Rebase fixes * Rebase fixes * Enforce block-scoped namespaces in the solution. Convert style for existing code * Apply suggestions from code review Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Rebase indent fix * Fix indent * Delete unnecessary json properties * Rebase fix * Remove overridden json property names as they are handled in the options * Apply suggestions from code review Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Use default json options in github api calls * Indentation and spacing fixes --------- Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
Diffstat (limited to 'Ryujinx.Ui.Common')
-rw-r--r--Ryujinx.Ui.Common/App/ApplicationJsonSerializerContext.cs10
-rw-r--r--Ryujinx.Ui.Common/App/ApplicationLibrary.cs14
-rw-r--r--Ryujinx.Ui.Common/Configuration/AudioBackend.cs6
-rw-r--r--Ryujinx.Ui.Common/Configuration/ConfigurationFileFormat.cs12
-rw-r--r--Ryujinx.Ui.Common/Configuration/ConfigurationFileFormatSettings.cs9
-rw-r--r--Ryujinx.Ui.Common/Configuration/ConfigurationJsonSerializerContext.cs10
-rw-r--r--Ryujinx.Ui.Common/Configuration/ConfigurationState.cs5
-rw-r--r--Ryujinx.Ui.Common/Configuration/System/Language.cs6
-rw-r--r--Ryujinx.Ui.Common/Configuration/System/Region.cs6
-rw-r--r--Ryujinx.Ui.Common/Models/Amiibo/AmiiboApi.cs57
-rw-r--r--Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs15
-rw-r--r--Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiUsage.cs12
-rw-r--r--Ryujinx.Ui.Common/Models/Amiibo/AmiiboJson.cs14
-rw-r--r--Ryujinx.Ui.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs9
-rw-r--r--Ryujinx.Ui.Common/Models/Github/GithubReleaseAssetJsonResponse.cs9
-rw-r--r--Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonResponse.cs10
-rw-r--r--Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonSerializerContext.cs9
17 files changed, 194 insertions, 19 deletions
diff --git a/Ryujinx.Ui.Common/App/ApplicationJsonSerializerContext.cs b/Ryujinx.Ui.Common/App/ApplicationJsonSerializerContext.cs
new file mode 100644
index 00000000..f81121c2
--- /dev/null
+++ b/Ryujinx.Ui.Common/App/ApplicationJsonSerializerContext.cs
@@ -0,0 +1,10 @@
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.App.Common
+{
+ [JsonSourceGenerationOptions(WriteIndented = true)]
+ [JsonSerializable(typeof(ApplicationMetadata))]
+ internal partial class ApplicationJsonSerializerContext : JsonSerializerContext
+ {
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/App/ApplicationLibrary.cs b/Ryujinx.Ui.Common/App/ApplicationLibrary.cs
index 43510d5e..add6dad3 100644
--- a/Ryujinx.Ui.Common/App/ApplicationLibrary.cs
+++ b/Ryujinx.Ui.Common/App/ApplicationLibrary.cs
@@ -10,6 +10,7 @@ using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
+using Ryujinx.Common.Utilities;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS;
using Ryujinx.HLE.HOS.SystemState;
@@ -22,7 +23,6 @@ using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading;
-using JsonHelper = Ryujinx.Common.Utilities.JsonHelper;
using Path = System.IO.Path;
namespace Ryujinx.Ui.App.Common
@@ -42,6 +42,8 @@ namespace Ryujinx.Ui.App.Common
private Language _desiredTitleLanguage;
private CancellationTokenSource _cancellationToken;
+ private static readonly ApplicationJsonSerializerContext SerializerContext = new(JsonHelper.GetDefaultSerializerOptions());
+
public ApplicationLibrary(VirtualFileSystem virtualFileSystem)
{
_virtualFileSystem = virtualFileSystem;
@@ -490,14 +492,12 @@ namespace Ryujinx.Ui.App.Common
appMetadata = new ApplicationMetadata();
- using FileStream stream = File.Create(metadataFile, 4096, FileOptions.WriteThrough);
-
- JsonHelper.Serialize(stream, appMetadata, true);
+ JsonHelper.SerializeToFile(metadataFile, appMetadata, SerializerContext.ApplicationMetadata);
}
try
{
- appMetadata = JsonHelper.DeserializeFromFile<ApplicationMetadata>(metadataFile);
+ appMetadata = JsonHelper.DeserializeFromFile(metadataFile, SerializerContext.ApplicationMetadata);
}
catch (JsonException)
{
@@ -510,9 +510,7 @@ namespace Ryujinx.Ui.App.Common
{
modifyFunction(appMetadata);
- using FileStream stream = File.Create(metadataFile, 4096, FileOptions.WriteThrough);
-
- JsonHelper.Serialize(stream, appMetadata, true);
+ JsonHelper.SerializeToFile(metadataFile, appMetadata, SerializerContext.ApplicationMetadata);
}
return appMetadata;
diff --git a/Ryujinx.Ui.Common/Configuration/AudioBackend.cs b/Ryujinx.Ui.Common/Configuration/AudioBackend.cs
index 99111ea6..1f9bd0ba 100644
--- a/Ryujinx.Ui.Common/Configuration/AudioBackend.cs
+++ b/Ryujinx.Ui.Common/Configuration/AudioBackend.cs
@@ -1,5 +1,9 @@
-namespace Ryujinx.Ui.Common.Configuration
+using Ryujinx.Common.Utilities;
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Configuration
{
+ [JsonConverter(typeof(TypedStringEnumConverter<AudioBackend>))]
public enum AudioBackend
{
Dummy,
diff --git a/Ryujinx.Ui.Common/Configuration/ConfigurationFileFormat.cs b/Ryujinx.Ui.Common/Configuration/ConfigurationFileFormat.cs
index e9aec04b..14c03957 100644
--- a/Ryujinx.Ui.Common/Configuration/ConfigurationFileFormat.cs
+++ b/Ryujinx.Ui.Common/Configuration/ConfigurationFileFormat.cs
@@ -5,7 +5,7 @@ using Ryujinx.Common.Utilities;
using Ryujinx.Ui.Common.Configuration.System;
using Ryujinx.Ui.Common.Configuration.Ui;
using System.Collections.Generic;
-using System.IO;
+using System.Text.Json.Nodes;
namespace Ryujinx.Ui.Common.Configuration
{
@@ -321,14 +321,14 @@ namespace Ryujinx.Ui.Common.Configuration
/// </summary>
/// <remarks>Kept for file format compatibility (to avoid possible failure when parsing configuration on old versions)</remarks>
/// TODO: Remove this when those older versions aren't in use anymore.
- public List<object> KeyboardConfig { get; set; }
+ public List<JsonObject> KeyboardConfig { get; set; }
/// <summary>
/// Legacy controller control bindings
/// </summary>
/// <remarks>Kept for file format compatibility (to avoid possible failure when parsing configuration on old versions)</remarks>
/// TODO: Remove this when those older versions aren't in use anymore.
- public List<object> ControllerConfig { get; set; }
+ public List<JsonObject> ControllerConfig { get; set; }
/// <summary>
/// Input configurations
@@ -354,11 +354,12 @@ namespace Ryujinx.Ui.Common.Configuration
/// Loads a configuration file from disk
/// </summary>
/// <param name="path">The path to the JSON configuration file</param>
+ /// <param name="configurationFileFormat">Parsed configuration file</param>
public static bool TryLoad(string path, out ConfigurationFileFormat configurationFileFormat)
{
try
{
- configurationFileFormat = JsonHelper.DeserializeFromFile<ConfigurationFileFormat>(path);
+ configurationFileFormat = JsonHelper.DeserializeFromFile(path, ConfigurationFileFormatSettings.SerializerContext.ConfigurationFileFormat);
return configurationFileFormat.Version != 0;
}
@@ -376,8 +377,7 @@ namespace Ryujinx.Ui.Common.Configuration
/// <param name="path">The path to the JSON configuration file</param>
public void SaveConfig(string path)
{
- using FileStream fileStream = File.Create(path, 4096, FileOptions.WriteThrough);
- JsonHelper.Serialize(fileStream, this, true);
+ JsonHelper.SerializeToFile(path, this, ConfigurationFileFormatSettings.SerializerContext.ConfigurationFileFormat);
}
}
}
diff --git a/Ryujinx.Ui.Common/Configuration/ConfigurationFileFormatSettings.cs b/Ryujinx.Ui.Common/Configuration/ConfigurationFileFormatSettings.cs
new file mode 100644
index 00000000..6ce2ef01
--- /dev/null
+++ b/Ryujinx.Ui.Common/Configuration/ConfigurationFileFormatSettings.cs
@@ -0,0 +1,9 @@
+using Ryujinx.Common.Utilities;
+
+namespace Ryujinx.Ui.Common.Configuration
+{
+ internal static class ConfigurationFileFormatSettings
+ {
+ public static readonly ConfigurationJsonSerializerContext SerializerContext = new(JsonHelper.GetDefaultSerializerOptions());
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Configuration/ConfigurationJsonSerializerContext.cs b/Ryujinx.Ui.Common/Configuration/ConfigurationJsonSerializerContext.cs
new file mode 100644
index 00000000..bb8dfb49
--- /dev/null
+++ b/Ryujinx.Ui.Common/Configuration/ConfigurationJsonSerializerContext.cs
@@ -0,0 +1,10 @@
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Configuration
+{
+ [JsonSourceGenerationOptions(WriteIndented = true)]
+ [JsonSerializable(typeof(ConfigurationFileFormat))]
+ internal partial class ConfigurationJsonSerializerContext : JsonSerializerContext
+ {
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Configuration/ConfigurationState.cs b/Ryujinx.Ui.Common/Configuration/ConfigurationState.cs
index bcdd2e70..82a331c1 100644
--- a/Ryujinx.Ui.Common/Configuration/ConfigurationState.cs
+++ b/Ryujinx.Ui.Common/Configuration/ConfigurationState.cs
@@ -9,6 +9,7 @@ using Ryujinx.Ui.Common.Configuration.Ui;
using Ryujinx.Ui.Common.Helper;
using System;
using System.Collections.Generic;
+using System.Text.Json.Nodes;
namespace Ryujinx.Ui.Common.Configuration
{
@@ -631,8 +632,8 @@ namespace Ryujinx.Ui.Common.Configuration
EnableKeyboard = Hid.EnableKeyboard,
EnableMouse = Hid.EnableMouse,
Hotkeys = Hid.Hotkeys,
- KeyboardConfig = new List<object>(),
- ControllerConfig = new List<object>(),
+ KeyboardConfig = new List<JsonObject>(),
+ ControllerConfig = new List<JsonObject>(),
InputConfig = Hid.InputConfig,
GraphicsBackend = Graphics.GraphicsBackend,
PreferredGpu = Graphics.PreferredGpu
diff --git a/Ryujinx.Ui.Common/Configuration/System/Language.cs b/Ryujinx.Ui.Common/Configuration/System/Language.cs
index 3d2dc991..404f8063 100644
--- a/Ryujinx.Ui.Common/Configuration/System/Language.cs
+++ b/Ryujinx.Ui.Common/Configuration/System/Language.cs
@@ -1,5 +1,9 @@
-namespace Ryujinx.Ui.Common.Configuration.System
+using Ryujinx.Common.Utilities;
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Configuration.System
{
+ [JsonConverter(typeof(TypedStringEnumConverter<Language>))]
public enum Language
{
Japanese,
diff --git a/Ryujinx.Ui.Common/Configuration/System/Region.cs b/Ryujinx.Ui.Common/Configuration/System/Region.cs
index fb51e08e..7dfac638 100644
--- a/Ryujinx.Ui.Common/Configuration/System/Region.cs
+++ b/Ryujinx.Ui.Common/Configuration/System/Region.cs
@@ -1,5 +1,9 @@
-namespace Ryujinx.Ui.Common.Configuration.System
+using Ryujinx.Common.Utilities;
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Configuration.System
{
+ [JsonConverter(typeof(TypedStringEnumConverter<Region>))]
public enum Region
{
Japan,
diff --git a/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApi.cs b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApi.cs
new file mode 100644
index 00000000..f412b950
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApi.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Models.Amiibo
+{
+ public struct AmiiboApi : IEquatable<AmiiboApi>
+ {
+ [JsonPropertyName("name")]
+ public string Name { get; set; }
+ [JsonPropertyName("head")]
+ public string Head { get; set; }
+ [JsonPropertyName("tail")]
+ public string Tail { get; set; }
+ [JsonPropertyName("image")]
+ public string Image { get; set; }
+ [JsonPropertyName("amiiboSeries")]
+ public string AmiiboSeries { get; set; }
+ [JsonPropertyName("character")]
+ public string Character { get; set; }
+ [JsonPropertyName("gameSeries")]
+ public string GameSeries { get; set; }
+ [JsonPropertyName("type")]
+ public string Type { get; set; }
+
+ [JsonPropertyName("release")]
+ public Dictionary<string, string> Release { get; set; }
+
+ [JsonPropertyName("gamesSwitch")]
+ public List<AmiiboApiGamesSwitch> GamesSwitch { get; set; }
+
+ public override string ToString()
+ {
+ return Name;
+ }
+
+ public string GetId()
+ {
+ return Head + Tail;
+ }
+
+ public bool Equals(AmiiboApi other)
+ {
+ return Head + Tail == other.Head + other.Tail;
+ }
+
+ public override bool Equals(object obj)
+ {
+ return obj is AmiiboApi other && Equals(other);
+ }
+
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Head, Tail);
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs
new file mode 100644
index 00000000..def7d1bc
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Models.Amiibo
+{
+ public class AmiiboApiGamesSwitch
+ {
+ [JsonPropertyName("amiiboUsage")]
+ public List<AmiiboApiUsage> AmiiboUsage { get; set; }
+ [JsonPropertyName("gameID")]
+ public List<string> GameId { get; set; }
+ [JsonPropertyName("gameName")]
+ public string GameName { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiUsage.cs b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiUsage.cs
new file mode 100644
index 00000000..814573c2
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboApiUsage.cs
@@ -0,0 +1,12 @@
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Models.Amiibo
+{
+ public class AmiiboApiUsage
+ {
+ [JsonPropertyName("Usage")]
+ public string Usage { get; set; }
+ [JsonPropertyName("write")]
+ public bool Write { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Models/Amiibo/AmiiboJson.cs b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboJson.cs
new file mode 100644
index 00000000..feb7993c
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboJson.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Models.Amiibo
+{
+ public struct AmiiboJson
+ {
+ [JsonPropertyName("amiibo")]
+ public List<AmiiboApi> Amiibo { get; set; }
+ [JsonPropertyName("lastUpdated")]
+ public DateTime LastUpdated { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs
new file mode 100644
index 00000000..4cbb5a7b
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs
@@ -0,0 +1,9 @@
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Models.Amiibo
+{
+ [JsonSerializable(typeof(AmiiboJson))]
+ public partial class AmiiboJsonSerializerContext : JsonSerializerContext
+ {
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Models/Github/GithubReleaseAssetJsonResponse.cs b/Ryujinx.Ui.Common/Models/Github/GithubReleaseAssetJsonResponse.cs
new file mode 100644
index 00000000..10d01478
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Github/GithubReleaseAssetJsonResponse.cs
@@ -0,0 +1,9 @@
+namespace Ryujinx.Ui.Common.Models.Github
+{
+ public class GithubReleaseAssetJsonResponse
+ {
+ public string Name { get; set; }
+ public string State { get; set; }
+ public string BrowserDownloadUrl { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonResponse.cs b/Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonResponse.cs
new file mode 100644
index 00000000..954d03e3
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonResponse.cs
@@ -0,0 +1,10 @@
+using System.Collections.Generic;
+
+namespace Ryujinx.Ui.Common.Models.Github
+{
+ public class GithubReleasesJsonResponse
+ {
+ public string Name { get; set; }
+ public List<GithubReleaseAssetJsonResponse> Assets { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonSerializerContext.cs b/Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonSerializerContext.cs
new file mode 100644
index 00000000..e5fd9d09
--- /dev/null
+++ b/Ryujinx.Ui.Common/Models/Github/GithubReleasesJsonSerializerContext.cs
@@ -0,0 +1,9 @@
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ui.Common.Models.Github
+{
+ [JsonSerializable(typeof(GithubReleasesJsonResponse), GenerationMode = JsonSourceGenerationMode.Metadata)]
+ public partial class GithubReleasesJsonSerializerContext : JsonSerializerContext
+ {
+ }
+} \ No newline at end of file