internal override async ValueTask SendAsync( long streamId, OutgoingFrame frame, bool fin, CancellationToken cancel) { var data = new List <ArraySegment <byte> >(); var ostr = new OutputStream(Encoding, data); FrameType frameType = fin ? FrameType.StreamLast : FrameType.Stream; ostr.WriteByte((byte)frameType); OutputStream.Position sizePos = ostr.StartFixedLengthSize(4); ostr.WriteVarLong(streamId); OutputStream.Position ice2HeaderPos = ostr.Tail; if (frame is OutgoingRequestFrame requestFrame) { ostr.WriteByte((byte)Ice2Definitions.FrameType.Request); } else if (frame is OutgoingResponseFrame responseFrame) { ostr.WriteByte((byte)Ice2Definitions.FrameType.Response); } else { Debug.Assert(false); return; } ostr.WriteSize(frame.Size); int ice2HeaderSize = ostr.Tail.Offset - ice2HeaderPos.Offset; data[^ 1] = data[^ 1].Slice(0, ostr.Tail.Offset); // TODO: Shouldn't this be the job of ostr.Finish()?
private protected void WriteBinaryContext(OutputStream ostr) { Debug.Assert(Protocol == Protocol.Ice2); Debug.Assert(ostr.Encoding == Encoding.V20); int sizeLength = OutputStream.GetSizeLength20(InitialBinaryContext.Count + (_binaryContextOverride?.Count ?? 0)); int size = 0; OutputStream.Position start = ostr.StartFixedLengthSize(sizeLength); // First write the overrides, then the InitialBinaryContext entries that were not overridden. if (_binaryContextOverride is Dictionary <int, Action <OutputStream> > binaryContextOverride) { foreach ((int key, Action <OutputStream> action) in binaryContextOverride) { ostr.WriteVarInt(key); OutputStream.Position startValue = ostr.StartFixedLengthSize(2); action(ostr); ostr.EndFixedLengthSize(startValue, 2); size++; } } foreach ((int key, ReadOnlyMemory <byte> value) in InitialBinaryContext) { if (_binaryContextOverride == null || !_binaryContextOverride.ContainsKey(key)) { ostr.WriteVarInt(key); ostr.WriteSize(value.Length); ostr.WriteByteSpan(value.Span); size++; } } ostr.RewriteFixedLengthSize20(size, start, sizeLength); }