public void Flush(bool full = false)
{
//if (_messagesSent.Count > 100)
//{
//}
var outputWriter = Band.Writer;
var header = !Band.CanWriterFollowing(this);
while (_messages.Count > 0)
{
var message = _messages.Dequeue();
if (message.Repeatable)
{
++_repeatable;
_trigger.Start();
}
uint fragments = 0;
uint available;
var content = message.GetReader(out available);
do
{
++_stage;
var outputBufferCount = outputWriter.AvaliableBufferCounts;
var headerSize = (header && outputBufferCount < 62) ? HeaderSize(_stage) : 0;
var contentSize = available;
if (outputBufferCount < headerSize + 12)
{
Band.Flush();
header = true;
outputBufferCount = outputWriter.AvaliableBufferCounts;
}
headerSize = header ? (headerSize > 0 ? headerSize + 4 : HeaderSize(_stage) + 4) : 4;
byte flags = 0;
if (fragments > 0)
{
flags |= MESSAGE_WITH_BEFOREPART;
}
var head = header;
if (headerSize + contentSize > outputBufferCount)
{
flags |= MESSAGE_WITH_AFTERPART;
contentSize = (uint)(outputBufferCount - headerSize);
header = true;
}
else
{
header = false;
}
Flush(Band.WriteMessage((byte)(head ? 0x10 : 0x11), (ushort)(headerSize + contentSize - 3), this),
_stage, flags, head, content, (ushort)contentSize);
message.Fragments.Add(new Message.FragmentInfo(fragments, _stage));
available -= contentSize;
fragments += contentSize;
} while (available > 0);
_messagesSent.AddLast(message);
// _messages.Remove(message);
}
if (full)
{
Band.Flush(true);
}
}