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(); }
public DataPacket(IPacketCodec defaultCodec) { BaseStream = new MemoryStream(); Content = defaultCodec.Clone(BaseStream); }