Ejemplo n.º 1
0
        private CtpCommand Inflate(PacketContents mode, long inflatedSize, byte[] payload)
        {
            var rv = new byte[inflatedSize];

            switch (mode)
            {
            case PacketContents.CompressedDeflate:
                using (var ms = new MemoryStream(payload))
                    using (var comp = new DeflateStream(ms, CompressionMode.Decompress, true))
                    {
                        comp.ReadAll(rv, 0, rv.Length);
                    }
                break;

            case PacketContents.CompressedZlib:
                if (m_stream == null)
                {
                    m_stream            = new MemoryStream();
                    m_inflate           = new DeflateStream(m_stream, CompressionMode.Decompress);
                    m_inflate.FlushMode = FlushType.Sync;
                }
                m_stream.Write(payload, 0, payload.Length);
                m_stream.Position = 0;
                m_inflate.Read(rv, 0, rv.Length);
                m_stream.SetLength(0);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
            }

            ReadFromBuffer(out var packet, rv, 0, rv.Length);
            return(packet);
        }
Ejemplo n.º 2
0
 internal static PooledBuffer CreatePacket(PacketContents contentType, int contentFlags, byte[] payload)
 {
     if (s_writer == null)
         s_writer = new CtpObjectWriter();
     var wr = s_writer;
     wr.Clear();
     wr.Write((byte)contentType);
     wr.Write(contentFlags);
     wr.Write(payload);
     return wr.TakeBuffer();
 }
Ejemplo n.º 3
0
        internal static bool TryReadPacket(byte[] data, int position, int length, int maximumPacketSize, out PacketContents payloadType, out int payloadFlags, out byte[] payloadBuffer, out int consumedLength)
        {
            if (length > maximumPacketSize)
                throw new Exception("Command size is too large");

            var stream = new CtpObjectReader(data, position, length);
            CtpObject pType;
            CtpObject pFlags;
            CtpObject pData;
            if (stream.TryRead(out pType) && stream.TryRead(out pFlags) && stream.TryRead(out pData))
            {
                payloadType = (PacketContents)(byte)pType;
                payloadFlags = (int)pFlags;
                payloadBuffer = (byte[])pData;
                consumedLength = stream.Position;
                return true;
            }
            payloadType = default(PacketContents);
            payloadFlags = 0;
            payloadBuffer = null;
            consumedLength = 0;
            return false;
        }