account: Implement IManagerForApplication calls and IAsyncContext (#1466)
* account: Implement IManagerForApplication calls and IAsyncContext This implement: - IManagerForApplication::EnsureIdTokenCacheAsync (accordingly to RE) but the Async task is stubbed. - IAsyncContext interface (accordingly to RE). - IManagerForApplication::LoadIdTokenCache (checked with RE, and stubbed). I've tried some games but now they needs some `sfdnsres` calls, some other boots and crashes with other issues. Maybe we should disable the connection somewhere to lets the game think we are offline. I have done many attempts, without success, but since the code is here now, it's better than nothing. (I've cleaned up `using` of IGeneralService too) Closes #629 and closes #630 * change AccountId * Fix gdkchan's comments * use CompletedTask
This commit is contained in:
parent
5b26e4ef94
commit
5eb0ee3cca
6 changed files with 221 additions and 11 deletions
79
Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs
Normal file
79
Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs
Normal file
|
@ -0,0 +1,79 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using Ryujinx.HLE.HOS.Kernel.Common;
|
||||
using Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext;
|
||||
using System;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||
{
|
||||
class IAsyncContext : IpcService
|
||||
{
|
||||
AsyncExecution _asyncExecution;
|
||||
|
||||
public IAsyncContext(AsyncExecution asyncExecution)
|
||||
{
|
||||
_asyncExecution = asyncExecution;
|
||||
}
|
||||
|
||||
[Command(0)]
|
||||
// GetSystemEvent() -> handle<copy>
|
||||
public ResultCode GetSystemEvent(ServiceCtx context)
|
||||
{
|
||||
if (context.Process.HandleTable.GenerateHandle(_asyncExecution.SystemEvent.ReadableEvent, out int _systemEventHandle) != KernelResult.Success)
|
||||
{
|
||||
throw new InvalidOperationException("Out of handles!");
|
||||
}
|
||||
|
||||
context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_systemEventHandle);
|
||||
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
[Command(1)]
|
||||
// Cancel()
|
||||
public ResultCode Cancel(ServiceCtx context)
|
||||
{
|
||||
if (!_asyncExecution.IsInitialized)
|
||||
{
|
||||
return ResultCode.AsyncExecutionNotInitialized;
|
||||
}
|
||||
|
||||
if (_asyncExecution.IsRunning)
|
||||
{
|
||||
_asyncExecution.Cancel();
|
||||
}
|
||||
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
[Command(2)]
|
||||
// HasDone() -> b8
|
||||
public ResultCode HasDone(ServiceCtx context)
|
||||
{
|
||||
if (!_asyncExecution.IsInitialized)
|
||||
{
|
||||
return ResultCode.AsyncExecutionNotInitialized;
|
||||
}
|
||||
|
||||
context.ResponseData.Write(_asyncExecution.SystemEvent.ReadableEvent.IsSignaled());
|
||||
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
[Command(3)]
|
||||
// GetResult()
|
||||
public ResultCode GetResult(ServiceCtx context)
|
||||
{
|
||||
if (!_asyncExecution.IsInitialized)
|
||||
{
|
||||
return ResultCode.AsyncExecutionNotInitialized;
|
||||
}
|
||||
|
||||
if (!_asyncExecution.SystemEvent.ReadableEvent.IsSignaled())
|
||||
{
|
||||
return ResultCode.Unknown41;
|
||||
}
|
||||
|
||||
return ResultCode.Success;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue