mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 07:59:02 -05:00 
			
		
		
		
	Merge pull request #1742 from lioncash/hle-swkbd
am/applets: Minor cleanup
This commit is contained in:
		| @@ -532,8 +532,7 @@ void ICommonStateGetter::GetPerformanceMode(Kernel::HLERequestContext& ctx) { | ||||
| class ILibraryAppletAccessor final : public ServiceFramework<ILibraryAppletAccessor> { | ||||
| public: | ||||
|     explicit ILibraryAppletAccessor(std::shared_ptr<Applets::Applet> applet) | ||||
|         : ServiceFramework("ILibraryAppletAccessor"), applet(std::move(applet)), | ||||
|           broker(std::make_shared<Applets::AppletDataBroker>()) { | ||||
|         : ServiceFramework("ILibraryAppletAccessor"), applet(std::move(applet)) { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &ILibraryAppletAccessor::GetAppletStateChangedEvent, "GetAppletStateChangedEvent"}, | ||||
| @@ -562,7 +561,7 @@ public: | ||||
|  | ||||
| private: | ||||
|     void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { | ||||
|         const auto event = broker->GetStateChangedEvent(); | ||||
|         const auto event = applet->GetBroker().GetStateChangedEvent(); | ||||
|         event->Signal(); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
| @@ -590,7 +589,7 @@ private: | ||||
|     void Start(Kernel::HLERequestContext& ctx) { | ||||
|         ASSERT(applet != nullptr); | ||||
|  | ||||
|         applet->Initialize(broker); | ||||
|         applet->Initialize(); | ||||
|         applet->Execute(); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
| @@ -601,7 +600,7 @@ private: | ||||
|  | ||||
|     void PushInData(Kernel::HLERequestContext& ctx) { | ||||
|         IPC::RequestParser rp{ctx}; | ||||
|         broker->PushNormalDataFromGame(*rp.PopIpcInterface<IStorage>()); | ||||
|         applet->GetBroker().PushNormalDataFromGame(*rp.PopIpcInterface<IStorage>()); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
| @@ -612,7 +611,7 @@ private: | ||||
|     void PopOutData(Kernel::HLERequestContext& ctx) { | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|  | ||||
|         const auto storage = broker->PopNormalDataToGame(); | ||||
|         const auto storage = applet->GetBroker().PopNormalDataToGame(); | ||||
|         if (storage == nullptr) { | ||||
|             rb.Push(ERR_NO_DATA_IN_CHANNEL); | ||||
|             return; | ||||
| @@ -626,7 +625,7 @@ private: | ||||
|  | ||||
|     void PushInteractiveInData(Kernel::HLERequestContext& ctx) { | ||||
|         IPC::RequestParser rp{ctx}; | ||||
|         broker->PushInteractiveDataFromGame(*rp.PopIpcInterface<IStorage>()); | ||||
|         applet->GetBroker().PushInteractiveDataFromGame(*rp.PopIpcInterface<IStorage>()); | ||||
|  | ||||
|         ASSERT(applet->IsInitialized()); | ||||
|         applet->ExecuteInteractive(); | ||||
| @@ -641,7 +640,7 @@ private: | ||||
|     void PopInteractiveOutData(Kernel::HLERequestContext& ctx) { | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|  | ||||
|         const auto storage = broker->PopInteractiveDataToGame(); | ||||
|         const auto storage = applet->GetBroker().PopInteractiveDataToGame(); | ||||
|         if (storage == nullptr) { | ||||
|             rb.Push(ERR_NO_DATA_IN_CHANNEL); | ||||
|             return; | ||||
| @@ -656,7 +655,7 @@ private: | ||||
|     void GetPopOutDataEvent(Kernel::HLERequestContext& ctx) { | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(broker->GetNormalDataEvent()); | ||||
|         rb.PushCopyObjects(applet->GetBroker().GetNormalDataEvent()); | ||||
|  | ||||
|         LOG_DEBUG(Service_AM, "called"); | ||||
|     } | ||||
| @@ -664,13 +663,12 @@ private: | ||||
|     void GetPopInteractiveOutDataEvent(Kernel::HLERequestContext& ctx) { | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(broker->GetInteractiveDataEvent()); | ||||
|         rb.PushCopyObjects(applet->GetBroker().GetInteractiveDataEvent()); | ||||
|  | ||||
|         LOG_DEBUG(Service_AM, "called"); | ||||
|     } | ||||
|  | ||||
|     std::shared_ptr<Applets::Applet> applet; | ||||
|     std::shared_ptr<Applets::AppletDataBroker> broker; | ||||
| }; | ||||
|  | ||||
| void IStorage::Open(Kernel::HLERequestContext& ctx) { | ||||
|   | ||||
| @@ -98,10 +98,8 @@ Applet::Applet() = default; | ||||
|  | ||||
| Applet::~Applet() = default; | ||||
|  | ||||
| void Applet::Initialize(std::shared_ptr<AppletDataBroker> broker_) { | ||||
|     broker = std::move(broker_); | ||||
|  | ||||
|     const auto common = broker->PopNormalDataToApplet(); | ||||
| void Applet::Initialize() { | ||||
|     const auto common = broker.PopNormalDataToApplet(); | ||||
|     ASSERT(common != nullptr); | ||||
|  | ||||
|     const auto common_data = common->GetData(); | ||||
|   | ||||
| @@ -4,14 +4,17 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <functional> | ||||
| #include <memory> | ||||
| #include <queue> | ||||
| #include "common/swap.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
|  | ||||
| union ResultCode; | ||||
|  | ||||
| namespace Kernel { | ||||
| class Event; | ||||
| } | ||||
|  | ||||
| namespace Service::AM { | ||||
|  | ||||
| class IStorage; | ||||
| @@ -43,19 +46,26 @@ public: | ||||
|  | ||||
| private: | ||||
|     // Queues are named from applet's perspective | ||||
|     std::queue<std::unique_ptr<IStorage>> | ||||
|         in_channel; // PopNormalDataToApplet and PushNormalDataFromGame | ||||
|     std::queue<std::unique_ptr<IStorage>> | ||||
|         out_channel; // PopNormalDataToGame and PushNormalDataFromApplet | ||||
|     std::queue<std::unique_ptr<IStorage>> | ||||
|         in_interactive_channel; // PopInteractiveDataToApplet and PushInteractiveDataFromGame | ||||
|     std::queue<std::unique_ptr<IStorage>> | ||||
|         out_interactive_channel; // PopInteractiveDataToGame and PushInteractiveDataFromApplet | ||||
|  | ||||
|     // PopNormalDataToApplet and PushNormalDataFromGame | ||||
|     std::queue<std::unique_ptr<IStorage>> in_channel; | ||||
|  | ||||
|     // PopNormalDataToGame and PushNormalDataFromApplet | ||||
|     std::queue<std::unique_ptr<IStorage>> out_channel; | ||||
|  | ||||
|     // PopInteractiveDataToApplet and PushInteractiveDataFromGame | ||||
|     std::queue<std::unique_ptr<IStorage>> in_interactive_channel; | ||||
|  | ||||
|     // PopInteractiveDataToGame and PushInteractiveDataFromApplet | ||||
|     std::queue<std::unique_ptr<IStorage>> out_interactive_channel; | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> state_changed_event; | ||||
|     Kernel::SharedPtr<Kernel::Event> pop_out_data_event; // Signaled on PushNormalDataFromApplet | ||||
|     Kernel::SharedPtr<Kernel::Event> | ||||
|         pop_interactive_out_data_event; // Signaled on PushInteractiveDataFromApplet | ||||
|  | ||||
|     // Signaled on PushNormalDataFromApplet | ||||
|     Kernel::SharedPtr<Kernel::Event> pop_out_data_event; | ||||
|  | ||||
|     // Signaled on PushInteractiveDataFromApplet | ||||
|     Kernel::SharedPtr<Kernel::Event> pop_interactive_out_data_event; | ||||
| }; | ||||
|  | ||||
| class Applet { | ||||
| @@ -63,7 +73,7 @@ public: | ||||
|     Applet(); | ||||
|     virtual ~Applet(); | ||||
|  | ||||
|     virtual void Initialize(std::shared_ptr<AppletDataBroker> broker); | ||||
|     virtual void Initialize(); | ||||
|  | ||||
|     virtual bool TransactionComplete() const = 0; | ||||
|     virtual ResultCode GetStatus() const = 0; | ||||
| @@ -74,6 +84,14 @@ public: | ||||
|         return initialized; | ||||
|     } | ||||
|  | ||||
|     AppletDataBroker& GetBroker() { | ||||
|         return broker; | ||||
|     } | ||||
|  | ||||
|     const AppletDataBroker& GetBroker() const { | ||||
|         return broker; | ||||
|     } | ||||
|  | ||||
| protected: | ||||
|     struct CommonArguments { | ||||
|         u32_le arguments_version; | ||||
| @@ -85,8 +103,8 @@ protected: | ||||
|     }; | ||||
|     static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size."); | ||||
|  | ||||
|     CommonArguments common_args; | ||||
|     std::shared_ptr<AppletDataBroker> broker; | ||||
|     CommonArguments common_args{}; | ||||
|     AppletDataBroker broker; | ||||
|     bool initialized = false; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -42,21 +42,21 @@ SoftwareKeyboard::SoftwareKeyboard() = default; | ||||
|  | ||||
| SoftwareKeyboard::~SoftwareKeyboard() = default; | ||||
|  | ||||
| void SoftwareKeyboard::Initialize(std::shared_ptr<AppletDataBroker> broker_) { | ||||
| void SoftwareKeyboard::Initialize() { | ||||
|     complete = false; | ||||
|     initial_text.clear(); | ||||
|     final_data.clear(); | ||||
|  | ||||
|     Applet::Initialize(std::move(broker_)); | ||||
|     Applet::Initialize(); | ||||
|  | ||||
|     const auto keyboard_config_storage = broker->PopNormalDataToApplet(); | ||||
|     const auto keyboard_config_storage = broker.PopNormalDataToApplet(); | ||||
|     ASSERT(keyboard_config_storage != nullptr); | ||||
|     const auto& keyboard_config = keyboard_config_storage->GetData(); | ||||
|  | ||||
|     ASSERT(keyboard_config.size() >= sizeof(KeyboardConfig)); | ||||
|     std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig)); | ||||
|  | ||||
|     const auto work_buffer_storage = broker->PopNormalDataToApplet(); | ||||
|     const auto work_buffer_storage = broker.PopNormalDataToApplet(); | ||||
|     ASSERT(work_buffer_storage != nullptr); | ||||
|     const auto& work_buffer = work_buffer_storage->GetData(); | ||||
|  | ||||
| @@ -81,7 +81,7 @@ void SoftwareKeyboard::ExecuteInteractive() { | ||||
|     if (complete) | ||||
|         return; | ||||
|  | ||||
|     const auto storage = broker->PopInteractiveDataToApplet(); | ||||
|     const auto storage = broker.PopInteractiveDataToApplet(); | ||||
|     ASSERT(storage != nullptr); | ||||
|     const auto data = storage->GetData(); | ||||
|     const auto status = static_cast<bool>(data[0]); | ||||
| @@ -95,13 +95,13 @@ void SoftwareKeyboard::ExecuteInteractive() { | ||||
|         std::memcpy(string.data(), data.data() + 4, string.size() * 2); | ||||
|         frontend.SendTextCheckDialog( | ||||
|             Common::UTF16StringFromFixedZeroTerminatedBuffer(string.data(), string.size()), | ||||
|             [this] { broker->SignalStateChanged(); }); | ||||
|             [this] { broker.SignalStateChanged(); }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void SoftwareKeyboard::Execute() { | ||||
|     if (complete) { | ||||
|         broker->PushNormalDataFromApplet(IStorage{final_data}); | ||||
|         broker.PushNormalDataFromApplet(IStorage{final_data}); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
| @@ -145,17 +145,17 @@ void SoftwareKeyboard::WriteText(std::optional<std::u16string> text) { | ||||
|         final_data = output_main; | ||||
|  | ||||
|         if (complete) { | ||||
|             broker->PushNormalDataFromApplet(IStorage{output_main}); | ||||
|             broker.PushNormalDataFromApplet(IStorage{output_main}); | ||||
|         } else { | ||||
|             broker->PushInteractiveDataFromApplet(IStorage{output_sub}); | ||||
|             broker.PushInteractiveDataFromApplet(IStorage{output_sub}); | ||||
|         } | ||||
|  | ||||
|         broker->SignalStateChanged(); | ||||
|         broker.SignalStateChanged(); | ||||
|     } else { | ||||
|         output_main[0] = 1; | ||||
|         complete = true; | ||||
|         broker->PushNormalDataFromApplet(IStorage{output_main}); | ||||
|         broker->SignalStateChanged(); | ||||
|         broker.PushNormalDataFromApplet(IStorage{output_main}); | ||||
|         broker.SignalStateChanged(); | ||||
|     } | ||||
| } | ||||
| } // namespace Service::AM::Applets | ||||
|   | ||||
| @@ -4,7 +4,12 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <array> | ||||
| #include <string> | ||||
| #include <vector> | ||||
|  | ||||
| #include "common/common_funcs.h" | ||||
| #include "common/swap.h" | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/am/applets/applets.h" | ||||
|  | ||||
| @@ -50,7 +55,7 @@ public: | ||||
|     SoftwareKeyboard(); | ||||
|     ~SoftwareKeyboard() override; | ||||
|  | ||||
|     void Initialize(std::shared_ptr<AppletDataBroker> broker) override; | ||||
|     void Initialize() override; | ||||
|  | ||||
|     bool TransactionComplete() const override; | ||||
|     ResultCode GetStatus() const override; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei