aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Ns
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Ns')
-rw-r--r--Ryujinx.HLE/HOS/Services/Ns/IAddOnContentManager.cs4
-rw-r--r--Ryujinx.HLE/HOS/Services/Ns/IPurchaseEventManager.cs48
2 files changed, 48 insertions, 4 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Ns/IAddOnContentManager.cs b/Ryujinx.HLE/HOS/Services/Ns/IAddOnContentManager.cs
index 20d95cbb..e6e42c41 100644
--- a/Ryujinx.HLE/HOS/Services/Ns/IAddOnContentManager.cs
+++ b/Ryujinx.HLE/HOS/Services/Ns/IAddOnContentManager.cs
@@ -165,7 +165,7 @@ namespace Ryujinx.HLE.HOS.Services.Ns
// CreateEcPurchasedEventManager() -> object<nn::ec::IPurchaseEventManager>
public ResultCode CreateEcPurchasedEventManager(ServiceCtx context)
{
- MakeObject(context, new IPurchaseEventManager());
+ MakeObject(context, new IPurchaseEventManager(context.Device.System));
Logger.PrintStub(LogClass.ServiceNs);
@@ -178,7 +178,7 @@ namespace Ryujinx.HLE.HOS.Services.Ns
{
// Very similar to CreateEcPurchasedEventManager but with some extra code
- MakeObject(context, new IPurchaseEventManager());
+ MakeObject(context, new IPurchaseEventManager(context.Device.System));
Logger.PrintStub(LogClass.ServiceNs);
diff --git a/Ryujinx.HLE/HOS/Services/Ns/IPurchaseEventManager.cs b/Ryujinx.HLE/HOS/Services/Ns/IPurchaseEventManager.cs
index 6a512b7b..8bb05b04 100644
--- a/Ryujinx.HLE/HOS/Services/Ns/IPurchaseEventManager.cs
+++ b/Ryujinx.HLE/HOS/Services/Ns/IPurchaseEventManager.cs
@@ -1,8 +1,52 @@
+using Ryujinx.Common;
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Ipc;
+using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Kernel.Threading;
+using System;
+
namespace Ryujinx.HLE.HOS.Services.Ns
{
class IPurchaseEventManager : IpcService
{
- // TODO: Implement this
- // Size seems to be atleast 0x7a8
+ private readonly KEvent _purchasedEvent;
+
+ public IPurchaseEventManager(Horizon system)
+ {
+ _purchasedEvent = new KEvent(system.KernelContext);
+ }
+
+ [Command(0)]
+ // SetDefaultDeliveryTarget(pid, buffer<bytes, 5> unknown)
+ public ResultCode SetDefaultDeliveryTarget(ServiceCtx context)
+ {
+ long inBufferPosition = context.Request.SendBuff[0].Position;
+ long inBufferSize = context.Request.SendBuff[0].Size;
+ byte[] buffer = new byte[inBufferSize];
+
+ context.Memory.Read((ulong)inBufferPosition, buffer);
+
+ // NOTE: Service use the pid to call arp:r GetApplicationLaunchProperty and store it in internal field.
+ // Then it seems to use the buffer content and compare it with a stored linked instrusive list.
+ // Since we don't support purchase from eShop, we can stub it.
+
+ Logger.PrintStub(LogClass.ServiceNs);
+
+ return ResultCode.Success;
+ }
+
+ [Command(2)]
+ // GetPurchasedEventReadableHandle() -> handle<copy, event>
+ public ResultCode GetPurchasedEventReadableHandle(ServiceCtx context)
+ {
+ if (context.Process.HandleTable.GenerateHandle(_purchasedEvent.ReadableEvent, out int handle) != KernelResult.Success)
+ {
+ throw new InvalidOperationException("Out of handles!");
+ }
+
+ context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
+
+ return ResultCode.Success;
+ }
}
} \ No newline at end of file