private static int computeMetadataLength(FrameType frameType, final @Nullable Integer length) { if (!hasMetadataLengthField(frameType)) { // Frames with only metadata does not need metadata length field return length != null ? length : 0; } else { return length == null ? 0 : length + FRAME_LENGTH_SIZE; } }
public static @Nullable Integer metadataLength( ByteBuf byteBuf, FrameType frameType, int frameLength) { if (!hasMetadataLengthField(frameType)) { return frameLength - metadataOffset(byteBuf); } else { return decodeMetadataLength(byteBuf, metadataOffset(byteBuf)); } }
public static int encodeMetadata( final ByteBuf byteBuf, final FrameType frameType, final int metadataOffset, final @Nullable ByteBuf metadata) { int length = 0; if (metadata != null) { final int metadataLength = metadata.readableBytes(); int typeAndFlags = byteBuf.getShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET); typeAndFlags |= FLAGS_M; byteBuf.setShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET, (short) typeAndFlags); if (hasMetadataLengthField(frameType)) { encodeLength(byteBuf, metadataOffset, metadataLength); length += FRAME_LENGTH_SIZE; } byteBuf.setBytes(metadataOffset + length, metadata, metadata.readerIndex(), metadataLength); length += metadataLength; } return length; }
public static @Nullable ByteBuf sliceFrameMetadata(final ByteBuf byteBuf) { final FrameType frameType = frameType(byteBuf); final int frameLength = frameLength(byteBuf); final @Nullable Integer metadataLength = metadataLength(byteBuf, frameType, frameLength); if (metadataLength == null) { return null; } int metadataOffset = metadataOffset(byteBuf); if (hasMetadataLengthField(frameType)) { metadataOffset += FRAME_LENGTH_SIZE; } ByteBuf result = Unpooled.EMPTY_BUFFER; if (0 < metadataLength) { result = byteBuf.slice(metadataOffset, metadataLength); } return result; }
@Test public void missingMetadataLength() { for (FrameType frameType : FrameType.values()) { switch (frameType) { case RESERVED: break; case CANCEL: case METADATA_PUSH: case LEASE: assertFalse( "!hasMetadataLengthField(): " + frameType, FrameHeaderFlyweight.hasMetadataLengthField(frameType)); break; default: if (frameType.canHaveMetadata()) { assertTrue( "hasMetadataLengthField(): " + frameType, FrameHeaderFlyweight.hasMetadataLengthField(frameType)); } } } }
private static int computeMetadataLength(FrameType frameType, final @Nullable Integer length) { if (!hasMetadataLengthField(frameType)) { // Frames with only metadata does not need metadata length field return length != null ? length : 0; } else { return length == null ? 0 : length + FRAME_LENGTH_SIZE; } }
public static @Nullable Integer metadataLength( ByteBuf byteBuf, FrameType frameType, int frameLength) { if (!hasMetadataLengthField(frameType)) { return frameLength - metadataOffset(byteBuf); } else { return decodeMetadataLength(byteBuf, metadataOffset(byteBuf)); } }
public static int encodeMetadata( final ByteBuf byteBuf, final FrameType frameType, final int metadataOffset, final @Nullable ByteBuf metadata) { int length = 0; if (metadata != null) { final int metadataLength = metadata.readableBytes(); int typeAndFlags = byteBuf.getShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET); typeAndFlags |= FLAGS_M; byteBuf.setShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET, (short) typeAndFlags); if (hasMetadataLengthField(frameType)) { encodeLength(byteBuf, metadataOffset, metadataLength); length += FRAME_LENGTH_SIZE; } byteBuf.setBytes(metadataOffset + length, metadata, metadata.readerIndex(), metadataLength); length += metadataLength; } return length; }
public static @Nullable ByteBuf sliceFrameMetadata(final ByteBuf byteBuf) { final FrameType frameType = frameType(byteBuf); final int frameLength = frameLength(byteBuf); final @Nullable Integer metadataLength = metadataLength(byteBuf, frameType, frameLength); if (metadataLength == null) { return null; } int metadataOffset = metadataOffset(byteBuf); if (hasMetadataLengthField(frameType)) { metadataOffset += FRAME_LENGTH_SIZE; } ByteBuf result = Unpooled.EMPTY_BUFFER; if (0 < metadataLength) { result = byteBuf.slice(metadataOffset, metadataLength); } return result; }