Kaynağa Gözat

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.
Mary 3 yıl önce
ebeveyn
işleme
f6a7309b14

+ 14 - 0
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;
+        }
     }
 }

+ 17 - 0
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;
+        }
     }
 }

+ 1 - 1
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)
         {

+ 38 - 0
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;
+        }
+    }
+}

+ 8 - 0
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
+    }
+}

+ 13 - 12
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
     }
 }