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