|
|
@@ -14,6 +14,7 @@ Implements the 1.7.x protocol classes: |
|
|
#include "Protocol17x.h"
|
|
|
#include "ChunkDataSerializer.h"
|
|
|
#include "PolarSSL++/Sha1Checksum.h"
|
|
|
#include "zlib/zlib.h"
|
|
|
|
|
|
#include "../ClientHandle.h"
|
|
|
#include "../Root.h"
|
|
|
@@ -97,7 +98,7 @@ cProtocol172::cProtocol172(cClientHandle * a_Client, const AString & a_ServerAdd |
|
|
m_ServerPort(a_ServerPort),
|
|
|
m_State(a_State),
|
|
|
m_ReceivedData(32 KiB),
|
|
|
m_OutPacketBuffer(64 KiB),
|
|
|
m_OutPacketBuffer(256 KiB),
|
|
|
m_OutPacketLenBuffer(20), // 20 bytes is more than enough for one VarInt
|
|
|
m_IsEncrypted(false),
|
|
|
m_LastSentDimension(dimNotSet)
|
|
|
@@ -351,7 +352,7 @@ void cProtocol172::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerialize |
|
|
cPacketizer Pkt(*this, 0x21); // Chunk Data packet
|
|
|
Pkt.WriteInt(a_ChunkX);
|
|
|
Pkt.WriteInt(a_ChunkZ);
|
|
|
Pkt.WriteBuf(ChunkData.data(), ChunkData.size());
|
|
|
Pkt.WriteBuf(ChunkData.data(), sizeof(ChunkData.data()));
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -2507,28 +2508,68 @@ void cProtocol172::AddChatPartStyle(Json::Value & a_Value, const AString & a_Par |
|
|
|
|
|
cProtocol172::cPacketizer::~cPacketizer()
|
|
|
{
|
|
|
AString DataToSend;
|
|
|
|
|
|
// Send the packet length
|
|
|
UInt32 PacketLen = (UInt32)m_Out.GetUsedSpace();
|
|
|
|
|
|
AString LengthToWrite;
|
|
|
m_Protocol.m_OutPacketLenBuffer.WriteVarInt(PacketLen);
|
|
|
m_Protocol.m_OutPacketLenBuffer.ReadAll(DataToSend);
|
|
|
m_Protocol.SendData(DataToSend.data(), DataToSend.size());
|
|
|
m_Protocol.m_OutPacketLenBuffer.ReadAll(LengthToWrite);
|
|
|
m_Protocol.m_OutPacketLenBuffer.CommitRead();
|
|
|
|
|
|
// Send the packet data:
|
|
|
m_Out.ReadAll(DataToSend);
|
|
|
m_Protocol.SendData(DataToSend.data(), DataToSend.size());
|
|
|
|
|
|
// Write packet data into a string
|
|
|
AString PacketDataWithoutLength;
|
|
|
m_Out.ReadAll(PacketDataWithoutLength);
|
|
|
m_Out.CommitRead();
|
|
|
|
|
|
// Create PacketData:
|
|
|
AString PacketData;
|
|
|
PacketData.resize(LengthToWrite.size() + PacketDataWithoutLength.size());
|
|
|
PacketData.append(LengthToWrite.data(), sizeof(LengthToWrite.data()));
|
|
|
PacketData.append(PacketDataWithoutLength.data(), sizeof(PacketDataWithoutLength.data()));
|
|
|
PacketLen = (UInt32)sizeof(PacketData.data());
|
|
|
|
|
|
// Send all:
|
|
|
cByteBuffer PacketBuffer(64 KiB);
|
|
|
if ((m_Protocol.m_State == 3) && (PacketLen >= 256))
|
|
|
{
|
|
|
LOG("Crypt packet!");
|
|
|
PacketBuffer.WriteVarInt(PacketLen); // Write uncompressed packet length
|
|
|
|
|
|
// Compress the data:
|
|
|
// In order not to use allocation, use a fixed-size buffer, with the size
|
|
|
// that uses the same calculation as compressBound():
|
|
|
const uLongf CompressedMaxSize = 64 KiB - sizeof(UInt32);
|
|
|
char CompressedData[CompressedMaxSize];
|
|
|
|
|
|
uLongf CompressedSize = compressBound(PacketLen);
|
|
|
|
|
|
// Run-time check that our compile-time guess about CompressedMaxSize was enough:
|
|
|
ASSERT(CompressedSize <= CompressedMaxSize);
|
|
|
|
|
|
compress2((Bytef*)CompressedData, &CompressedSize, (const Bytef*)PacketData.data(), PacketData.size(), Z_DEFAULT_COMPRESSION);
|
|
|
PacketBuffer.WriteBuf(CompressedData, CompressedSize);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (m_Protocol.m_State == 3)
|
|
|
{
|
|
|
PacketBuffer.WriteByte(0); // 0 stands for "no compression"
|
|
|
}
|
|
|
PacketBuffer.WriteBuf(PacketData.data(), sizeof(PacketData.data()));
|
|
|
}
|
|
|
|
|
|
AString DataToSend;
|
|
|
PacketBuffer.ReadAll(DataToSend);
|
|
|
m_Protocol.SendData(DataToSend.data(), sizeof(PacketData.data()));
|
|
|
PacketBuffer.CommitRead();
|
|
|
|
|
|
// Log the comm into logfile:
|
|
|
if (g_ShouldLogCommOut)
|
|
|
{
|
|
|
AString Hex;
|
|
|
ASSERT(DataToSend.size() > 0);
|
|
|
CreateHexDump(Hex, DataToSend.data() + 1, DataToSend.size() - 1, 16);
|
|
|
ASSERT(PacketData.size() > 0);
|
|
|
CreateHexDump(Hex, PacketData.data() + 1, PacketData.size() - 1, 16);
|
|
|
m_Protocol.m_CommLogFile.Printf("Outgoing packet: type %d (0x%x), length %u (0x%x), state %d. Payload:\n%s\n",
|
|
|
DataToSend[0], DataToSend[0], PacketLen, PacketLen, m_Protocol.m_State, Hex.c_str()
|
|
|
PacketDataWithoutLength[0], PacketDataWithoutLength[0], PacketLen, PacketLen, m_Protocol.m_State, Hex.c_str()
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
0 comments on commit
f83cdd9