public IDecodingState Decode(IoBuffer input, IProtocolDecoderOutput output) { if (_buffer == null) { if (input.Remaining >= _length) { Int32 limit = input.Limit; input.Limit = input.Position + _length; IoBuffer product = input.Slice(); input.Position = input.Position + _length; input.Limit = limit; return FinishDecode(product, output); } _buffer = IoBuffer.Allocate(_length); _buffer.Put(input); return this; } if (input.Remaining >= _length - _buffer.Position) { Int32 limit = input.Limit; input.Limit = input.Position + _length - _buffer.Position; _buffer.Put(input); input.Limit = limit; IoBuffer product = _buffer; _buffer = null; return FinishDecode(product.Flip(), output); } _buffer.Put(input); return this; }
public void TestSliceAutoExpand() { IoBuffer buffer = ByteBufferAllocator.Instance.Allocate(8); buffer.AutoExpand = true; Assert.IsTrue(buffer.AutoExpand, "Should AutoExpand"); IoBuffer slice = buffer.Slice(); Assert.IsFalse(buffer.AutoExpand, "Should *NOT* AutoExpand"); Assert.IsFalse(slice.AutoExpand, "Should *NOT* AutoExpand"); }
public IDecodingState Decode(IoBuffer input, IProtocolDecoderOutput output) { Int32 terminatorPos = input.IndexOf(_terminator); if (terminatorPos >= 0) { Int32 limit = input.Limit; IoBuffer product; if (input.Position < terminatorPos) { input.Limit = terminatorPos; if (_buffer == null) { product = input.Slice(); } else { _buffer.Put(input); product = _buffer.Flip(); _buffer = null; } input.Limit = limit; } else { // When input contained only terminator rather than actual data... if (_buffer == null) { product = IoBuffer.Allocate(0); } else { product = _buffer.Flip(); _buffer = null; } } input.Position = terminatorPos + 1; return FinishDecode(product, output); } if (_buffer == null) { _buffer = IoBuffer.Allocate(input.Remaining); _buffer.AutoExpand = true; } _buffer.Put(input); return this; }
public MessageDecoderResult Decode(IoSession session, IoBuffer input, IProtocolDecoderOutput output) { int limit = input.Limit; int position = input.Position; var len = input.GetInt32(); var version = input.Get(); input.Position = position; input.Limit = input.Position + len; var buffer = input.Slice(); input.Position = input.Limit; input.Limit = limit; var message = DoDecode(version.ToEnum<MessageVersion>(), buffer); if (message != null) output.Write(message); return MessageDecoderResult.OK; }
/// <inheritdoc/> public override IoBuffer Slice() { return(_buf.Slice()); }
public IDecodingState Decode(IoBuffer input, IProtocolDecoderOutput output) { Int32 beginPos = input.Position; Int32 limit = input.Limit; Int32 terminatorPos = -1; for (Int32 i = beginPos; i < limit; i++) { Byte b = input.Get(i); if (b == CR) { _lastIsCR = true; } else { if (b == LF && _lastIsCR) { terminatorPos = i; break; } _lastIsCR = false; } } if (terminatorPos >= 0) { IoBuffer product; Int32 endPos = terminatorPos - 1; if (beginPos < endPos) { input.Limit = endPos; if (_buffer == null) { product = input.Slice(); } else { _buffer.Put(input); product = _buffer.Flip(); _buffer = null; } input.Limit = limit; } else { // When input contained only CR or LF rather than actual data... if (_buffer == null) { product = IoBuffer.Allocate(0); } else { product = _buffer.Flip(); _buffer = null; } } input.Position = terminatorPos + 1; return FinishDecode(product, output); } input.Position = beginPos; if (_buffer == null) { _buffer = IoBuffer.Allocate(input.Remaining); _buffer.AutoExpand = true; } _buffer.Put(input); if (_lastIsCR) { _buffer.Position = _buffer.Position - 1; } return this; }