From 5eb0ee3ccaf531ad4042199f848e9462efb3d8ec Mon Sep 17 00:00:00 2001 From: Ac_K Date: Tue, 18 Aug 2020 21:24:54 +0200 Subject: 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 --- .../Account/Acc/AsyncContext/AsyncExecution.cs | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs (limited to 'Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext') diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs new file mode 100644 index 00000000..2ea92b11 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs @@ -0,0 +1,56 @@ +using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Kernel.Threading; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext +{ + class AsyncExecution + { + private readonly CancellationTokenSource _tokenSource; + private readonly CancellationToken _token; + + public KEvent SystemEvent { get; } + public bool IsInitialized { get; private set; } + public bool IsRunning { get; private set; } + + public AsyncExecution(KEvent asyncEvent) + { + SystemEvent = asyncEvent; + + _tokenSource = new CancellationTokenSource(); + _token = _tokenSource.Token; + } + + public void Initialize(int timeout, Func taskAsync) + { + Task.Run(async () => + { + IsRunning = true; + + _tokenSource.CancelAfter(timeout); + + try + { + await taskAsync(_token); + } + catch (Exception ex) + { + Logger.Warning?.Print(LogClass.ServiceAcc, $"Exception: {ex.Message}"); + } + + SystemEvent.ReadableEvent.Signal(); + + IsRunning = false; + }, _token); + + IsInitialized = true; + } + + public void Cancel() + { + _tokenSource.Cancel(); + } + } +} \ No newline at end of file -- cgit v1.2.3