public void Store(AMQPHeader message)
        {
            if (message.Code.Value == HeaderCodes.TRANSFER)
            {
                MessageResendTimer <AMQPHeader> timer = new MessageResendTimer <AMQPHeader>(message, _listener, this, false);
                Boolean added = false;
                if (!((AMQPTransfer)message).DeliveryId.HasValue)
                {
                    Int32 packetID = _packetIDCounter;
                    while (!added)
                    {
                        packetID = Interlocked.Increment(ref _packetIDCounter) % MAX_VALUE;
                        try
                        {
                            _timersMap.Add(packetID, timer);
                            added = true;
                        }
                        catch (ArgumentException)
                        {
                            //already exists
                        }
                    }


                    AMQPTransfer countable = (AMQPTransfer)message;
                    countable.DeliveryId = packetID;
                }
                else
                {
                    _timersMap.Add((int)((AMQPTransfer)message).DeliveryId.Value, timer);
                }

                timer.Execute(_resendPeriod);
            }
        }
        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 ProcessAttach(String name, RoleCodes?role, Int64?handle)
        {
            if (role.HasValue)
            {
                //its reverse here
                if (role.Value == RoleCodes.RECEIVER)
                {
                    Int64 realHandle = _usedOutgoingMappings[name];

                    //publish
                    if (_usedOutgoingMappings.ContainsKey(name))
                    {
                        for (int i = 0; i < pendingMessages.Count; i++)
                        {
                            AMQPTransfer currMessage = pendingMessages[i];
                            if (currMessage.Handle == realHandle)
                            {
                                pendingMessages.RemoveAt(i);
                                i--;

                                _timers.Store(currMessage);
                                if (currMessage.Settled.Value)
                                {
                                    _timers.Remove((Int32)currMessage.DeliveryId.Value);
                                }

                                _client.Send(currMessage);
                            }
                        }
                    }
                }
                else
                {
                    _usedIncomingMappings[name] = handle.Value;
                    _usedMappings[handle.Value] = name;

                    if (handle.Value >= _nextHandle)
                    {
                        _nextHandle = handle.Value + 1;
                    }

                    //subscribe
                    _dbInterface.StoreTopic(name, QOS.AT_LEAST_ONCE);

                    if (_listener != null)
                    {
                        _listener.MessageReceived(MessageType.SUBACK);
                    }
                }
            }
        }
        public void Publish(Topic topic, byte[] content, Boolean retain, Boolean dup)
        {
            AMQPTransfer transfer = new AMQPTransfer();

            transfer.Channel = _channel;
            if (topic.Qos == QOS.AT_MOST_ONCE)
            {
                transfer.Settled = true;
            }
            else
            {
                transfer.Settled = false;
            }

            transfer.More          = false;
            transfer.MessageFormat = new AMQPMessageFormat(0);

            MessageHeader messageHeader = new MessageHeader();

            messageHeader.Durable      = true;
            messageHeader.Priority     = 3;
            messageHeader.Milliseconds = 1000;

            AMQPData data = new AMQPData();

            data.Data = content;

            AMQPSection[] sections = new AMQPSection[1];
            sections[0] = data;
            transfer.addSections(sections);

            if (_usedOutgoingMappings.ContainsKey(topic.Name))
            {
                Int64 handle = _usedOutgoingMappings[topic.Name];
                transfer.Handle = handle;
                _timers.Store(transfer);
                if (transfer.Settled.Value)
                {
                    _timers.Remove((Int32)transfer.DeliveryId.Value);
                }

                _client.Send(transfer);
            }
            else
            {
                Int64 currentHandler = _nextHandle++;
                _usedOutgoingMappings[topic.Name] = currentHandler;
                _usedMappings[currentHandler]     = topic.Name;

                transfer.Handle = currentHandler;
                pendingMessages.Add(transfer);

                AMQPAttach attach = new AMQPAttach();
                attach.Channel              = _channel;
                attach.Name                 = topic.Name;
                attach.Handle               = currentHandler;
                attach.Role                 = RoleCodes.SENDER;
                attach.RcvSettleMode        = ReceiveCodes.FIRST;
                attach.InitialDeliveryCount = 0L;
                AMQPSource source = new AMQPSource();
                source.Address = topic.Name;
                source.Durable = TerminusDurability.NONE;
                source.Timeout = 0;
                source.Dynamic = false;
                attach.Source  = source;
                _client.Send(attach);
            }
        }