aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Prepo
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/Prepo
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/Prepo')
-rw-r--r--src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs21
-rw-r--r--src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs7
-rw-r--r--src/Ryujinx.Horizon/Prepo/PrepoServerManager.cs18
3 files changed, 34 insertions, 12 deletions
diff --git a/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs b/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs
index c165f46f..4ed7dd48 100644
--- a/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs
+++ b/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs
@@ -5,6 +5,7 @@ using Ryujinx.Common.Utilities;
using Ryujinx.Horizon.Common;
using Ryujinx.Horizon.Prepo.Types;
using Ryujinx.Horizon.Sdk.Account;
+using Ryujinx.Horizon.Sdk.Arp;
using Ryujinx.Horizon.Sdk.Prepo;
using Ryujinx.Horizon.Sdk.Sf;
using Ryujinx.Horizon.Sdk.Sf.Hipc;
@@ -22,14 +23,16 @@ namespace Ryujinx.Horizon.Prepo.Ipc
System,
}
+ private readonly ArpApi _arp;
private readonly PrepoServicePermissionLevel _permissionLevel;
private ulong _systemSessionId;
private bool _immediateTransmissionEnabled;
private bool _userAgreementCheckEnabled = true;
- public PrepoService(PrepoServicePermissionLevel permissionLevel)
+ public PrepoService(ArpApi arp, PrepoServicePermissionLevel permissionLevel)
{
+ _arp = arp;
_permissionLevel = permissionLevel;
}
@@ -165,7 +168,7 @@ namespace Ryujinx.Horizon.Prepo.Ipc
return PrepoResult.PermissionDenied;
}
- private static Result ProcessPlayReport(PlayReportKind playReportKind, ReadOnlySpan<byte> gameRoomBuffer, ReadOnlySpan<byte> reportBuffer, ulong pid, Uid userId, bool withUserId = false, ApplicationId applicationId = default)
+ private Result ProcessPlayReport(PlayReportKind playReportKind, ReadOnlySpan<byte> gameRoomBuffer, ReadOnlySpan<byte> reportBuffer, ulong pid, Uid userId, bool withUserId = false, ApplicationId applicationId = default)
{
if (withUserId)
{
@@ -199,8 +202,8 @@ namespace Ryujinx.Horizon.Prepo.Ipc
builder.AppendLine("PlayReport log:");
builder.AppendLine($" Kind: {playReportKind}");
- // NOTE: The service calls arp:r using the pid to get the application id, if it fails PrepoResult.InvalidPid is returned.
- // Reports are stored internally and an event is signaled to transmit them.
+ // NOTE: Reports are stored internally and an event is signaled to transmit them.
+
if (pid != 0)
{
builder.AppendLine($" Pid: {pid}");
@@ -210,6 +213,16 @@ namespace Ryujinx.Horizon.Prepo.Ipc
builder.AppendLine($" ApplicationId: {applicationId}");
}
+ Result result = _arp.GetApplicationInstanceId(out ulong applicationInstanceId, pid);
+ if (result.IsFailure)
+ {
+ return PrepoResult.InvalidPid;
+ }
+
+ _arp.GetApplicationLaunchProperty(out ApplicationLaunchProperty applicationLaunchProperty, applicationInstanceId).AbortOnFailure();
+
+ builder.AppendLine($" ApplicationVersion: {applicationLaunchProperty.Version}");
+
if (!userId.IsNull)
{
builder.AppendLine($" UserId: {userId}");
diff --git a/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs b/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs
index fd3f86ff..1902cde2 100644
--- a/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs
+++ b/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs
@@ -1,4 +1,5 @@
using Ryujinx.Horizon.Prepo.Types;
+using Ryujinx.Horizon.Sdk.Arp;
using Ryujinx.Horizon.Sdk.Sf.Hipc;
using Ryujinx.Horizon.Sdk.Sm;
@@ -17,16 +18,19 @@ namespace Ryujinx.Horizon.Prepo
private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false);
private SmApi _sm;
+ private ArpApi _arp;
private PrepoServerManager _serverManager;
public void Initialize()
{
HeapAllocator allocator = new();
+ _arp = new ArpApi(allocator);
+
_sm = new SmApi();
_sm.Initialize().AbortOnFailure();
- _serverManager = new PrepoServerManager(allocator, _sm, MaxPortsCount, _managerOptions, TotalMaxSessionsCount);
+ _serverManager = new PrepoServerManager(allocator, _sm, _arp, MaxPortsCount, _managerOptions, TotalMaxSessionsCount);
#pragma warning disable IDE0055 // Disable formatting
_serverManager.RegisterServer((int)PrepoPortIndex.Admin, ServiceName.Encode("prepo:a"), MaxSessionsCount); // 1.0.0-5.1.0
@@ -45,6 +49,7 @@ namespace Ryujinx.Horizon.Prepo
public void Shutdown()
{
+ _arp.Dispose();
_serverManager.Dispose();
}
}
diff --git a/src/Ryujinx.Horizon/Prepo/PrepoServerManager.cs b/src/Ryujinx.Horizon/Prepo/PrepoServerManager.cs
index 0c1c782f..8cac44c8 100644
--- a/src/Ryujinx.Horizon/Prepo/PrepoServerManager.cs
+++ b/src/Ryujinx.Horizon/Prepo/PrepoServerManager.cs
@@ -1,6 +1,7 @@
using Ryujinx.Horizon.Common;
using Ryujinx.Horizon.Prepo.Ipc;
using Ryujinx.Horizon.Prepo.Types;
+using Ryujinx.Horizon.Sdk.Arp;
using Ryujinx.Horizon.Sdk.Sf.Hipc;
using Ryujinx.Horizon.Sdk.Sm;
using System;
@@ -9,8 +10,11 @@ namespace Ryujinx.Horizon.Prepo
{
class PrepoServerManager : ServerManager
{
- public PrepoServerManager(HeapAllocator allocator, SmApi sm, int maxPorts, ManagerOptions options, int maxSessions) : base(allocator, sm, maxPorts, options, maxSessions)
+ private readonly ArpApi _arp;
+
+ public PrepoServerManager(HeapAllocator allocator, SmApi sm, ArpApi arp, int maxPorts, ManagerOptions options, int maxSessions) : base(allocator, sm, maxPorts, options, maxSessions)
{
+ _arp = arp;
}
protected override Result OnNeedsToAccept(int portIndex, Server server)
@@ -18,12 +22,12 @@ namespace Ryujinx.Horizon.Prepo
return (PrepoPortIndex)portIndex switch
{
#pragma warning disable IDE0055 // Disable formatting
- PrepoPortIndex.Admin => AcceptImpl(server, new PrepoService(PrepoServicePermissionLevel.Admin)),
- PrepoPortIndex.Admin2 => AcceptImpl(server, new PrepoService(PrepoServicePermissionLevel.Admin)),
- PrepoPortIndex.Manager => AcceptImpl(server, new PrepoService(PrepoServicePermissionLevel.Manager)),
- PrepoPortIndex.User => AcceptImpl(server, new PrepoService(PrepoServicePermissionLevel.User)),
- PrepoPortIndex.System => AcceptImpl(server, new PrepoService(PrepoServicePermissionLevel.System)),
- PrepoPortIndex.Debug => AcceptImpl(server, new PrepoService(PrepoServicePermissionLevel.Debug)),
+ PrepoPortIndex.Admin => AcceptImpl(server, new PrepoService(_arp, PrepoServicePermissionLevel.Admin)),
+ PrepoPortIndex.Admin2 => AcceptImpl(server, new PrepoService(_arp, PrepoServicePermissionLevel.Admin)),
+ PrepoPortIndex.Manager => AcceptImpl(server, new PrepoService(_arp, PrepoServicePermissionLevel.Manager)),
+ PrepoPortIndex.User => AcceptImpl(server, new PrepoService(_arp, PrepoServicePermissionLevel.User)),
+ PrepoPortIndex.System => AcceptImpl(server, new PrepoService(_arp, PrepoServicePermissionLevel.System)),
+ PrepoPortIndex.Debug => AcceptImpl(server, new PrepoService(_arp, PrepoServicePermissionLevel.Debug)),
_ => throw new ArgumentOutOfRangeException(nameof(portIndex)),
#pragma warning restore IDE0055
};