summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@hotmail.co.uk>2014-09-27 23:13:37 +0200
committerTiger Wang <ziwei.tiger@hotmail.co.uk>2014-09-27 23:13:37 +0200
commit1f8ee70d55d0d076583e14329ca09377c41b12e0 (patch)
treeb9d021314c75e76c24895f3c2cc2b27744a9c900
parentMerge remote-tracking branch 'origin/master' into endofsupport (diff)
downloadcuberite-1f8ee70d55d0d076583e14329ca09377c41b12e0.tar
cuberite-1f8ee70d55d0d076583e14329ca09377c41b12e0.tar.gz
cuberite-1f8ee70d55d0d076583e14329ca09377c41b12e0.tar.bz2
cuberite-1f8ee70d55d0d076583e14329ca09377c41b12e0.tar.lz
cuberite-1f8ee70d55d0d076583e14329ca09377c41b12e0.tar.xz
cuberite-1f8ee70d55d0d076583e14329ca09377c41b12e0.tar.zst
cuberite-1f8ee70d55d0d076583e14329ca09377c41b12e0.zip
-rw-r--r--src/ByteBuffer.cpp17
-rw-r--r--src/ByteBuffer.h1
-rw-r--r--src/Protocol/ProtocolRecognizer.cpp17
-rw-r--r--src/StringUtils.cpp20
-rw-r--r--src/StringUtils.h4
5 files changed, 27 insertions, 32 deletions
diff --git a/src/ByteBuffer.cpp b/src/ByteBuffer.cpp
index 70fdc008c..dc6b32a44 100644
--- a/src/ByteBuffer.cpp
+++ b/src/ByteBuffer.cpp
@@ -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;
diff --git a/src/ByteBuffer.h b/src/ByteBuffer.h
index 74dc378d4..70de419f0 100644
--- a/src/ByteBuffer.h
+++ b/src/ByteBuffer.h
@@ -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);
diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp
index bfa5334d5..93d7cf0aa 100644
--- a/src/Protocol/ProtocolRecognizer.cpp
+++ b/src/Protocol/ProtocolRecognizer.cpp
@@ -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()
+ }
}
diff --git a/src/StringUtils.cpp b/src/StringUtils.cpp
index 73147eebc..21962f832 100644
--- a/src/StringUtils.cpp
+++ b/src/StringUtils.cpp
@@ -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;
}
/*
diff --git a/src/StringUtils.h b/src/StringUtils.h
index a76894d05..159e8ecac 100644
--- a/src/StringUtils.h
+++ b/src/StringUtils.h
@@ -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);