Bug fix
This commit is contained in:
parent
7b7225e50b
commit
1f8ee70d55
@ -627,23 +627,6 @@ bool cByteBuffer::WriteBool(bool a_Value)
|
||||
|
||||
|
||||
|
||||
bool cByteBuffer::WriteBEUTF16String16(const AString & a_Value)
|
||||
{
|
||||
CHECK_THREAD;
|
||||
CheckValid();
|
||||
PUTBYTES(2);
|
||||
AString UTF16BE;
|
||||
UTF8ToRawBEUTF16(a_Value.data(), a_Value.size(), UTF16BE);
|
||||
WriteBEShort((short)(UTF16BE.size() / 2));
|
||||
PUTBYTES(UTF16BE.size());
|
||||
WriteBuf(UTF16BE.data(), UTF16BE.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool cByteBuffer::WriteVarInt(UInt32 a_Value)
|
||||
{
|
||||
CHECK_THREAD;
|
||||
|
@ -88,7 +88,6 @@ public:
|
||||
bool WriteBEFloat (float a_Value);
|
||||
bool WriteBEDouble (double a_Value);
|
||||
bool WriteBool (bool a_Value);
|
||||
bool WriteBEUTF16String16(const AString & a_Value); // string length as BE short, then string as UTF-16BE
|
||||
bool WriteVarInt (UInt32 a_Value);
|
||||
bool WriteVarUTF8String (const AString & a_Value); // string length as VarInt, then string as UTF-8
|
||||
bool WriteLEInt (int a_Value);
|
||||
|
@ -190,8 +190,21 @@ void cProtocolRecognizer::SendDestroyEntity(const cEntity & a_Entity)
|
||||
|
||||
void cProtocolRecognizer::SendDisconnect(const AString & a_Reason)
|
||||
{
|
||||
ASSERT(m_Protocol != NULL);
|
||||
m_Protocol->SendDisconnect(a_Reason);
|
||||
if (m_Protocol != NULL)
|
||||
{
|
||||
m_Protocol->SendDisconnect(a_Reason);
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is used when the client sends a server-ping, respond with the default packet:
|
||||
static const int Packet = 0xff; // PACKET_DISCONNECT
|
||||
SendData((const char *)&Packet, 1); // WriteByte()
|
||||
|
||||
AString & UTF16 = UTF8ToRawBEUTF16(a_Reason.c_str(), a_Reason.length());
|
||||
static const short Size = htons((short)(UTF16.size() / 2));
|
||||
SendData((const char *)&Size, 2); // WriteShort()
|
||||
SendData(UTF16.data(), UTF16.size()); // WriteString()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -441,10 +441,10 @@ static bool isLegalUTF8(const unsigned char * source, int length)
|
||||
|
||||
|
||||
|
||||
AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a_UTF16)
|
||||
AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length)
|
||||
{
|
||||
a_UTF16.clear();
|
||||
a_UTF16.reserve(a_UTF8Length * 3);
|
||||
AString UTF16;
|
||||
UTF16.reserve(a_UTF8Length * 3);
|
||||
|
||||
const unsigned char * source = (const unsigned char*)a_UTF8;
|
||||
const unsigned char * sourceEnd = source + a_UTF8Length;
|
||||
@ -458,12 +458,12 @@ AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a
|
||||
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
||||
if (source + extraBytesToRead >= sourceEnd)
|
||||
{
|
||||
return a_UTF16;
|
||||
return UTF16;
|
||||
}
|
||||
// Do this check whether lenient or strict
|
||||
if (!isLegalUTF8(source, extraBytesToRead + 1))
|
||||
{
|
||||
return a_UTF16;
|
||||
return UTF16;
|
||||
}
|
||||
|
||||
// The cases all fall through. See "Note A" below.
|
||||
@ -487,13 +487,13 @@ AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a
|
||||
ch = ' ';
|
||||
}
|
||||
unsigned short v = htons((unsigned short)ch);
|
||||
a_UTF16.append((const char *)&v, 2);
|
||||
UTF16.append((const char *)&v, 2);
|
||||
}
|
||||
else if (ch > UNI_MAX_UTF16)
|
||||
{
|
||||
// Invalid value, replace with a space
|
||||
unsigned short v = htons(' ');
|
||||
a_UTF16.append((const char *)&v, 2);
|
||||
UTF16.append((const char *)&v, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -501,11 +501,11 @@ AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a
|
||||
ch -= halfBase;
|
||||
unsigned short v1 = htons((ch >> halfShift) + UNI_SUR_HIGH_START);
|
||||
unsigned short v2 = htons((ch & halfMask) + UNI_SUR_LOW_START);
|
||||
a_UTF16.append((const char *)&v1, 2);
|
||||
a_UTF16.append((const char *)&v2, 2);
|
||||
UTF16.append((const char *)&v1, 2);
|
||||
UTF16.append((const char *)&v2, 2);
|
||||
}
|
||||
}
|
||||
return a_UTF16;
|
||||
return UTF16;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -66,8 +66,8 @@ extern void ReplaceString(AString & iHayStack, const AString & iNeedle, const AS
|
||||
/// Converts a stream of BE shorts into UTF-8 string; returns a ref to a_UTF8
|
||||
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, packing that back into AString; return a ref to a_UTF16
|
||||
extern AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a_UTF16);
|
||||
/// Converts a UTF-8 string into a UTF-16 BE string; returns a ref to a_UTF16
|
||||
extern AString UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length);
|
||||
|
||||
/// Creates a nicely formatted HEX dump of the given memory block. Max a_BytesPerLine is 120
|
||||
extern AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, size_t a_BytesPerLine);
|
||||
|
Loading…
Reference in New Issue
Block a user