software_keyboard: Push buffer size to offset 0x4 in output data

This commit is contained in:
Zach Hilman
2018-11-16 22:20:09 -05:00
parent 8b433beff3
commit 6209fe0c27
4 changed files with 39 additions and 18 deletions

View File

@@ -22,6 +22,7 @@ class IStorage;
namespace Applets {
using AppletStorageProxyFunction = std::function<void(IStorage)>;
using AppletStateProxyFunction = std::function<void()>;
class Applet {
public:
@@ -34,7 +35,8 @@ public:
virtual ResultCode GetStatus() const = 0;
virtual void ReceiveInteractiveData(std::shared_ptr<IStorage> storage) = 0;
virtual void Execute(AppletStorageProxyFunction out_data,
AppletStorageProxyFunction out_interactive_data) = 0;
AppletStorageProxyFunction out_interactive_data,
AppletStateProxyFunction state) = 0;
bool IsInitialized() const {
return initialized;

View File

@@ -69,7 +69,7 @@ bool SoftwareKeyboard::TransactionComplete() const {
}
ResultCode SoftwareKeyboard::GetStatus() const {
return RESULT_SUCCESS;
return status;
}
void SoftwareKeyboard::ReceiveInteractiveData(std::shared_ptr<IStorage> storage) {
@@ -92,7 +92,8 @@ void SoftwareKeyboard::ReceiveInteractiveData(std::shared_ptr<IStorage> storage)
}
void SoftwareKeyboard::Execute(AppletStorageProxyFunction out_data,
AppletStorageProxyFunction out_interactive_data) {
AppletStorageProxyFunction out_interactive_data,
AppletStateProxyFunction state) {
if (complete)
return;
@@ -102,6 +103,7 @@ void SoftwareKeyboard::Execute(AppletStorageProxyFunction out_data,
this->out_data = out_data;
this->out_interactive_data = out_interactive_data;
this->state = state;
frontend.RequestText([this](std::optional<std::u16string> text) { WriteText(text); },
parameters);
}
@@ -110,6 +112,7 @@ void SoftwareKeyboard::WriteText(std::optional<std::u16string> text) {
std::vector<u8> output(SWKBD_OUTPUT_BUFFER_SIZE);
if (text.has_value()) {
status = RESULT_SUCCESS;
if (config.text_check) {
const auto size = static_cast<u32>(text->size() * 2 + 4);
std::memcpy(output.data(), &size, sizeof(u32));
@@ -117,9 +120,12 @@ void SoftwareKeyboard::WriteText(std::optional<std::u16string> text) {
output[0] = 1;
}
std::memcpy(output.data() + 4, text->data(),
std::min(text->size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 4));
const auto size = static_cast<u32>(text->size());
std::memcpy(output.data() + 4, &size, sizeof(u32));
std::memcpy(output.data() + 8, text->data(),
std::min(text->size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 8));
} else {
status = ResultCode(-1);
complete = true;
out_data(IStorage{output});
return;
@@ -127,6 +133,8 @@ void SoftwareKeyboard::WriteText(std::optional<std::u16string> text) {
complete = !config.text_check;
(complete ? out_data : out_interactive_data)(IStorage{output});
out_data(IStorage{output});
out_interactive_data(IStorage{output});
state();
}
} // namespace Service::AM::Applets

View File

@@ -55,7 +55,8 @@ public:
ResultCode GetStatus() const override;
void ReceiveInteractiveData(std::shared_ptr<IStorage> storage) override;
void Execute(AppletStorageProxyFunction out_data,
AppletStorageProxyFunction out_interactive_data) override;
AppletStorageProxyFunction out_interactive_data,
AppletStateProxyFunction state) override;
void WriteText(std::optional<std::u16string> text);
@@ -64,9 +65,11 @@ private:
std::u16string initial_text;
bool complete = false;
std::vector<u8> final_data;
ResultCode status = ResultCode(-1);
AppletStorageProxyFunction out_data;
AppletStorageProxyFunction out_interactive_data;
AppletStateProxyFunction state;
};
} // namespace Service::AM::Applets