private void RaiseMessage()
{
var header = true;
var stop = true;
var sent = false;
// var stage = _stageAck + 1;
foreach (var message in _messagesSent)
{
if (!message.Repeatable)
{
//stage += (ulong) message.Fragments.Count;
header = true;
continue;
}
if (stop)
{
Band.Flush();
//HeaderFlag = true;
stop = false;
}
uint available;
var content = message.GetReader(out available);
var itFrag = message.Fragments.GetEnumerator();
var notTheEnd = itFrag.MoveNext();
while(notTheEnd)
{
var contentSize = available;
var fragmentOffset = itFrag.Current.Offset;
var stage = itFrag.Current.Stage;
notTheEnd = itFrag.MoveNext();
byte flags = 0;
if (itFrag.Current.Offset > 0) flags |= MESSAGE_WITH_BEFOREPART;
if (notTheEnd)
{
flags |= MESSAGE_WITH_AFTERPART;
contentSize = itFrag.Current.Offset - fragmentOffset;
}
var size = contentSize + 4;
if (header) size += HeaderSize(stage);
if (size > Band.Writer.AvaliableBufferCounts)
{
if(!sent)Logger.FATAL("Raise messages on flowWriter {0} without sending!",Id);
Logger.Debug("Raise message on flowWriter {0} finishs on stage {1}",Id, stage);
return;
}
sent = true;
size -= 3;
Debug.WriteLine("raise message on flowWriter {0},stage {1}",Id, stage);
Flush(Band.WriteMessage((byte) (header?0x10:0x11),(ushort)size), stage++, flags,header,content,(ushort) contentSize);
available -= contentSize;
header = false;
}
}
if(stop)_trigger.Stop();
}