summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/am/applets/profile_select.cpp
diff options
context:
space:
mode:
authorZach Hilman <zachhilman@gmail.com>2018-11-23 03:02:36 +0100
committerZach Hilman <zachhilman@gmail.com>2018-12-03 23:26:27 +0100
commit4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f (patch)
treef8ccb5bf5e31a915a0572e1789f8b08dd9796f27 /src/core/hle/service/am/applets/profile_select.cpp
parentqt: Register to use Qt ProfileSelector instead of default (diff)
downloadyuzu-4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f.tar
yuzu-4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f.tar.gz
yuzu-4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f.tar.bz2
yuzu-4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f.tar.lz
yuzu-4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f.tar.xz
yuzu-4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f.tar.zst
yuzu-4fb59fdfe1e5fe2d0b9313c395e0d7c880e00c6f.zip
Diffstat (limited to 'src/core/hle/service/am/applets/profile_select.cpp')
-rw-r--r--src/core/hle/service/am/applets/profile_select.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/core/hle/service/am/applets/profile_select.cpp b/src/core/hle/service/am/applets/profile_select.cpp
new file mode 100644
index 000000000..750f0fdeb
--- /dev/null
+++ b/src/core/hle/service/am/applets/profile_select.cpp
@@ -0,0 +1,76 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <cstring>
+#include "common/assert.h"
+#include "common/string_util.h"
+#include "core/core.h"
+#include "core/frontend/applets/software_keyboard.h"
+#include "core/hle/service/am/am.h"
+#include "core/hle/service/am/applets/profile_select.h"
+
+namespace Service::AM::Applets {
+
+constexpr ResultCode ERR_USER_CANCELLED_SELECTION{ErrorModule::Account, 1};
+
+ProfileSelect::ProfileSelect() = default;
+ProfileSelect::~ProfileSelect() = default;
+
+void ProfileSelect::Initialize() {
+ complete = false;
+ status = RESULT_SUCCESS;
+ final_data.clear();
+
+ Applet::Initialize();
+
+ const auto user_config_storage = broker.PopNormalDataToApplet();
+ ASSERT(user_config_storage != nullptr);
+ const auto& user_config = user_config_storage->GetData();
+
+ ASSERT(user_config.size() >= sizeof(UserSelectionConfig));
+ std::memcpy(&config, user_config.data(), sizeof(UserSelectionConfig));
+}
+
+bool ProfileSelect::TransactionComplete() const {
+ return complete;
+}
+
+ResultCode ProfileSelect::GetStatus() const {
+ return status;
+}
+
+void ProfileSelect::ExecuteInteractive() {
+ UNREACHABLE_MSG("Attempted to call interactive execution on non-interactive applet.");
+}
+
+void ProfileSelect::Execute() {
+ if (complete) {
+ broker.PushNormalDataFromApplet(IStorage{final_data});
+ return;
+ }
+
+ const auto& frontend{Core::System::GetInstance().GetProfileSelector()};
+
+ frontend.SelectProfile([this](std::optional<Account::UUID> uuid) { SelectionComplete(uuid); });
+}
+
+void ProfileSelect::SelectionComplete(std::optional<Account::UUID> uuid) {
+ UserSelectionOutput output{};
+
+ if (uuid.has_value() && uuid->uuid != Account::INVALID_UUID) {
+ output.result = 0;
+ output.uuid_selected = uuid->uuid;
+ } else {
+ status = ERR_USER_CANCELLED_SELECTION;
+ output.result = ERR_USER_CANCELLED_SELECTION.raw;
+ output.uuid_selected = Account::INVALID_UUID;
+ }
+
+ final_data = std::vector<u8>(sizeof(UserSelectionOutput));
+ std::memcpy(final_data.data(), &output, final_data.size());
+ broker.PushNormalDataFromApplet(IStorage{final_data});
+ broker.SignalStateChanged();
+}
+
+} // namespace Service::AM::Applets