Add managed UIKit iOS client
.NET port / test (macos-latest) (push) Canceled after 0s
.NET port / test (ubuntu-24.04) (push) Canceled after 0s
.NET port / test (windows-latest) (push) Canceled after 0s
.NET port / apple-client (push) Canceled after 0s
.NET port / cpp-conformance (push) Canceled after 0s

This commit is contained in:
2026-09-19 15:43:37 +02:00
parent d0a72176ba
commit c6715028c1
41 changed files with 1110 additions and 40 deletions
+6 -9
View File
@@ -32,13 +32,6 @@ public sealed record ServerProfile(Guid Id, string Host, ushort Port, ServerAuth
public sealed class ServerProfileStore(string path)
{
private static readonly JsonSerializerOptions Json = new()
{
Converters = { new JsonStringEnumConverter() },
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
public IReadOnlyList<ServerProfile> Load()
{
try
@@ -48,7 +41,7 @@ public sealed class ServerProfileStore(string path)
using JsonDocument document = JsonDocument.Parse(contents);
if (document.RootElement.ValueKind == JsonValueKind.Array && document.RootElement.EnumerateArray().Any(LooksLegacy))
return LoadLegacy(document.RootElement);
return (JsonSerializer.Deserialize<ServerProfile[]>(contents, Json) ?? [])
return (JsonSerializer.Deserialize(contents, ServerProfileJsonContext.Default.ServerProfileArray) ?? [])
.Where(profile => profile.IsValid).ToArray();
}
catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or JsonException) { return []; }
@@ -64,7 +57,7 @@ public sealed class ServerProfileStore(string path)
string temporary = fullPath + "." + Guid.NewGuid().ToString("N") + ".tmp";
try
{
File.WriteAllBytes(temporary, JsonSerializer.SerializeToUtf8Bytes(valid, Json));
File.WriteAllBytes(temporary, JsonSerializer.SerializeToUtf8Bytes(valid, ServerProfileJsonContext.Default.ServerProfileArray));
File.Move(temporary, fullPath, true);
}
finally { if (File.Exists(temporary)) File.Delete(temporary); }
@@ -104,3 +97,7 @@ public sealed class ServerProfileStore(string path)
catch (JsonException) { }
}
}
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, WriteIndented = true, UseStringEnumConverter = true)]
[JsonSerializable(typeof(ServerProfile[]))]
internal sealed partial class ServerProfileJsonContext : JsonSerializerContext;
+2 -1
View File
@@ -39,6 +39,7 @@
"Google.Protobuf": "[3.36.1, )"
}
}
}
},
"net10.0/iossimulator-arm64": {}
}
}