#region [DATA DEFRAGGER] Boolean FragmentedChunck = false; // Temporary Data Buffer. Byte[] TempBuffer = new Byte[16384]; // Compressed Buffer. Byte[] CompressedBuffer = new Byte[16384]; // Default buffer. Byte[] DefaultBuffer = new Byte[16384]; UInt16 DefaultBufferPacketLength = 0; UInt32 DefaultBufferSize = 0; UInt16 GetSize(Byte[] buffer) { return ((UInt16)(buffer[3] << 8 | buffer[2])); } public void Defrag(Byte[] buffer, int len) { try { // CALCULANDO (POSSÍVEL TAMANHO DE PACOTE). UInt16 PacketLength = GetSize(buffer); Packet receivedpkt = new Packet(); if (!FragmentedChunck) { if (PacketLength == len) { // PACOTE VALIDO, DESCOMPRIMINDO DADOS. // GlobalVars.d.WriteChat("PACOTE VALIDO, REPASSADO PARA DESCOMPRESSAO."); if (receivedpkt.Parse(buffer, (Int32)PacketLength)) HandleMessage(receivedpkt); return; } else if (PacketLength < len) { Boolean CLUMPED = true; UInt32 P = 0; // PACOTE AMONTADO. // GlobalVars.d.WriteChat("PACOTE AMONTADO, EXTRAINDO PACOTES..."); // SEPARANDO PACOTES. while (CLUMPED) { // GlobalVars.d.WriteChat("EXTRAINDO PACOTE [" + P.ToString() + "]..."); PacketLength = GetSize(buffer); if (PacketLength >= len) { Array.Clear(CompressedBuffer, 0, 2048); Array.Copy(buffer, 0, CompressedBuffer, 0, PacketLength); if (receivedpkt.Parse(CompressedBuffer, (Int32)PacketLength)) HandleMessage(receivedpkt); Array.Clear(TempBuffer, 0, 2048); Array.Copy(buffer, 0, TempBuffer, 0, len); Array.Clear(buffer, 0, 2048); Array.Copy(TempBuffer, PacketLength - 1, buffer, 0, len - PacketLength); len = len - PacketLength; P++; } else { FragmentedChunck = true; // GlobalVars.d.WriteChat("FRAGMENTO DE PACOTE ENCONTRADO..."); DefaultBufferPacketLength = PacketLength; Array.Copy(buffer, 0, DefaultBuffer, 0, len); DefaultBufferSize = (UInt32)len; CLUMPED = false; return; } } // GlobalVars.d.WriteChat("PACOTES EXTRAIDOS COM SUCESSO !"); return; } } else { if (DefaultBufferPacketLength <= len) { FragmentedChunck = false; Array.Copy(buffer, 0, DefaultBuffer, DefaultBufferSize - 1, len); DefaultBufferSize = ((UInt32)(DefaultBufferSize + len)); if (receivedpkt.Parse(DefaultBuffer, (Int32)DefaultBufferSize)) HandleMessage(receivedpkt); if (DefaultBufferSize > 0) Array.Clear(DefaultBuffer, 0, (Int32)DefaultBufferSize); // GlobalVars.d.WriteChat("PACOTE FRAGMENTADO CONSTRUIDO COM SUCESSO !"); } else { // GlobalVars.d.WriteChat("CONSTRUINDO PACOTE FRAGMENTADO..."); Array.Copy(buffer, 0, DefaultBuffer, DefaultBufferSize - 1, len); DefaultBufferSize = ((UInt32)(DefaultBufferSize + len)); } return; } } catch (Exception ex) { GlobalVars.d.WriteLog2(Environment.NewLine + "[DEFRAGGER]-> " + ex + "." + Environment.NewLine + Environment.NewLine); } } #endregion