using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p { class ISfServiceMonitor : IpcService { private readonly KEvent _stateChangeEvent; private readonly KEvent _jointEvent; private int _stateChangeEventHandle = 0; private int _jointEventHandle = 0; public ISfServiceMonitor(ServiceCtx context) { _stateChangeEvent = new KEvent(context.Device.System.KernelContext); _jointEvent = new KEvent(context.Device.System.KernelContext); } [CommandCmif(0)] // Initialize() public ResultCode Initialize(ServiceCtx context) { context.ResponseData.Write(0); return ResultCode.Success; } [CommandCmif(256)] // AttachNetworkInterfaceStateChangeEvent() -> handle public ResultCode AttachNetworkInterfaceStateChangeEvent(ServiceCtx context) { if (context.Process.HandleTable.GenerateHandle(_stateChangeEvent.ReadableEvent, out _stateChangeEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_stateChangeEventHandle); return ResultCode.Success; } [CommandCmif(288)] // GetGroupInfo(buffer) public ResultCode GetGroupInfo(ServiceCtx context) { Logger.Stub?.PrintStub(LogClass.ServiceLdn); return ResultCode.Success; } [CommandCmif(296)] // GetGroupInfo2(buffer, buffer) public ResultCode GetGroupInfo2(ServiceCtx context) { Logger.Stub?.PrintStub(LogClass.ServiceLdn); return ResultCode.Success; } [CommandCmif(312)] // GetIpConfig(buffer, 0x1a>) public ResultCode GetIpConfig(ServiceCtx context) { Logger.Stub?.PrintStub(LogClass.ServiceLdn); return ResultCode.Success; } [CommandCmif(328)] // AttachNetworkInterfaceStateChangeEvent() -> handle public ResultCode AttachJoinEvent(ServiceCtx context) { if (context.Process.HandleTable.GenerateHandle(_jointEvent.ReadableEvent, out _jointEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_jointEventHandle); return ResultCode.Success; } } }