rendered paste bodyprotected override void OnReceive(int num_bytes)
{
if (num_bytes < 6)
{
m_inOffset = 0;
return;
}
bool isDecrypted = false;
short packetLength = 0;
PacketId packetId = default(PacketId);
int startOffset = m_inOffset - num_bytes;
if (!isDecrypted)
{
if (IsEncrypted)
{
DecryptHeader(ref m_inBuf, startOffset);
}
packetLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_inBuf, startOffset));
packetId = (RealmServerOpCode)BitConverter.ToUInt32(m_inBuf, startOffset + 2);
m_log.DebugFormat("Received {0}/{1}", packetId, packetLength);
isDecrypted = true;
}
if (packetLength > 4000 || packetLength < 4)
{
m_log.Info("bad packet length: " + packetLength);
m_inOffset = 0;
return;
}
if (num_bytes > packetLength + 2)
{
m_log.Debug("more than needed received");
int remaining = num_bytes;
while (remaining > 0)
{
m_log.DebugFormat("Remaining in overflow packet {0}", remaining);
if (isDecrypted)
{
RealmPacketIn packet = new RealmPacketIn(m_inBuf, m_inOffset - remaining, packetLength + 2);
TryHandlePacket(packet);
remaining -= (packet.PacketSize + 2);//m_packetLength + 2;
startOffset += (packet.PacketSize + 2);
isDecrypted = false;
}
else
{
DecryptHeader(ref m_inBuf, startOffset);
packetLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(m_inBuf, startOffset));
RealmPacketIn packet = new RealmPacketIn(m_inBuf, startOffset, packetLength + 2);
TryHandlePacket(packet);
remaining -= (packet.PacketSize + 2);
startOffset += (packet.PacketSize + 2);
//isDecrypted = false;
}
}
m_inOffset = 0; // done
return;
}
// received single message in packet
if (packetLength + 2 == num_bytes)
{
// full message
RealmPacketIn packet = new RealmPacketIn(m_inBuf, startOffset, packetLength + 2);
TryHandlePacket(packet);
m_inOffset = 0;
return;
}
}