示例#1
0
        public void ReadFromStream(IPacketCodec rawCodec, PacketBoundTo boundTo, Func <int> compressThresholdCallback, Func <ProtocolState> stateCallback)
        {
            BoundTo = boundTo;
            State   = stateCallback();
            var length = rawCodec.ReadVarInt(); // Length of Packet ID + Data

            PacketLength = length;
            var threshold = compressThresholdCallback();
            int dataLength;

            using var recvStream = new MemoryStream(); //no extra bytes read
            rawCodec.CopyTo(recvStream, length);
            var recvCodec = rawCodec.Clone(recvStream);

            recvStream.Position = 0;
            if (threshold == 0 || (dataLength = recvCodec.ReadVarInt()) < threshold)
            {
                DataLength = length;
                recvCodec.CopyTo(BaseStream, length);
                BaseStream.Position = 0;
                PacketId            = Content.ReadVarInt();
                return;
            }
            DataLength = dataLength;
            using var compressedStream = new InflaterInputStream(recvStream)
                  {
                      IsStreamOwner = false
                  };
            rawCodec.Clone(compressedStream).CopyTo(BaseStream, dataLength);
            BaseStream.Position = 0;
            PacketId            = Content.ReadVarInt();
        }