diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs')
| -rw-r--r-- | src/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs new file mode 100644 index 00000000..c9af0727 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs @@ -0,0 +1,79 @@ +using Ryujinx.HLE.HOS.Ipc; +using Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext; +using Ryujinx.Horizon.Common; +using System; + +namespace Ryujinx.HLE.HOS.Services.Account.Acc +{ + class IAsyncContext : IpcService + { + protected AsyncExecution AsyncExecution; + + public IAsyncContext(AsyncExecution asyncExecution) + { + AsyncExecution = asyncExecution; + } + + [CommandCmif(0)] + // GetSystemEvent() -> handle<copy> + public ResultCode GetSystemEvent(ServiceCtx context) + { + if (context.Process.HandleTable.GenerateHandle(AsyncExecution.SystemEvent.ReadableEvent, out int _systemEventHandle) != Result.Success) + { + throw new InvalidOperationException("Out of handles!"); + } + + context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_systemEventHandle); + + return ResultCode.Success; + } + + [CommandCmif(1)] + // Cancel() + public ResultCode Cancel(ServiceCtx context) + { + if (!AsyncExecution.IsInitialized) + { + return ResultCode.AsyncExecutionNotInitialized; + } + + if (AsyncExecution.IsRunning) + { + AsyncExecution.Cancel(); + } + + return ResultCode.Success; + } + + [CommandCmif(2)] + // HasDone() -> b8 + public ResultCode HasDone(ServiceCtx context) + { + if (!AsyncExecution.IsInitialized) + { + return ResultCode.AsyncExecutionNotInitialized; + } + + context.ResponseData.Write(AsyncExecution.SystemEvent.ReadableEvent.IsSignaled()); + + return ResultCode.Success; + } + + [CommandCmif(3)] + // GetResult() + public ResultCode GetResult(ServiceCtx context) + { + if (!AsyncExecution.IsInitialized) + { + return ResultCode.AsyncExecutionNotInitialized; + } + + if (!AsyncExecution.SystemEvent.ReadableEvent.IsSignaled()) + { + return ResultCode.Unknown41; + } + + return ResultCode.Success; + } + } +}
\ No newline at end of file |
