aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Nim
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2020-07-27 01:04:08 +0200
committerGitHub <noreply@github.com>2020-07-27 01:04:08 +0200
commitca0d1f8205c3988d916033e2d950a421ddb995af (patch)
tree84871d4501cba182a92be3e037c2fb3cae16d512 /Ryujinx.HLE/HOS/Services/Nim
parentd8515b603bff4712fe0e84113d7f7823a84c85eb (diff)
ns/nim: Stub eShop related calls (#1420)
* ns/nim: Stub eShop related calls As we aren't able to process purchase on the eShop throught the emulator, I have: - Stub IPurchaseEventManager::SetDefaultDeliveryTarget (with RE check). - Implement IPurchaseEventManager::GetPurchasedEventReadableHandle (with RE check). As we can't do any eShop async call throught the emulator, I have: - Stub IShopServiceAccessServerInterface::CreateServerInterface - Stub IShopServiceAccessServer::CreateAccessorInterface - Stub IShopServiceAccessor::IShopServiceAsync Close #1084 and #1322 * fix handle copy * Fix align * Fix readonly event
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Nim')
-rw-r--r--Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServer.cs21
-rw-r--r--Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServerInterface.cs16
-rw-r--r--Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs37
-rw-r--r--Ryujinx.HLE/HOS/Services/Nim/IShopServiceAsync.cs7
4 files changed, 80 insertions, 1 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServer.cs b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServer.cs
new file mode 100644
index 00000000..ad41328e
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServer.cs
@@ -0,0 +1,21 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer;
+
+namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface
+{
+ class IShopServiceAccessServer : IpcService
+ {
+ public IShopServiceAccessServer() { }
+
+ [Command(0)]
+ // CreateAccessorInterface(u8) -> object<nn::ec::IShopServiceAccessor>
+ public ResultCode CreateAccessorInterface(ServiceCtx context)
+ {
+ MakeObject(context, new IShopServiceAccessor(context.Device.System));
+
+ Logger.PrintStub(LogClass.ServiceNim);
+
+ return ResultCode.Success;
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServerInterface.cs b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServerInterface.cs
index 9be84393..b3438dd7 100644
--- a/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServerInterface.cs
+++ b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessServerInterface.cs
@@ -1,8 +1,22 @@
-namespace Ryujinx.HLE.HOS.Services.Nim
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface;
+
+namespace Ryujinx.HLE.HOS.Services.Nim
{
[Service("nim:eca")] // 5.0.0+
class IShopServiceAccessServerInterface : IpcService
{
public IShopServiceAccessServerInterface(ServiceCtx context) { }
+
+ [Command(0)]
+ // CreateServerInterface(pid, handle<unknown>, u64) -> object<nn::ec::IShopServiceAccessServer>
+ public ResultCode CreateServerInterface(ServiceCtx context)
+ {
+ MakeObject(context, new IShopServiceAccessServer());
+
+ Logger.PrintStub(LogClass.ServiceNim);
+
+ return ResultCode.Success;
+ }
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs
new file mode 100644
index 00000000..6a9bdb06
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs
@@ -0,0 +1,37 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Ipc;
+using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Kernel.Threading;
+using Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer.ShopServiceAccessor;
+using System;
+
+namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer
+{
+ class IShopServiceAccessor : IpcService
+ {
+ private readonly KEvent _event;
+
+ public IShopServiceAccessor(Horizon system)
+ {
+ _event = new KEvent(system.KernelContext);
+ }
+
+ [Command(0)]
+ // CreateAsyncInterface(u64) -> (handle<copy>, object<nn::ec::IShopServiceAsync>)
+ public ResultCode CreateAsyncInterface(ServiceCtx context)
+ {
+ MakeObject(context, new IShopServiceAsync());
+
+ if (context.Process.HandleTable.GenerateHandle(_event.ReadableEvent, out int handle) != KernelResult.Success)
+ {
+ throw new InvalidOperationException("Out of handles!");
+ }
+
+ context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
+
+ Logger.PrintStub(LogClass.ServiceNim);
+
+ return ResultCode.Success;
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAsync.cs b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAsync.cs
new file mode 100644
index 00000000..81d892c5
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAsync.cs
@@ -0,0 +1,7 @@
+namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer.ShopServiceAccessor
+{
+ class IShopServiceAsync : IpcService
+ {
+ public IShopServiceAsync() { }
+ }
+} \ No newline at end of file