Ejemplo n.º 1
0
        public void Commit()
        {
            uint size     = 0;
            var  lost     = new List <ulong>();
            var  current  = Stage;
            uint count    = 0;
            var  it       = _fragments.OrderBy(x => x.Stage).GetEnumerator();
            var  isNotEnd = it.MoveNext();

            while (isNotEnd)
            {
                current = it.Current.Stage - current - 2;
                size   += H2NBinaryWriter.Get7BitValueSize(current);
                lost.Add(current);
                current = it.Current.Stage;
                while ((isNotEnd = it.MoveNext()) && it.Current.Stage == (++current))
                {
                    ++count;
                }
                size += H2NBinaryWriter.Get7BitValueSize(count);
                lost.Add(count);
                --current;
                count = 0;
            }
            var bufferSize = _packet == null ? 0x7F : (_packet.Fragments > 0x3F00 ? 0 : 0x3F00 - _packet.Fragments);

            if (string.IsNullOrEmpty(Writer.Signature))
            {
                bufferSize = 0;
            }
            var ack = Band.WriteMessage(0x51,
                                        (ushort)(H2NBinaryWriter.Get7BitValueSize(Id) + H2NBinaryWriter.Get7BitValueSize(bufferSize) +
                                                 H2NBinaryWriter.Get7BitValueSize(Stage) + size));
            var pos = ack.BaseStream.Position;

            ack.Write7BitLongValue(Id);
            ack.Write7BitValue(bufferSize);
            ack.Write7BitLongValue(Stage);
            //Debug.Write($"commit:{Id},stage:{Stage},writerId:{Writer.Id}");
            foreach (var l in lost)
            {
                //Debug.Write("lost"+l);
                ack.Write7BitLongValue(l);
            }
            // Debug.WriteLine("");
            CommitHandler();
            Writer.Flush();
        }
Ejemplo n.º 2
0
        private uint HeaderSize(ulong stage)
        {
            var size = H2NBinaryWriter.Get7BitValueSize(Id);

            size += H2NBinaryWriter.Get7BitValueSize(stage);
            if (_stageAck > stage)
            {
                Logger.INFO("stageAck {0} superior to stage {1} on flowWriter {2}", _stageAck, stage, Id);
            }
            size += H2NBinaryWriter.Get7BitValueSize(stage - _stageAck);
            if (_stageAck <= 0)
            {
                size += (byte)(Signature.Length + (FlowId == 0 ? 2 : (4 + H2NBinaryWriter.Get7BitValueSize(FlowId))));
            }
            return(size);
        }
Ejemplo n.º 3
0
 public void Flush(H2NBinaryWriter writer, ulong stage, byte flags, bool header, N2HBinaryReader reader, ushort size)
 {
     Debug.WriteLine("sent:{0} stage {1}", Id, stage);
     if (_stageAck == 0 && header)
     {
         flags |= MESSAGE_HEADER;
     }
     if (size == 0)
     {
         flags |= MESSAGE_ABANDONMENT;
     }
     if (Closed && _messages.Count == 1)
     {
         flags |= MESSAGE_END;
     }
     writer.Write(flags);
     if (header)
     {
         writer.Write7BitLongValue(Id);
         writer.Write7BitLongValue(stage);
         writer.Write7BitLongValue(stage - _stageAck);
         if (_stageAck == 0)
         {
             writer.WriteString8(Signature);
             if (FlowId > 0)
             {
                 writer.Write((byte)(1 + H2NBinaryWriter.Get7BitValueSize(FlowId)));
                 writer.Write((byte)0x0a);
                 writer.Write7BitLongValue(FlowId);
             }
             writer.Write((byte)0);
         }
     }
     if (size > 0)
     {
         reader.BaseStream.CopyPartTo(writer.BaseStream, size);
     }
 }