Merge pull request #6975 from ogniK5377/acc-async-ctx
account: EnsureTokenIdCacheAsync
This commit is contained in:
		| @@ -263,6 +263,8 @@ add_library(core STATIC | |||||||
|     hle/service/acc/acc_u0.h |     hle/service/acc/acc_u0.h | ||||||
|     hle/service/acc/acc_u1.cpp |     hle/service/acc/acc_u1.cpp | ||||||
|     hle/service/acc/acc_u1.h |     hle/service/acc/acc_u1.h | ||||||
|  |     hle/service/acc/async_context.cpp | ||||||
|  |     hle/service/acc/async_context.h | ||||||
|     hle/service/acc/errors.h |     hle/service/acc/errors.h | ||||||
|     hle/service/acc/profile_manager.cpp |     hle/service/acc/profile_manager.cpp | ||||||
|     hle/service/acc/profile_manager.h |     hle/service/acc/profile_manager.h | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ | |||||||
| #include "core/hle/service/acc/acc_su.h" | #include "core/hle/service/acc/acc_su.h" | ||||||
| #include "core/hle/service/acc/acc_u0.h" | #include "core/hle/service/acc/acc_u0.h" | ||||||
| #include "core/hle/service/acc/acc_u1.h" | #include "core/hle/service/acc/acc_u1.h" | ||||||
|  | #include "core/hle/service/acc/async_context.h" | ||||||
| #include "core/hle/service/acc/errors.h" | #include "core/hle/service/acc/errors.h" | ||||||
| #include "core/hle/service/acc/profile_manager.h" | #include "core/hle/service/acc/profile_manager.h" | ||||||
| #include "core/hle/service/glue/arp.h" | #include "core/hle/service/glue/arp.h" | ||||||
| @@ -454,22 +455,6 @@ public: | |||||||
|         : IProfileCommon{system_, "IProfileEditor", true, user_id_, profile_manager_} {} |         : IProfileCommon{system_, "IProfileEditor", true, user_id_, profile_manager_} {} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class IAsyncContext final : public ServiceFramework<IAsyncContext> { |  | ||||||
| public: |  | ||||||
|     explicit IAsyncContext(Core::System& system_) : ServiceFramework{system_, "IAsyncContext"} { |  | ||||||
|         // clang-format off |  | ||||||
|         static const FunctionInfo functions[] = { |  | ||||||
|             {0, nullptr, "GetSystemEvent"}, |  | ||||||
|             {1, nullptr, "Cancel"}, |  | ||||||
|             {2, nullptr, "HasDone"}, |  | ||||||
|             {3, nullptr, "GetResult"}, |  | ||||||
|         }; |  | ||||||
|         // clang-format on |  | ||||||
|  |  | ||||||
|         RegisterHandlers(functions); |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class ISessionObject final : public ServiceFramework<ISessionObject> { | class ISessionObject final : public ServiceFramework<ISessionObject> { | ||||||
| public: | public: | ||||||
|     explicit ISessionObject(Core::System& system_, Common::UUID) |     explicit ISessionObject(Core::System& system_, Common::UUID) | ||||||
| @@ -504,16 +489,44 @@ public: | |||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | class EnsureTokenIdCacheAsyncInterface final : public IAsyncContext { | ||||||
|  | public: | ||||||
|  |     explicit EnsureTokenIdCacheAsyncInterface(Core::System& system_) : IAsyncContext{system_} { | ||||||
|  |         MarkComplete(); | ||||||
|  |     } | ||||||
|  |     ~EnsureTokenIdCacheAsyncInterface() = default; | ||||||
|  |  | ||||||
|  |     void LoadIdTokenCache(Kernel::HLERequestContext& ctx) { | ||||||
|  |         LOG_WARNING(Service_ACC, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |     bool IsComplete() const override { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void Cancel() override {} | ||||||
|  |  | ||||||
|  |     ResultCode GetResult() const override { | ||||||
|  |         return ResultSuccess; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
| class IManagerForApplication final : public ServiceFramework<IManagerForApplication> { | class IManagerForApplication final : public ServiceFramework<IManagerForApplication> { | ||||||
| public: | public: | ||||||
|     explicit IManagerForApplication(Core::System& system_, Common::UUID user_id_) |     explicit IManagerForApplication(Core::System& system_, Common::UUID user_id_) | ||||||
|         : ServiceFramework{system_, "IManagerForApplication"}, user_id{user_id_} { |         : ServiceFramework{system_, "IManagerForApplication"}, | ||||||
|  |           ensure_token_id{std::make_shared<EnsureTokenIdCacheAsyncInterface>(system)}, | ||||||
|  |           user_id{user_id_} { | ||||||
|         // clang-format off |         // clang-format off | ||||||
|         static const FunctionInfo functions[] = { |         static const FunctionInfo functions[] = { | ||||||
|             {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, |             {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, | ||||||
|             {1, &IManagerForApplication::GetAccountId, "GetAccountId"}, |             {1, &IManagerForApplication::GetAccountId, "GetAccountId"}, | ||||||
|             {2, nullptr, "EnsureIdTokenCacheAsync"}, |             {2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"}, | ||||||
|             {3, nullptr, "LoadIdTokenCache"}, |             {3, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"}, | ||||||
|             {130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"}, |             {130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"}, | ||||||
|             {150, nullptr, "CreateAuthorizationRequest"}, |             {150, nullptr, "CreateAuthorizationRequest"}, | ||||||
|             {160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"}, |             {160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"}, | ||||||
| @@ -540,6 +553,20 @@ private: | |||||||
|         rb.PushRaw<u64>(user_id.GetNintendoID()); |         rb.PushRaw<u64>(user_id.GetNintendoID()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void EnsureIdTokenCacheAsync(Kernel::HLERequestContext& ctx) { | ||||||
|  |         LOG_WARNING(Service_ACC, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |         rb.PushIpcInterface(ensure_token_id); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void LoadIdTokenCache(Kernel::HLERequestContext& ctx) { | ||||||
|  |         LOG_WARNING(Service_ACC, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |         ensure_token_id->LoadIdTokenCache(ctx); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void GetNintendoAccountUserResourceCacheForApplication(Kernel::HLERequestContext& ctx) { |     void GetNintendoAccountUserResourceCacheForApplication(Kernel::HLERequestContext& ctx) { | ||||||
|         LOG_WARNING(Service_ACC, "(STUBBED) called"); |         LOG_WARNING(Service_ACC, "(STUBBED) called"); | ||||||
|  |  | ||||||
| @@ -562,6 +589,7 @@ private: | |||||||
|         rb.Push(ResultSuccess); |         rb.Push(ResultSuccess); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     std::shared_ptr<EnsureTokenIdCacheAsyncInterface> ensure_token_id{}; | ||||||
|     Common::UUID user_id{Common::INVALID_UUID}; |     Common::UUID user_id{Common::INVALID_UUID}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										68
									
								
								src/core/hle/service/acc/async_context.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/core/hle/service/acc/async_context.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | // Copyright 2021 yuzu emulator team | ||||||
|  | // Licensed under GPLv2 or any later version | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include "core/core.h" | ||||||
|  | #include "core/hle/ipc_helpers.h" | ||||||
|  | #include "core/hle/service/acc/async_context.h" | ||||||
|  |  | ||||||
|  | namespace Service::Account { | ||||||
|  | IAsyncContext::IAsyncContext(Core::System& system_) | ||||||
|  |     : ServiceFramework{system_, "IAsyncContext"}, compeletion_event{system_.Kernel()} { | ||||||
|  |  | ||||||
|  |     Kernel::KAutoObject::Create(std::addressof(compeletion_event)); | ||||||
|  |     compeletion_event.Initialize("IAsyncContext:CompletionEvent"); | ||||||
|  |  | ||||||
|  |     // clang-format off | ||||||
|  |     static const FunctionInfo functions[] = { | ||||||
|  |         {0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"}, | ||||||
|  |         {1, &IAsyncContext::Cancel, "Cancel"}, | ||||||
|  |         {2, &IAsyncContext::HasDone, "HasDone"}, | ||||||
|  |         {3, &IAsyncContext::GetResult, "GetResult"}, | ||||||
|  |     }; | ||||||
|  |     // clang-format on | ||||||
|  |  | ||||||
|  |     RegisterHandlers(functions); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void IAsyncContext::GetSystemEvent(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_DEBUG(Service_ACC, "called"); | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||||
|  |     rb.Push(ResultSuccess); | ||||||
|  |     rb.PushCopyObjects(compeletion_event.GetReadableEvent()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void IAsyncContext::Cancel(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_DEBUG(Service_ACC, "called"); | ||||||
|  |  | ||||||
|  |     Cancel(); | ||||||
|  |     MarkComplete(); | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |     rb.Push(ResultSuccess); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void IAsyncContext::HasDone(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_DEBUG(Service_ACC, "called"); | ||||||
|  |  | ||||||
|  |     is_complete.store(IsComplete()); | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |     rb.Push(ResultSuccess); | ||||||
|  |     rb.Push(is_complete.load()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void IAsyncContext::GetResult(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_DEBUG(Service_ACC, "called"); | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |     rb.Push(GetResult()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void IAsyncContext::MarkComplete() { | ||||||
|  |     is_complete.store(true); | ||||||
|  |     compeletion_event.GetWritableEvent().Signal(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Service::Account | ||||||
							
								
								
									
										37
									
								
								src/core/hle/service/acc/async_context.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/core/hle/service/acc/async_context.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | // Copyright 2021 yuzu emulator team | ||||||
|  | // Licensed under GPLv2 or any later version | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <atomic> | ||||||
|  | #include "core/hle/kernel/k_event.h" | ||||||
|  | #include "core/hle/service/service.h" | ||||||
|  |  | ||||||
|  | namespace Core { | ||||||
|  | class System; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | namespace Service::Account { | ||||||
|  |  | ||||||
|  | class IAsyncContext : public ServiceFramework<IAsyncContext> { | ||||||
|  | public: | ||||||
|  |     explicit IAsyncContext(Core::System& system_); | ||||||
|  |  | ||||||
|  |     void GetSystemEvent(Kernel::HLERequestContext& ctx); | ||||||
|  |     void Cancel(Kernel::HLERequestContext& ctx); | ||||||
|  |     void HasDone(Kernel::HLERequestContext& ctx); | ||||||
|  |     void GetResult(Kernel::HLERequestContext& ctx); | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |     virtual bool IsComplete() const = 0; | ||||||
|  |     virtual void Cancel() = 0; | ||||||
|  |     virtual ResultCode GetResult() const = 0; | ||||||
|  |  | ||||||
|  |     void MarkComplete(); | ||||||
|  |  | ||||||
|  |     std::atomic<bool> is_complete{false}; | ||||||
|  |     Kernel::KEvent compeletion_event; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | } // namespace Service::Account | ||||||
		Reference in New Issue
	
	Block a user