Beispiel #1
0
        public PacketResult Process(byte[] payload, Blowfish blowfish)
        {
            if (payload.Length < Header.Length)
            {
                return(PacketResult.Malformed);
            }

            PacketHeader = payload.Copy(0, Header.Length).UnMarshal <Header>();

            // missing data, need to wait for remaining data and combine
            if (PacketHeader.Size > payload.Length)
            {
                return(PacketResult.Fragmented);
            }

            if (PacketHeader.SubPackets == 0)
            {
                return(PacketResult.Malformed);
            }

            var payloadData = new byte[PacketHeader.Size - Header.Length];

            Buffer.BlockCopy(payload, Header.Length, payloadData, 0, payloadData.Length);

            if (PacketHeader.Compressed == 1)
            {
                if (!ZlibProvider.Deflate(payloadData, out payloadData))
                {
                    return(PacketResult.Malformed);
                }
            }

            using (var stream = new MemoryStream(payloadData))
            {
                using (var reader = new BinaryReader(stream))
                {
                    for (uint i = 0u; i < PacketHeader.SubPackets; i++)
                    {
                        SubPacket    subPacket;
                        PacketResult result = SubPacket.Process(reader, blowfish, out subPacket);
                        if (result != PacketResult.Ok)
                        {
                            return(result);
                        }

                        SubPackets.Add(subPacket);
                    }
                }
            }

            return(PacketResult.Ok);
        }