From 5c564a39dc9dd76be676c62c193ba253c52798af Mon Sep 17 00:00:00 2001 From: Saumya Jain Date: Thu, 22 Aug 2024 15:32:45 +0200 Subject: [PATCH] Add base64 encoding for GCode prefix handling. Implemented a `convertTobase64` function to encode strings to base64, ensuring they can be safely transmitted in JavaScript. Updated `EmscriptenCommunication::sendGCodePrefix` to use this new encoding method and modified relevant tests accordingly to check this functionality. NP-327 --- include/utils/string.h | 28 +++++++++++++++++++ src/communication/EmscriptenCommunication.cpp | 4 +-- tests/arcus/ArcusCommunicationTest.cpp | 8 ++++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/include/utils/string.h b/include/utils/string.h index 7468077279..1b48dec225 100644 --- a/include/utils/string.h +++ b/include/utils/string.h @@ -8,6 +8,9 @@ #include // sprintf #include #include // ostringstream +#include +#include +#include #include @@ -27,6 +30,31 @@ static inline int stringcasecompare(const char* a, const char* b) return *a - *b; } +// Convert string to base64 string. +// This function is useful to forward string through javascript even if they contain any special strings +// +[[maybe_unused]] static std::string convertTobase64(const std::string& input ) +{ + using namespace boost::archive::iterators; + // prepare the stream to hold the encoded data + std::stringstream output; + + // encode data + typedef base64_from_binary> base64_enc; + std::copy(base64_enc(input.begin()), base64_enc(input.end()), + ostream_iterator(output)); + + // Retrieve the encoded string + std::string output_encoded = output.str(); + + // ensure padding if needed + size_t num = (3 - input.length() % 3) % 3; + for(size_t i = 0; i < num; i++) + { + output_encoded.push_back('='); + } + return output_encoded; +} /*! * Efficient conversion of micron integer type to millimeter string. * diff --git a/src/communication/EmscriptenCommunication.cpp b/src/communication/EmscriptenCommunication.cpp index 16701a4dea..006bb6c523 100644 --- a/src/communication/EmscriptenCommunication.cpp +++ b/src/communication/EmscriptenCommunication.cpp @@ -13,7 +13,7 @@ #include #include #include - +#include "utils/string.h" #include "Application.h" #include "FffProcessor.h" #include "Slice.h" @@ -41,7 +41,7 @@ EmscriptenCommunication::EmscriptenCommunication(const std::vector& void EmscriptenCommunication::sendGCodePrefix(const std::string& prefix) const { - emscripten_run_script(fmt::format("globalThis[\"{}\"](\"{}\")", gcode_header_handler_, prefix).c_str()); + emscripten_run_script(fmt::format("globalThis[\"{}\"](\"{}\")", gcode_prefix_handler_, convertTobase64(prefix)).c_str()); } void EmscriptenCommunication::sendProgress(double progress) const diff --git a/tests/arcus/ArcusCommunicationTest.cpp b/tests/arcus/ArcusCommunicationTest.cpp index a05b88d98d..3c0eb20d37 100644 --- a/tests/arcus/ArcusCommunicationTest.cpp +++ b/tests/arcus/ArcusCommunicationTest.cpp @@ -14,6 +14,7 @@ #include "geometry/Shape.h" #include "settings/types/LayerIndex.h" #include "utils/Coord_t.h" +#include "utils/string.h" // NOLINTBEGIN(*-magic-numbers) namespace cura @@ -123,15 +124,16 @@ TEST_F(ArcusCommunicationTest, HasSlice) TEST_F(ArcusCommunicationTest, SendGCodePrefix) { - const std::string& prefix = "bladibla"; + const std::string prefix = ";bladiblhjvouyvu\n;iuboua"; + const std::string& encoded_prefix = convertTobase64(prefix); - ac->sendGCodePrefix(prefix); + ac->sendGCodePrefix(encoded_prefix); ac->flushGCode(); EXPECT_GT(socket->sent_messages.size(), 0); bool found_prefix = false; for (const auto& message : socket->sent_messages) { - if (message->DebugString().find(prefix) != std::string::npos) + if (message->DebugString().find(encoded_prefix) != std::string::npos) { found_prefix = true; break;