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(); }
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); }
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); } }