summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/am/applets/applets.cpp
diff options
context:
space:
mode:
authorZach Hilman <zachhilman@gmail.com>2018-11-19 20:24:36 +0100
committerZach Hilman <zachhilman@gmail.com>2018-11-19 20:24:36 +0100
commit32775125b7af14cf488fdcbc4a61c00507c2d4a5 (patch)
treea63293691dff6b54c8fec47050f435118ed3a17e /src/core/hle/service/am/applets/applets.cpp
parentsoftware_keyboard: Use correct offset for inital text string (diff)
downloadyuzu-32775125b7af14cf488fdcbc4a61c00507c2d4a5.tar
yuzu-32775125b7af14cf488fdcbc4a61c00507c2d4a5.tar.gz
yuzu-32775125b7af14cf488fdcbc4a61c00507c2d4a5.tar.bz2
yuzu-32775125b7af14cf488fdcbc4a61c00507c2d4a5.tar.lz
yuzu-32775125b7af14cf488fdcbc4a61c00507c2d4a5.tar.xz
yuzu-32775125b7af14cf488fdcbc4a61c00507c2d4a5.tar.zst
yuzu-32775125b7af14cf488fdcbc4a61c00507c2d4a5.zip
Diffstat (limited to 'src/core/hle/service/am/applets/applets.cpp')
-rw-r--r--src/core/hle/service/am/applets/applets.cpp95
1 files changed, 91 insertions, 4 deletions
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp
index be950d320..c81bd59b2 100644
--- a/src/core/hle/service/am/applets/applets.cpp
+++ b/src/core/hle/service/am/applets/applets.cpp
@@ -4,21 +4,108 @@
#include <cstring>
#include "common/assert.h"
+#include "core/core.h"
#include "core/frontend/applets/software_keyboard.h"
+#include "core/hle/kernel/event.h"
+#include "core/hle/kernel/server_port.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/applets/applets.h"
namespace Service::AM::Applets {
+AppletDataBroker::AppletDataBroker() {
+ auto& kernel = Core::System::GetInstance().Kernel();
+ state_changed_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
+ "ILibraryAppletAccessor:StateChangedEvent");
+ pop_out_data_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
+ "ILibraryAppletAccessor:PopDataOutEvent");
+ pop_interactive_out_data_event = Kernel::Event::Create(
+ kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent");
+}
+
+AppletDataBroker::~AppletDataBroker() = default;
+
+std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() {
+ if (out_channel.empty())
+ return nullptr;
+
+ auto out = std::move(out_channel.front());
+ out_channel.pop();
+ return out;
+}
+
+std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToApplet() {
+ if (in_channel.empty())
+ return nullptr;
+
+ auto out = std::move(in_channel.front());
+ in_channel.pop();
+ return out;
+}
+
+std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() {
+ if (out_interactive_channel.empty())
+ return nullptr;
+
+ auto out = std::move(out_interactive_channel.front());
+ out_interactive_channel.pop();
+ return out;
+}
+
+std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToApplet() {
+ if (in_interactive_channel.empty())
+ return nullptr;
+
+ auto out = std::move(in_interactive_channel.front());
+ in_interactive_channel.pop();
+ return out;
+}
+
+void AppletDataBroker::PushNormalDataFromGame(IStorage storage) {
+ in_channel.push(std::make_unique<IStorage>(storage));
+}
+
+void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) {
+ out_channel.push(std::make_unique<IStorage>(storage));
+ pop_out_data_event->Signal();
+}
+
+void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) {
+ in_interactive_channel.push(std::make_unique<IStorage>(storage));
+}
+
+void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) {
+ out_interactive_channel.push(std::make_unique<IStorage>(storage));
+ pop_interactive_out_data_event->Signal();
+}
+
+void AppletDataBroker::SignalStateChanged() const {
+ state_changed_event->Signal();
+}
+
+Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetNormalDataEvent() const {
+ return pop_out_data_event;
+}
+
+Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetInteractiveDataEvent() const {
+ return pop_interactive_out_data_event;
+}
+
+Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetStateChangedEvent() const {
+ return state_changed_event;
+}
+
Applet::Applet() = default;
Applet::~Applet() = default;
-void Applet::Initialize(std::queue<std::shared_ptr<IStorage>> storage) {
- storage_stack = std::move(storage);
+void Applet::Initialize(std::shared_ptr<AppletDataBroker> broker_) {
+ broker = std::move(broker_);
+
+ const auto common = broker->PopNormalDataToApplet();
+ ASSERT(common != nullptr);
- const auto common_data = storage_stack.front()->GetData();
- storage_stack.pop();
+ const auto common_data = common->GetData();
ASSERT(common_data.size() >= sizeof(CommonArguments));
std::memcpy(&common_args, common_data.data(), sizeof(CommonArguments));