aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Friend/INotificationService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Friend/INotificationService.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Friend/INotificationService.cs29
1 files changed, 26 insertions, 3 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Friend/INotificationService.cs b/Ryujinx.HLE/HOS/Services/Friend/INotificationService.cs
index 46a5f17c..8b684e6b 100644
--- a/Ryujinx.HLE/HOS/Services/Friend/INotificationService.cs
+++ b/Ryujinx.HLE/HOS/Services/Friend/INotificationService.cs
@@ -1,5 +1,8 @@
using Ryujinx.HLE.HOS.Ipc;
+using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.HLE.Utilities;
+using System;
using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Friend
@@ -8,6 +11,9 @@ namespace Ryujinx.HLE.HOS.Services.Friend
{
private UInt128 _userId;
+ private KEvent _notificationEvent;
+ private int _notificationEventHandle = 0;
+
private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
@@ -16,12 +22,29 @@ namespace Ryujinx.HLE.HOS.Services.Friend
{
_commands = new Dictionary<int, ServiceProcessRequest>
{
- //{ 0, GetEvent },
- //{ 1, Pop },
- //{ 2, Clear },
+ { 0, GetEvent }, // 2.0.0+
+ //{ 1, Clear }, // 2.0.0+
+ //{ 2, Pop }, // 2.0.0+
};
_userId = userId;
}
+
+ public long GetEvent(ServiceCtx context)
+ {
+ if (_notificationEventHandle == 0)
+ {
+ _notificationEvent = new KEvent(context.Device.System);
+
+ if (context.Process.HandleTable.GenerateHandle(_notificationEvent.ReadableEvent, out _notificationEventHandle) != KernelResult.Success)
+ {
+ throw new InvalidOperationException("Out of handles!");
+ }
+ }
+
+ context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_notificationEventHandle);
+
+ return 0;
+ }
}
} \ No newline at end of file