/// <summary> /// Processes the specified buffer. /// </summary> internal void OnReceive(byte[] buffer) { if (buffer != null && this.IsConnected) { if (buffer.Length >= 7 && buffer.Length <= Constants.BufferSize) { Messaging.ReadHeader(buffer, out int id, out int length, out int version); if ((id - 10000 < 10000) && (buffer.Length - 7 >= length)) { using (ByteStream stream = new ByteStream(buffer.Skip(7).ToArray())) { PiranhaMessage message = LogicLifeMessageFactory.CreateMessageByType(id, this.Connection, stream); if (message != null) { message.Type = (Message)id; message.Length = length; message.Version = (short)version; message.Decrypt(); MessageManager.Enqueue(message); } if (!this.Connection.Token.Aborting) { this.Connection.Token.Packet.RemoveRange(0, length + 7); if (buffer.Length - 7 - length >= 7) { this.OnReceive(stream.ReadBytes(buffer.Length - 7 - length)); } } } } else { Debugger.Error("The received buffer length is inferior the header length."); this.Connection.Token.Buffer = null; this.Connection.Token.Packet.Clear(); } } else { ServerConnection.Disconnect(this.Connection.Token.Args); } } }