From e1d5e5e165b3881eacf955d18cf3b2babd5a6113 Mon Sep 17 00:00:00 2001 From: tycho Date: Tue, 29 Sep 2015 16:08:40 +0100 Subject: [PATCH] Improved types of utf 16 strings --- Tools/ProtoProxy/Connection.cpp | 8 ++++---- src/Protocol/ProtocolRecognizer.cpp | 6 +++--- src/StringUtils.cpp | 18 +++++++++--------- src/StringUtils.h | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Tools/ProtoProxy/Connection.cpp b/Tools/ProtoProxy/Connection.cpp index f24747a24..62d64c49e 100644 --- a/Tools/ProtoProxy/Connection.cpp +++ b/Tools/ProtoProxy/Connection.cpp @@ -1835,12 +1835,12 @@ bool cConnection::HandleServerKick(void) Reason.append(Split[4]); Reason.push_back(0); Reason.append(Split[5]); - AString ReasonBE16 = UTF8ToRawBEUTF16(Reason.data(), Reason.size()); + auto ReasonBE16 = UTF8ToRawBEUTF16(Reason); AString PacketStart("\xff"); - PacketStart.push_back(static_cast((ReasonBE16.size() / 2) / 256)); - PacketStart.push_back(static_cast((ReasonBE16.size() / 2) % 256)); + PacketStart.push_back(static_cast(ReasonBE16.size() / 256)); + PacketStart.push_back(static_cast(ReasonBE16.size() % 256)); CLIENTSEND(PacketStart.data(), PacketStart.size()); - CLIENTSEND(ReasonBE16.data(), ReasonBE16.size()); + CLIENTSEND(reinterpret_cast(ReasonBE16.data()), ReasonBE16.size() * sizeof(char16_t)); return true; } else diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index 0d16262f9..845e7b56d 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -200,10 +200,10 @@ void cProtocolRecognizer::SendDisconnect(const AString & a_Reason) static const int Packet = 0xff; // PACKET_DISCONNECT SendData(reinterpret_cast(&Packet), 1); // WriteByte() - AString UTF16 = UTF8ToRawBEUTF16(a_Reason.c_str(), a_Reason.length()); - static const u_short Size = htons(static_cast(UTF16.size() / 2)); + auto UTF16 = UTF8ToRawBEUTF16(a_Reason); + static const u_short Size = htons(static_cast(UTF16.size())); SendData(reinterpret_cast(&Size), 2); // WriteShort() - SendData(UTF16.data(), UTF16.size()); // WriteString() + SendData(reinterpret_cast(UTF16.data()), UTF16.size() * sizeof(char16_t)); // WriteString() } } diff --git a/src/StringUtils.cpp b/src/StringUtils.cpp index 337613674..cc71e048b 100644 --- a/src/StringUtils.cpp +++ b/src/StringUtils.cpp @@ -500,13 +500,13 @@ static bool isLegalUTF8(const unsigned char * source, int length) -AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length) +std::u16string UTF8ToRawBEUTF16(const AString & a_UTF8) { - AString UTF16; - UTF16.reserve(a_UTF8Length * 3); + std::u16string UTF16; + UTF16.reserve(a_UTF8.size() * 2); - const unsigned char * source = reinterpret_cast(a_UTF8); - const unsigned char * sourceEnd = source + a_UTF8Length; + const unsigned char * source = reinterpret_cast(a_UTF8.data()); + const unsigned char * sourceEnd = source + a_UTF8.size(); const int halfShift = 10; // used for shifting by 10 bits const unsigned int halfBase = 0x0010000UL; const unsigned int halfMask = 0x3ffUL; @@ -546,13 +546,13 @@ AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length) ch = ' '; } unsigned short v = htons(static_cast(ch)); - UTF16.append(reinterpret_cast(&v), 2); + UTF16.push_back(static_cast(v)); } else if (ch > UNI_MAX_UTF16) { // Invalid value, replace with a space unsigned short v = htons(' '); - UTF16.append(reinterpret_cast(&v), 2); + UTF16.push_back(static_cast(v)); } else { @@ -560,8 +560,8 @@ AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length) ch -= halfBase; unsigned short v1 = htons((ch >> halfShift) + UNI_SUR_HIGH_START); unsigned short v2 = htons((ch & halfMask) + UNI_SUR_LOW_START); - UTF16.append(reinterpret_cast(&v1), 2); - UTF16.append(reinterpret_cast(&v2), 2); + UTF16.push_back(static_cast(v1)); + UTF16.push_back(static_cast(v2)); } } return UTF16; diff --git a/src/StringUtils.h b/src/StringUtils.h index f2a9e372b..00504d358 100644 --- a/src/StringUtils.h +++ b/src/StringUtils.h @@ -82,7 +82,7 @@ extern void ReplaceString(AString & iHayStack, const AString & iNeedle, const AS extern AString & RawBEToUTF8(const char * a_RawData, size_t a_NumShorts, AString & a_UTF8); /** Converts a UTF-8 string into a UTF-16 BE string. */ -extern AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length); +extern std::u16string UTF8ToRawBEUTF16(const AString & a_String); /** Creates a nicely formatted HEX dump of the given memory block. Max a_BytesPerLine is 120. */