public static AMQPHeader getAMQP(IByteBuffer buf)
        {
            TLVAmqp list = TLVFactory.getTlv(buf);

            if (list.Code != AMQPType.LIST_0 && list.Code != AMQPType.LIST_8 && list.Code != AMQPType.LIST_32)
            {
                throw new MalformedMessageException("Received amqp-header with malformed arguments");
            }

            AMQPHeader header = null;

            Byte        byteCode = list.Constructor.getDescriptorCode().Value;
            HeaderCodes code     = (HeaderCodes)byteCode;

            switch (code)
            {
            case HeaderCodes.ATTACH:
                header = new AMQPAttach();
                break;

            case HeaderCodes.BEGIN:
                header = new AMQPBegin();
                break;

            case HeaderCodes.CLOSE:
                header = new AMQPClose();
                break;

            case HeaderCodes.DETACH:
                header = new AMQPDetach();
                break;

            case HeaderCodes.DISPOSITION:
                header = new AMQPDisposition();
                break;

            case HeaderCodes.END:
                header = new AMQPEnd();
                break;

            case HeaderCodes.FLOW:
                header = new AMQPFlow();
                break;

            case HeaderCodes.OPEN:
                header = new AMQPOpen();
                break;

            case HeaderCodes.TRANSFER:
                header = new AMQPTransfer();
                break;

            default:
                throw new MalformedMessageException("Received amqp-header with unrecognized performative");
            }

            header.fillArguments((TLVList)list);

            return(header);
        }
        public void ProcessTransfer(AMQPData data, long?handle, bool?settled, long?_deliveryId)
        {
            QOS qos = QOS.AT_LEAST_ONCE;

            if (settled.HasValue && settled.Value)
            {
                qos = QOS.AT_MOST_ONCE;
            }
            else
            {
                AMQPDisposition disposition = new AMQPDisposition();
                disposition.Channel = _channel;
                disposition.Role    = RoleCodes.RECEIVER;
                disposition.First   = _deliveryId.Value;
                disposition.Last    = _deliveryId.Value;
                disposition.Settled = true;
                disposition.State   = new AMQPAccepted();
                _client.Send(disposition);
            }

            String topicName = null;

            if (!handle.HasValue || !_usedMappings.ContainsKey(handle.Value))
            {
                return;
            }

            topicName = _usedMappings[handle.Value];
            _dbInterface.StoreMessage(topicName, data.Data, qos);

            if (_listener != null)
            {
                _listener.MessageReceived(MessageType.PUBLISH);
            }
        }