void WriteDelivery(Delivery delivery)
{
// Must be called under lock. Delivery must be on list already
while (this.outgoingWindow > 0 && delivery != null)
{
this.outgoingWindow--;
this.nextOutgoingId++;
Transfer transfer = new Transfer() { Handle = delivery.Handle };
bool first = delivery.BytesTransfered == 0;
if (first)
{
// initialize properties for first transfer
delivery.DeliveryId = this.outgoingDeliveryId++;
transfer.DeliveryTag = delivery.Tag;
transfer.DeliveryId = delivery.DeliveryId;
transfer.State = delivery.State;
transfer.MessageFormat = 0;
transfer.Settled = delivery.Settled;
transfer.Batchable = true;
}
int len = this.connection.SendCommand(this.channel, transfer, first,
delivery.Buffer, delivery.ReservedBufferSize);
delivery.BytesTransfered += len;
if (delivery.Buffer.Length == 0)
{
delivery.Buffer.ReleaseReference();
Delivery next = (Delivery)delivery.Next;
if (delivery.Settled)
{
this.outgoingList.Remove(delivery);
}
delivery = next;
}
}
}
}