aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMary <mary@mary.zone>2022-08-30 20:52:45 +0200
committerMary-nyan <thog@protonmail.com>2022-08-31 21:33:03 +0200
commitf6a7309b1459ddd0e48c726e79783d8dc7e07e3a (patch)
tree60c9bfdee0316e1c27c6abf114acabe5b07b8dd4
parent472a621589ebaccd8c5da93abce32a7f0105eaf6 (diff)
account: Implement LoadNetworkServiceLicenseKindAsync
This is needed to run Pokemon Legends Arceus 1.1.1 with guest internet enabled. The game still get stuck at loading screen.
-rw-r--r--Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/IManagerForApplication.cs14
-rw-r--r--Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs17
-rw-r--r--Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs2
-rw-r--r--Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncNetworkServiceLicenseKindContext.cs38
-rw-r--r--Ryujinx.HLE/HOS/Services/Account/Acc/Types/NetworkServiceLicenseKind.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Account/ResultCode.cs25
6 files changed, 91 insertions, 13 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/IManagerForApplication.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/IManagerForApplication.cs
index 62cf79b7..68ed3f50 100644
--- a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/IManagerForApplication.cs
+++ b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/IManagerForApplication.cs
@@ -57,5 +57,19 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
{
return _managerServer.StoreOpenContext(context);
}
+
+ [CommandHipc(170)] // 6.0.0+
+ // LoadNetworkServiceLicenseKindAsync() -> object<nn::account::detail::IAsyncNetworkServiceLicenseKindContext>
+ public ResultCode LoadNetworkServiceLicenseKindAsync(ServiceCtx context)
+ {
+ ResultCode resultCode = _managerServer.LoadNetworkServiceLicenseKindAsync(context, out IAsyncNetworkServiceLicenseKindContext asyncContext);
+
+ if (resultCode == ResultCode.Success)
+ {
+ MakeObject(context, asyncContext);
+ }
+
+ return resultCode;
+ }
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs
index 9c406a08..d74f5ecf 100644
--- a/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs
+++ b/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs
@@ -166,5 +166,22 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
return ResultCode.Success;
}
+
+ public ResultCode LoadNetworkServiceLicenseKindAsync(ServiceCtx context, out IAsyncNetworkServiceLicenseKindContext asyncContext)
+ {
+ KEvent asyncEvent = new KEvent(context.Device.System.KernelContext);
+ AsyncExecution asyncExecution = new AsyncExecution(asyncEvent);
+
+ Logger.Stub?.PrintStub(LogClass.ServiceAcc);
+
+ // NOTE: This is an extension of the data retrieved from the id token cache.
+ asyncExecution.Initialize(1000, EnsureIdTokenCacheAsyncImpl);
+
+ asyncContext = new IAsyncNetworkServiceLicenseKindContext(asyncExecution, NetworkServiceLicenseKind.Subscribed);
+
+ // return ResultCode.NullObject if the IAsyncNetworkServiceLicenseKindContext pointer is null. Doesn't occur in our case.
+
+ return ResultCode.Success;
+ }
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs
index 06037f9e..9c7cb2e0 100644
--- a/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs
+++ b/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs
@@ -7,7 +7,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
{
class IAsyncContext : IpcService
{
- AsyncExecution _asyncExecution;
+ protected AsyncExecution _asyncExecution;
public IAsyncContext(AsyncExecution asyncExecution)
{
diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncNetworkServiceLicenseKindContext.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncNetworkServiceLicenseKindContext.cs
new file mode 100644
index 00000000..6aab85fb
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncNetworkServiceLicenseKindContext.cs
@@ -0,0 +1,38 @@
+using Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext;
+
+namespace Ryujinx.HLE.HOS.Services.Account.Acc
+{
+ class IAsyncNetworkServiceLicenseKindContext : IAsyncContext
+ {
+ private NetworkServiceLicenseKind? _serviceLicenseKind;
+
+ public IAsyncNetworkServiceLicenseKindContext(AsyncExecution asyncExecution, NetworkServiceLicenseKind? serviceLicenseKind) : base(asyncExecution)
+ {
+ _serviceLicenseKind = serviceLicenseKind;
+ }
+
+ [CommandHipc(100)]
+ // GetNetworkServiceLicenseKind() -> nn::account::NetworkServiceLicenseKind
+ public ResultCode GetNetworkServiceLicenseKind(ServiceCtx context)
+ {
+ if (!_asyncExecution.IsInitialized)
+ {
+ return ResultCode.AsyncExecutionNotInitialized;
+ }
+
+ if (!_asyncExecution.SystemEvent.ReadableEvent.IsSignaled())
+ {
+ return ResultCode.Unknown41;
+ }
+
+ if (!_serviceLicenseKind.HasValue)
+ {
+ return ResultCode.MissingNetworkServiceLicenseKind;
+ }
+
+ context.ResponseData.Write((uint)_serviceLicenseKind.Value);
+
+ return ResultCode.Success;
+ }
+ }
+}
diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/Types/NetworkServiceLicenseKind.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/Types/NetworkServiceLicenseKind.cs
new file mode 100644
index 00000000..a33e2670
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Account/Acc/Types/NetworkServiceLicenseKind.cs
@@ -0,0 +1,8 @@
+namespace Ryujinx.HLE.HOS.Services.Account.Acc
+{
+ enum NetworkServiceLicenseKind : uint
+ {
+ NoSubscription,
+ Subscribed
+ }
+}
diff --git a/Ryujinx.HLE/HOS/Services/Account/ResultCode.cs b/Ryujinx.HLE/HOS/Services/Account/ResultCode.cs
index 7c23a8b6..34114ec9 100644
--- a/Ryujinx.HLE/HOS/Services/Account/ResultCode.cs
+++ b/Ryujinx.HLE/HOS/Services/Account/ResultCode.cs
@@ -7,17 +7,18 @@ namespace Ryujinx.HLE.HOS.Services.Account
Success = 0,
- NullArgument = (20 << ErrorCodeShift) | ModuleId,
- InvalidArgument = (22 << ErrorCodeShift) | ModuleId,
- NullInputBuffer = (30 << ErrorCodeShift) | ModuleId,
- InvalidBufferSize = (31 << ErrorCodeShift) | ModuleId,
- InvalidBuffer = (32 << ErrorCodeShift) | ModuleId,
- AsyncExecutionNotInitialized = (40 << ErrorCodeShift) | ModuleId,
- Unknown41 = (41 << ErrorCodeShift) | ModuleId,
- InternetRequestDenied = (59 << ErrorCodeShift) | ModuleId,
- UserNotFound = (100 << ErrorCodeShift) | ModuleId,
- NullObject = (302 << ErrorCodeShift) | ModuleId,
- Unknown341 = (341 << ErrorCodeShift) | ModuleId,
- InvalidIdTokenCacheBufferSize = (451 << ErrorCodeShift) | ModuleId
+ NullArgument = (20 << ErrorCodeShift) | ModuleId,
+ InvalidArgument = (22 << ErrorCodeShift) | ModuleId,
+ NullInputBuffer = (30 << ErrorCodeShift) | ModuleId,
+ InvalidBufferSize = (31 << ErrorCodeShift) | ModuleId,
+ InvalidBuffer = (32 << ErrorCodeShift) | ModuleId,
+ AsyncExecutionNotInitialized = (40 << ErrorCodeShift) | ModuleId,
+ Unknown41 = (41 << ErrorCodeShift) | ModuleId,
+ InternetRequestDenied = (59 << ErrorCodeShift) | ModuleId,
+ UserNotFound = (100 << ErrorCodeShift) | ModuleId,
+ NullObject = (302 << ErrorCodeShift) | ModuleId,
+ Unknown341 = (341 << ErrorCodeShift) | ModuleId,
+ MissingNetworkServiceLicenseKind = (400 << ErrorCodeShift) | ModuleId,
+ InvalidIdTokenCacheBufferSize = (451 << ErrorCodeShift) | ModuleId
}
}