am: Implement text check software keyboard mode

Allows the game to verify and send a message to the frontend.
This commit is contained in:
Zach Hilman
2018-11-11 16:41:31 -05:00
parent e696ed1f4d
commit fed6ab14c3
6 changed files with 120 additions and 14 deletions

View File

@@ -8,6 +8,8 @@
#include <vector>
#include "common/swap.h"
union ResultCode;
namespace Frontend {
class SoftwareKeyboardApplet;
}
@@ -25,6 +27,9 @@ public:
virtual void Initialize(std::vector<std::shared_ptr<IStorage>> storage);
virtual bool TransactionComplete() const = 0;
virtual ResultCode GetStatus() const = 0;
virtual void ReceiveInteractiveData(std::shared_ptr<IStorage> storage) = 0;
virtual IStorage Execute() = 0;
bool IsInitialized() const {

View File

@@ -50,28 +50,77 @@ void SoftwareKeyboard::Initialize(std::vector<std::shared_ptr<IStorage>> storage
ASSERT(keyboard_config.size() >= sizeof(KeyboardConfig));
std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig));
ASSERT_MSG(config.text_check == 0, "Text check software keyboard mode is not implemented!");
const auto& work_buffer = storage_stack[2]->GetData();
std::memcpy(initial_text.data(), work_buffer.data() + config.initial_string_offset,
config.initial_string_size);
if (config.initial_string_size == 0)
return;
std::vector<char16_t> string(config.initial_string_size);
std::memcpy(string.data(), work_buffer.data() + 4, string.size() * 2);
initial_text = Common::UTF16StringFromFixedZeroTerminatedBuffer(string.data(), string.size());
}
bool SoftwareKeyboard::TransactionComplete() const {
return complete;
}
ResultCode SoftwareKeyboard::GetStatus() const {
return RESULT_SUCCESS;
}
void SoftwareKeyboard::ReceiveInteractiveData(std::shared_ptr<IStorage> storage) {
if (complete)
return;
const auto data = storage->GetData();
const auto status = static_cast<bool>(data[0]);
if (status == INTERACTIVE_STATUS_OK) {
complete = true;
} else {
const auto& frontend{Core::System::GetInstance().GetSoftwareKeyboard()};
std::array<char16_t, SWKBD_OUTPUT_INTERACTIVE_BUFFER_SIZE / 2 - 2> string;
std::memcpy(string.data(), data.data() + 4, string.size() * 2);
frontend.SendTextCheckDialog(
Common::UTF16StringFromFixedZeroTerminatedBuffer(string.data(), string.size()));
}
}
IStorage SoftwareKeyboard::Execute() {
const auto frontend{GetSoftwareKeyboard()};
ASSERT(frontend != nullptr);
if (complete)
return IStorage{final_data};
const auto& frontend{Core::System::GetInstance().GetSoftwareKeyboard()};
const auto parameters = ConvertToFrontendParameters(config, initial_text);
std::u16string text;
const auto success = frontend->GetText(parameters, text);
const auto success = frontend.GetText(parameters, text);
std::vector<u8> output(SWKBD_OUTPUT_BUFFER_SIZE);
if (success) {
output[0] = 1;
if (config.text_check) {
const auto size = static_cast<u32>(text.size() * 2 + 4);
std::memcpy(output.data(), &size, sizeof(u32));
} else {
output[0] = 1;
}
std::memcpy(output.data() + 4, text.data(),
std::min<std::size_t>(text.size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 4));
std::min(text.size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 4));
} else {
complete = true;
final_data = std::move(output);
return IStorage{final_data};
}
complete = !config.text_check;
if (complete) {
final_data = std::move(output);
return IStorage{final_data};
}
return IStorage{output};