aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Arp/Ipc/Writer.cs
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2024-01-25 23:06:53 +0100
committerGitHub <noreply@github.com>2024-01-25 23:06:53 +0100
commitcd37c75b82f97ad5d3bf6317ffcde62c06a6e920 (patch)
treedb4f6e9630878a4b32c8880ef95f7c877e20aab0 /src/Ryujinx.Horizon/Arp/Ipc/Writer.cs
parent43705c2320c2ff7c8f6dca1141f3bf56033966d4 (diff)
Horizon: Implement arp:r and arp:w services (#5802)
* Horizon: Implement arp:r and arp:w services * Fix formatting * Remove HLE arp services * Revert "Remove HLE arp services" This reverts commit c576fcccadb963db56b96bacabd1c1ac7abfb1ab. * Keep LibHac impl since it's used in bcat * Addresses gdkchan's feedback * ArpApi in PrepoIpcServer and remove LmApi * Fix 2 * Fixes ArpApi init * Fix encoding * Update PrepoService.cs * Fix prepo
Diffstat (limited to 'src/Ryujinx.Horizon/Arp/Ipc/Writer.cs')
-rw-r--r--src/Ryujinx.Horizon/Arp/Ipc/Writer.cs75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/Ryujinx.Horizon/Arp/Ipc/Writer.cs b/src/Ryujinx.Horizon/Arp/Ipc/Writer.cs
new file mode 100644
index 00000000..29c98b77
--- /dev/null
+++ b/src/Ryujinx.Horizon/Arp/Ipc/Writer.cs
@@ -0,0 +1,75 @@
+using Ryujinx.Horizon.Common;
+using Ryujinx.Horizon.Sdk.Arp;
+using Ryujinx.Horizon.Sdk.Arp.Detail;
+using Ryujinx.Horizon.Sdk.OsTypes;
+using Ryujinx.Horizon.Sdk.Sf;
+
+namespace Ryujinx.Horizon.Arp.Ipc
+{
+ partial class Writer : IWriter, IServiceObject
+ {
+ private readonly ApplicationInstanceManager _applicationInstanceManager;
+
+ public Writer(ApplicationInstanceManager applicationInstanceManager)
+ {
+ _applicationInstanceManager = applicationInstanceManager;
+ }
+
+ [CmifCommand(0)]
+ public Result AcquireRegistrar(out IRegistrar registrar)
+ {
+ if (_applicationInstanceManager.Entries[0] != null)
+ {
+ if (_applicationInstanceManager.Entries[1] != null)
+ {
+ registrar = null;
+
+ return ArpResult.NoFreeInstance;
+ }
+ else
+ {
+ _applicationInstanceManager.Entries[1] = new ApplicationInstance();
+
+ registrar = new Registrar(_applicationInstanceManager.Entries[1]);
+ }
+ }
+ else
+ {
+ _applicationInstanceManager.Entries[0] = new ApplicationInstance();
+
+ registrar = new Registrar(_applicationInstanceManager.Entries[0]);
+ }
+
+ return Result.Success;
+ }
+
+ [CmifCommand(1)]
+ public Result UnregisterApplicationInstance(ulong applicationInstanceId)
+ {
+ if (_applicationInstanceManager.Entries[applicationInstanceId] != null)
+ {
+ _applicationInstanceManager.Entries[applicationInstanceId] = null;
+ }
+
+ Os.SignalSystemEvent(ref _applicationInstanceManager.SystemEvent);
+
+ return Result.Success;
+ }
+
+ [CmifCommand(2)]
+ public Result AcquireApplicationProcessPropertyUpdater(out IUpdater updater, ulong applicationInstanceId)
+ {
+ updater = new Updater(_applicationInstanceManager, applicationInstanceId, false);
+
+ return Result.Success;
+ }
+
+ [CmifCommand(3)]
+ public Result AcquireApplicationCertificateUpdater(out IUpdater updater, ulong applicationInstanceId)
+ {
+ updater = new Updater(_applicationInstanceManager, applicationInstanceId, true);
+
+ return Result.Success;
+ }
+ }
+}