public void FragmentHandler(ulong stage, ulong deltaNAck, Stream fragment, byte flags)
{
//Logger.Debug("Stage {0} on flow {1} received", stage, Id);
if (Completed) return;
var nextStage = Stage + 1;
if (stage < nextStage)
{
Logger.Debug("Stage {0} on flow {1} has already been received",stage,Id);
return;
}
if (deltaNAck > stage)
{
Logger.WARN("DeltaNAck {0} superior to stage {1} on flow {2}",deltaNAck,stage,Id);
deltaNAck = stage;
}
if (Stage < stage - deltaNAck)
{
foreach (var it in _fragments.OrderBy(x=>x.Stage).TakeWhile(it => it.Stage <= stage).ToList())
{
FragmentSortedHandler(it.Stage, it.Data, it.Flags);
if ((it.Flags & FlowWriter.MESSAGE_END)!=0)
{
Complete();
return;
}
it.Data.Dispose();
_fragments.Remove(it);
}
nextStage = stage;
}
if (stage > nextStage)
{
if (_fragments.All(x => x.Stage != stage))
{
_fragments.Add(new Fragment(fragment, flags,stage));
if (_fragments.Count > 100)
{
Logger.Debug("_fragments.Count={0}", _fragments.Count);
}
else
{
//Logger.Debug("nextStage{0},now receive {1}", nextStage,stage);
}
}
else
{
Logger.Debug("Stage {0} on flow {1} has already been received",stage,Id);
}
}
else
{
FragmentSortedHandler(nextStage++, fragment, flags);
if ((flags & FlowWriter.MESSAGE_END) != 0) Complete();
if(_fragments.Count>0)
foreach (var fragment1 in _fragments.OrderBy(x => x.Stage).ToList())
{
if (fragment1.Stage > nextStage) break;
FragmentSortedHandler(nextStage++, fragment1.Data, fragment1.Flags);
if ((fragment1.Flags & FlowWriter.MESSAGE_END) != 0)
{
Complete();
return;
}
fragment1.Data.Dispose();
_fragments.Remove(fragment1);
}
}
}