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); }
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); }
/// <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); }