Пример #1
0
        public int ReadFromBuffer(out CtpCommand packet, byte[] buffer, int current, int length)
        {
            //Note: The code in these two modules are identical:
            packet = null;
            if (m_disposed)
            {
                return(0);
            }
            if (length < 2)
            {
                return(0);
            }

            if (!PacketMethods.TryReadPacket(buffer, current, length, MaximumPacketSize, out PacketContents payloadType, out int payloadFlags, out byte[] payloadBuffer, out int consumedLength))
            {
                return(0);
            }

            switch (payloadType)
            {
            case PacketContents.CommandSchema:
                var scheme = new CtpCommandSchema(payloadBuffer);
                m_inboundSchemes[payloadFlags] = scheme;
                if (m_inboundSchemes.Count > MaximumSchemeCount)
                {
                    throw new Exception("Too many schemes have been defined.");
                }
                break;

            case PacketContents.CommandSchemaWithData:
                packet = new CtpCommand(payloadBuffer);
                break;

            case PacketContents.CommandData:
                if (m_inboundSchemes.TryGetValue(payloadFlags, out var commandSchema))
                {
                    packet = new CtpCommand(commandSchema, payloadBuffer);
                }
                break;

            case PacketContents.CompressedDeflate:
            case PacketContents.CompressedZlib:
                packet = Inflate(payloadType, payloadFlags, payloadBuffer);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(consumedLength);
        }
Пример #2
0
        public CtpCommand(byte[] data)
        {
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            int schemaLength = BigEndian.ToUInt16(data, 0);

            byte[] schema = new byte[schemaLength];
            Array.Copy(data, 2, schema, 0, schemaLength);
            m_schema = new CtpCommandSchema(schema);
            m_data   = new byte[data.Length - 2 - schemaLength];
            Array.Copy(data, data.Length - m_data.Length, m_data, 0, m_data.Length);
        }
Пример #3
0
 /// <summary>
 /// Creates an <see cref="CtpCommand"/> from a byte array. This method also validates the data.
 /// </summary>
 /// <param name="data">The data</param>
 /// <param name="schema"></param>
 public CtpCommand(CtpCommandSchema schema, byte[] data)
 {
     m_schema = schema ?? throw new ArgumentNullException(nameof(schema));
     m_data   = data ?? throw new ArgumentNullException(nameof(data));
 }
 /// <summary>
 /// Creates a <see cref="CtpCommandReader"/> from the specified byte array.
 /// </summary>
 /// <param name="schema"></param>
 /// <param name="data"></param>
 public CtpCommandReader(CtpCommandSchema schema, byte[] data)
 {
     m_schema = schema;
     m_stream = new CtpObjectReader(data);
 }