public static PacketResult Process(BinaryReader reader, Blowfish blowfish, out SubPacket subPacket) { subPacket = null; Header header = Header.UnMarshal(reader); // not enough data to cover length specified in header if (reader.BaseStream.Length - reader.BaseStream.Position < header.Size - Header.Length) { return(PacketResult.Malformed); } byte[] payload = reader.ReadBytes((int)(header.Size - Header.Length)); if (header.Type != SubPacketType.KeepAliveRequest && header.Type != SubPacketType.KeepAliveResponse) { blowfish?.Decipher(payload, 0, payload.Length); } using (var stream = new MemoryStream(payload)) { using (var subReader = new BinaryReader(stream)) { MessageHeader messageHeader = new MessageHeader(); if (header.Type == SubPacketType.Message) { messageHeader = MessageHeader.UnMarshal(subReader); Array.Copy(payload, MessageHeader.Length, payload, 0, payload.Length - MessageHeader.Length); Array.Resize(ref payload, payload.Length - (int)MessageHeader.Length); stream.Position = 0L; } subPacket = PacketManager.GetSubPacket(header.Type, (SubPacketClientOpcode)messageHeader.Opcode, SubPacketServerOpcode.None) ?? new SubPacket(); subPacket.Initialise(header, messageHeader); subPacket.Read(subReader); } } return(PacketResult.Ok); }