Наследование: IDisposable
Пример #1
0
 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);
 }