diff --git a/src/lib/javacompat.cpp b/src/lib/javacompat.cpp index 6cb6c29..5a04b22 100644 --- a/src/lib/javacompat.cpp +++ b/src/lib/javacompat.cpp @@ -30,8 +30,6 @@ #endif namespace JavaCompat { - //FIXME: contrary to what I said, we need to explicitly pass the data - // size because files could have been tampered with or corrupted ErrorOr importJavaString(uint8_t data[], uint16_t size) { std::string stdString; uint16_t encodedSize = static_cast(data[0])<<8 | static_cast(data[1]); diff --git a/src/lib/nbt.cpp b/src/lib/nbt.cpp index 1c76e2d..adc2473 100644 --- a/src/lib/nbt.cpp +++ b/src/lib/nbt.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "nbt.h++" #include "error.h++" @@ -342,8 +343,14 @@ namespace NBT { } } - //void writeString(std::vector* destination, data) { - //} + void writeString(std::vector* destination, tiny_utf8::string data) { + ErrorOr> exportedString = JavaCompat::exportJavaString(data); + if(exportedString.isError){ + std::cerr << "NBT::helpers::writeString encountered an error: " << (int) exportedString.errorCode << std::endl; + std::abort(); + } + *destination = exportedString.value; + } void writeInt32Array(std::vector* destination, std::vector data) { writeInt32(destination, data.size()); diff --git a/src/lib/nbt.h++ b/src/lib/nbt.h++ index 58b9171..2b29151 100644 --- a/src/lib/nbt.h++ +++ b/src/lib/nbt.h++ @@ -69,7 +69,7 @@ namespace NBT { void writeFloat64(std::vector* destination, double data); void writeInt8Array(std::vector* destination, std::vector data); void writeInt8Array(std::vector* destination, int8_t data[], uint32_t dataSize); - //void writeString(std::vector* destination, data); + void writeString(std::vector* destination, tiny_utf8::string data); void writeInt32Array(std::vector* destination, std::vector data); void writeInt32Array(std::vector* destination, int32_t data[], uint32_t dataSize); void writeInt64Array(std::vector* destination, std::vector data); diff --git a/src/test/nbt_helpers.cpp b/src/test/nbt_helpers.cpp index 6189b83..a7f4019 100644 --- a/src/test/nbt_helpers.cpp +++ b/src/test/nbt_helpers.cpp @@ -495,5 +495,35 @@ int main(){ ASSERT(NBT::helper::readString(reinterpret_cast(javaStdString.data()), 0xF, 0).errorCode == ErrorCodes::MISMATCHEDSIZE); std::cout << "Passed readString NBT helper test." << std::endl; delete nextChar; + + char* nextChar1 = new char; + + //reading data from the java modified utf8 file + std::streampos javaSize1; + std::vector javaStdString1; + const char* javaFilePath1 = "./resources/unicode_data/java-style_unicode"; + std::ifstream javaFile1(javaFilePath1, std::ios::in | std::ios::binary | std::ios::ate); + if(javaFile1.is_open()){ + javaSize1 = javaFile1.tellg(); + javaFile1.seekg(0, std::ios::beg); + + for (int i=0; i* exportedString = new std::vector(); + NBT::helper::writeString(exportedString, normalString); + ASSERT(javaStdString1 == *exportedString); + + std::string overrunString = std::string(0xFFFFF, '.'); + NBT::helper::writeString(exportedString, tiny_utf8::string(overrunString)); + std::cout << "Passed writeString NBT helper test." << std::endl; return 0; }