/** * Creates a read-only buffer which disallows any modification operations on the specified {@code * buffer}. The new buffer has the same {@code readerIndex} and {@code writerIndex} with the * specified {@code buffer}. */ public static ByteBuf unmodifiableBuffer(ByteBuf buffer) { ByteOrder endianness = buffer.order(); if (endianness == BIG_ENDIAN) { return new ReadOnlyByteBuf(buffer); } return new ReadOnlyByteBuf(buffer.order(BIG_ENDIAN)).order(LITTLE_ENDIAN); }
@Test public void shouldHaveSameByteOrder() { ByteBuf buf = Unpooled.buffer(1); assertSame(Unpooled.BIG_ENDIAN, Unpooled.unmodifiableBuffer(buf).order()); buf = buf.order(LITTLE_ENDIAN); assertSame(Unpooled.LITTLE_ENDIAN, Unpooled.unmodifiableBuffer(buf).order()); }
@Override protected ByteBuf newBuffer(int length) { buffer = PooledByteBufAllocator.DEFAULT.directBuffer(length).order(ByteOrder.LITTLE_ENDIAN); assertSame(ByteOrder.LITTLE_ENDIAN, buffer.order()); assertEquals(0, buffer.writerIndex()); return buffer; }
private int addComponent0(int cIndex, ByteBuf buffer, boolean addedBySelf) { checkComponentIndex(cIndex); if (buffer == null) { throw new NullPointerException("buffer"); } if (buffer instanceof Iterable) { @SuppressWarnings("unchecked") Iterable<ByteBuf> composite = (Iterable<ByteBuf>) buffer; return addComponents0(cIndex, composite); } int readableBytes = buffer.readableBytes(); if (readableBytes == 0) { return cIndex; } // No need to consolidate - just add a component to the list. Component c = new Component(buffer.order(ByteOrder.BIG_ENDIAN).slice(), addedBySelf); if (cIndex == components.size()) { components.add(c); if (cIndex == 0) { c.endOffset = readableBytes; } else { Component prev = components.get(cIndex - 1); c.offset = prev.endOffset; c.endOffset = c.offset + readableBytes; } } else { components.add(cIndex, c); updateComponentOffsets(cIndex); } return cIndex; }
@Override public void addComponent(int cIndex, ByteBuf buffer) { checkComponentIndex(cIndex); if (buffer == null) { throw new NullPointerException("buffer"); } if (buffer instanceof Iterable) { @SuppressWarnings("unchecked") Iterable<ByteBuf> composite = (Iterable<ByteBuf>) buffer; addComponents(cIndex, composite); return; } int readableBytes = buffer.readableBytes(); if (readableBytes == 0) { return; } // Consolidate if the number of components will exceed the allowed maximum by the current // operation. final int numComponents = components.size(); if (numComponents >= maxNumComponents) { final int capacity = components.get(numComponents - 1).endOffset + readableBytes; ByteBuf consolidated = buffer.unsafe().newBuffer(capacity); for (int i = 0; i < numComponents; i++) { ByteBuf b = components.get(i).buf; consolidated.writeBytes(b); b.unsafe().release(); } consolidated.writeBytes(buffer, buffer.readerIndex(), readableBytes); Component c = new Component(consolidated); c.endOffset = c.length; components.clear(); components.add(c); return; } // No need to consolidate - just add a component to the list. Component c = new Component(buffer.order(ByteOrder.BIG_ENDIAN).slice()); if (cIndex == components.size()) { components.add(c); if (cIndex == 0) { c.endOffset = readableBytes; } else { Component prev = components.get(cIndex - 1); c.offset = prev.endOffset; c.endOffset = c.offset + readableBytes; } } else { components.add(cIndex, c); updateComponentOffsets(cIndex); } }
/** * Creates a new buffer whose content is a merged copy of the specified {@code buffers}' readable * bytes. The new buffer's {@code readerIndex} and {@code writerIndex} are {@code 0} and the sum * of all buffers' {@code readableBytes} respectively. * * @throws IllegalArgumentException if the specified buffers' endianness are different from each * other */ public static ByteBuf copiedBuffer(ByteBuf... buffers) { switch (buffers.length) { case 0: return EMPTY_BUFFER; case 1: return copiedBuffer(buffers[0]); } // Merge the specified buffers into one buffer. ByteOrder order = null; int length = 0; for (ByteBuf b : buffers) { int bLen = b.readableBytes(); if (bLen <= 0) { continue; } if (Integer.MAX_VALUE - length < bLen) { throw new IllegalArgumentException("The total length of the specified buffers is too big."); } length += bLen; if (order != null) { if (!order.equals(b.order())) { throw new IllegalArgumentException("inconsistent byte order"); } } else { order = b.order(); } } if (length == 0) { return EMPTY_BUFFER; } byte[] mergedArray = new byte[length]; for (int i = 0, j = 0; i < buffers.length; i++) { ByteBuf b = buffers[i]; int bLen = b.readableBytes(); b.getBytes(b.readerIndex(), mergedArray, j, bLen); j += bLen; } return wrappedBuffer(mergedArray).order(order); }
@Test public void shouldForwardReadCallsBlindly() throws Exception { ByteBuf buf = createStrictMock(ByteBuf.class); expect(buf.order()).andReturn(BIG_ENDIAN).anyTimes(); expect(buf.maxCapacity()).andReturn(65536).anyTimes(); expect(buf.readerIndex()).andReturn(0).anyTimes(); expect(buf.writerIndex()).andReturn(0).anyTimes(); expect(buf.capacity()).andReturn(0).anyTimes(); expect(buf.getBytes(1, (GatheringByteChannel) null, 2)).andReturn(3); expect(buf.getBytes(4, (OutputStream) null, 5)).andReturn(buf); expect(buf.getBytes(6, (byte[]) null, 7, 8)).andReturn(buf); expect(buf.getBytes(9, (ByteBuf) null, 10, 11)).andReturn(buf); expect(buf.getBytes(12, (ByteBuffer) null)).andReturn(buf); expect(buf.getByte(13)).andReturn(Byte.valueOf((byte) 14)); expect(buf.getShort(15)).andReturn(Short.valueOf((short) 16)); expect(buf.getUnsignedMedium(17)).andReturn(18); expect(buf.getInt(19)).andReturn(20); expect(buf.getLong(21)).andReturn(22L); ByteBuffer bb = ByteBuffer.allocate(100); expect(buf.nioBuffer(23, 24)).andReturn(bb); expect(buf.capacity()).andReturn(27); replay(buf); ByteBuf roBuf = unmodifiableBuffer(buf); assertEquals(3, roBuf.getBytes(1, (GatheringByteChannel) null, 2)); roBuf.getBytes(4, (OutputStream) null, 5); roBuf.getBytes(6, (byte[]) null, 7, 8); roBuf.getBytes(9, (ByteBuf) null, 10, 11); roBuf.getBytes(12, (ByteBuffer) null); assertEquals((byte) 14, roBuf.getByte(13)); assertEquals((short) 16, roBuf.getShort(15)); assertEquals(18, roBuf.getUnsignedMedium(17)); assertEquals(20, roBuf.getInt(19)); assertEquals(22L, roBuf.getLong(21)); ByteBuffer roBB = roBuf.nioBuffer(23, 24); assertEquals(100, roBB.capacity()); assertTrue(roBB.isReadOnly()); assertEquals(27, roBuf.capacity()); verify(buf); }
@Override public ByteBuf order(ByteOrder endianness) { return buf.order(endianness); }
@Override public ByteOrder order() { return buf.order(); }