private void InternalCompile(bool compress)
{
if (m_Length == 0)
{
long streamLen = m_Stream.Length;
m_Stream.Seek(1, SeekOrigin.Begin);
m_Stream.Write((ushort)streamLen);
}
else if (m_Stream.Length != m_Length)
{
int diff = (int)m_Stream.Length - m_Length;
log.ErrorFormat("Packet: 0x{0:X2}: Bad packet length! ({1}{2} bytes)",
m_PacketID, diff >= 0 ? "+" : "", diff);
}
MemoryStream ms = m_Stream.UnderlyingStream;
int length;
m_CompiledBuffer = ms.GetBuffer();
length = (int)ms.Length;
if (compress)
{
try
{
Compression.Compress(m_CompiledBuffer, length, out m_CompiledBuffer, out length);
}
catch (IndexOutOfRangeException)
{
log.WarnFormat("Compression buffer overflowed on packet 0x{0:X2} ('{1}') (length={2})",
m_PacketID, GetType().Name, length);
m_CompiledBuffer = null;
}
}
if (m_CompiledBuffer != null)
{
byte[] old = m_CompiledBuffer;
m_CompiledBuffer = new byte[length];
Buffer.BlockCopy(old, 0, m_CompiledBuffer, 0, length);
}
PacketWriter.ReleaseInstance(m_Stream);
m_Stream = null;
}