am/applets: Make the applet data broker part of the applet itself.

The accessor should be doing just that, accessing, rather than retaining
the lifetime of the data broker as well.
This commit is contained in:
Lioncash 2018-11-20 12:02:16 -05:00
parent 8b4b560df5
commit 73b7748984
5 changed files with 36 additions and 31 deletions

View File

@ -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) {

View File

@ -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();

View File

@ -7,6 +7,7 @@
#include <memory>
#include <queue>
#include "common/swap.h"
#include "core/hle/kernel/kernel.h"
union ResultCode;
@ -72,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;
@ -83,6 +84,14 @@ public:
return initialized;
}
AppletDataBroker& GetBroker() {
return broker;
}
const AppletDataBroker& GetBroker() const {
return broker;
}
protected:
struct CommonArguments {
u32_le arguments_version;
@ -94,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;
};

View File

@ -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

View File

@ -55,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;