private void FragmentSortedHandler(ulong stage, Stream fragment, byte flags)
{
if (stage <= Stage)
{
Logger.FATAL("Stage {0} not sorted on flow {1}",stage,Id);
return;
}
if (stage > Stage + 1)
{
var lostCount = (uint)(stage - Stage - 1);
Stage = stage;
if (_packet != null)
{
_packet.Dispose();
_packet = null;
}
if ((flags & FlowWriter.MESSAGE_WITH_BEFOREPART) != 0)
{
LostFragmentsHandler(lostCount+1);
return;
}
LostFragmentsHandler(lostCount);
}
else
{
Stage = stage;
}
if ((flags & FlowWriter.MESSAGE_ABANDONMENT) != 0)
{
if (_packet != null)
{
_packet.Dispose();
_packet = null;
}
}
Stream message = null;
if ((flags & FlowWriter.MESSAGE_WITH_BEFOREPART) != 0)
{
if (_packet == null)
{
Logger.WARN("A received message tells to have a 'beforepart' and nevertheless partbuffer is empty, certainly some packets were lost");
LostFragmentsHandler(1);
_packet?.Dispose();
_packet = null;
return;
}
_packet.Add(fragment);
if ((flags & FlowWriter.MESSAGE_WITH_AFTERPART) != 0) return;
message = _packet.Release();
}
else if ((flags & FlowWriter.MESSAGE_WITH_AFTERPART) != 0)
{
if (_packet != null)
{
Logger.FATAL("A received message tells to have not 'beforepart' and nevertheless partbuffer exists");
LostFragmentsHandler(_packet.Fragments);
_packet.Dispose();
}
_packet = new Packet(fragment);
return;
}
_packet = null;
if (IsWaitingSync)
{
if (message == null)
{
message = Utils.Rms.GetStream();
fragment.CopyPartTo(message,(int) fragment.GetAvaliableByteCounts());
message.Position = 0;
}
SyncMessageQueue.Enqueue(message);
return;
}
HandlerMessage(message??fragment,message != null);
}