All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tencent.trpc.transport.netty.NettyChannelBuffer Maven / Gradle / Ivy

/*
 * Tencent is pleased to support the open source community by making tRPC available.
 *
 * Copyright (C) 2023 THL A29 Limited, a Tencent company. 
 * All rights reserved.
 *
 * If you have downloaded a copy of the tRPC source code from Tencent,
 * please note that tRPC source code is licensed under the Apache 2.0 License,
 * A copy of the Apache 2.0 License can be found in the LICENSE file.
 */

package com.tencent.trpc.transport.netty;

import com.google.common.base.Preconditions;
import com.tencent.trpc.core.transport.codec.ChannelBuffer;
import io.netty.buffer.ByteBuf;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;

/**
 * Encapsulating Netty's buffer.
 */
public class NettyChannelBuffer extends ChannelBuffer {

    private final ByteBuf ioBuffer;

    public NettyChannelBuffer(ByteBuf ioBuffer) {
        Preconditions.checkArgument(ioBuffer != null, "buffer == null");
        this.ioBuffer = ioBuffer;
    }

    @Override
    public int capacity() {
        return ioBuffer.capacity();
    }

    @Override
    public ChannelBuffer capacity(int newCapacity) {
        ioBuffer.capacity(newCapacity);
        return this;
    }

    @Override
    public int maxCapacity() {
        return ioBuffer.maxCapacity();
    }

    @Override
    public boolean isDirect() {
        return ioBuffer.isDirect();
    }

    @Override
    public boolean isReadOnly() {
        return ioBuffer.isReadOnly();
    }

    @Override
    public ChannelBuffer asReadOnly() {
        return new NettyChannelBuffer(ioBuffer.asReadOnly());
    }

    @Override
    public int readerIndex() {
        return ioBuffer.readerIndex();
    }

    @Override
    public ChannelBuffer readerIndex(int readerIndex) {
        ioBuffer.readerIndex(readerIndex);
        return this;
    }

    @Override
    public int writerIndex() {
        return ioBuffer.writerIndex();
    }

    @Override
    public ChannelBuffer writerIndex(int writerIndex) {
        ioBuffer.writerIndex(writerIndex);
        return this;
    }

    @Override
    public ChannelBuffer setIndex(int readerIndex, int writerIndex) {
        ioBuffer.setIndex(readerIndex, writerIndex);
        return this;
    }

    @Override
    public int readableBytes() {
        return ioBuffer.readableBytes();
    }

    @Override
    public int writableBytes() {
        return ioBuffer.writableBytes();
    }

    @Override
    public int maxWritableBytes() {
        return ioBuffer.maxWritableBytes();
    }

    @Override
    public boolean isReadable() {
        return ioBuffer.isReadable();
    }

    @Override
    public boolean isReadable(int size) {
        return ioBuffer.isReadable(size);
    }

    @Override
    public boolean isWritable() {
        return ioBuffer.isWritable();
    }

    @Override
    public boolean isWritable(int size) {
        return ioBuffer.isWritable(size);
    }

    @Override
    public ChannelBuffer clear() {
        ioBuffer.clear();
        return this;
    }

    @Override
    public ChannelBuffer markReaderIndex() {
        ioBuffer.markReaderIndex();
        return this;
    }

    @Override
    public ChannelBuffer resetReaderIndex() {
        ioBuffer.resetReaderIndex();
        return this;
    }

    @Override
    public ChannelBuffer markWriterIndex() {
        ioBuffer.markWriterIndex();
        return this;
    }

    @Override
    public ChannelBuffer resetWriterIndex() {
        ioBuffer.resetWriterIndex();
        return this;
    }

    @Override
    public ChannelBuffer discardReadBytes() {
        ioBuffer.discardReadBytes();
        return this;
    }

    public ChannelBuffer ensureWritable(int minWritableBytes) {
        ioBuffer.ensureWritable(minWritableBytes);
        return this;
    }

    @Override
    public boolean getBoolean(int index) {
        return ioBuffer.getBoolean(index);
    }

    @Override
    public byte getByte(int index) {
        return ioBuffer.getByte(index);
    }

    @Override
    public short getUnsignedByte(int index) {
        return ioBuffer.getUnsignedByte(index);
    }

    @Override
    public short getShort(int index) {
        return ioBuffer.getShort(index);
    }

    @Override
    public short getShortLE(int index) {
        return ioBuffer.getShortLE(index);
    }

    @Override
    public int getUnsignedShort(int index) {
        return ioBuffer.getUnsignedShort(index);
    }

    @Override
    public int getUnsignedShortLE(int index) {
        return ioBuffer.getUnsignedShortLE(index);
    }

    @Override
    public int getInt(int index) {
        return ioBuffer.getInt(index);
    }

    @Override
    public int getIntLE(int index) {
        return ioBuffer.getIntLE(index);
    }

    @Override
    public long getUnsignedInt(int index) {
        return ioBuffer.getUnsignedInt(index);
    }

    @Override
    public long getUnsignedIntLE(int index) {
        return ioBuffer.getUnsignedIntLE(index);
    }

    @Override
    public long getLong(int index) {
        return ioBuffer.getLong(index);
    }

    @Override
    public long getLongLE(int index) {
        return ioBuffer.getLongLE(index);
    }

    @Override
    public char getChar(int index) {
        return ioBuffer.getChar(index);
    }

    @Override
    public float getFloat(int index) {
        return ioBuffer.getFloat(index);
    }

    @Override
    public double getDouble(int index) {
        return ioBuffer.getDouble(index);
    }

    @Override
    public ChannelBuffer getBytes(int index, ChannelBuffer dst) {
        getBytes(index, dst, dst.writableBytes());
        return this;
    }

    @Override
    public ChannelBuffer getBytes(int index, ChannelBuffer dst, int length) {
        if (length > dst.writableBytes()) {
            throw new IndexOutOfBoundsException();
        }
        getBytes(index, dst, dst.writerIndex(), length);
        dst.writerIndex(dst.writerIndex() + length);
        return this;
    }

    @Override
    public ChannelBuffer getBytes(int index, ChannelBuffer dst, int dstIndex, int length) {
        byte[] data = new byte[length];
        ioBuffer.getBytes(index, data, 0, length);
        dst.setBytes(dstIndex, data, 0, length);
        return this;
    }

    @Override
    public ChannelBuffer getBytes(int index, byte[] dst) {
        ioBuffer.getBytes(index, dst);
        return this;
    }

    @Override
    public ChannelBuffer getBytes(int index, byte[] dst, int dstIndex, int length) {
        ioBuffer.getBytes(index, dst, dstIndex, length);
        return this;
    }

    @Override
    public ChannelBuffer getBytes(int index, ByteBuffer dst) {
        ioBuffer.getBytes(index, dst);
        return this;
    }

    @Override
    public ChannelBuffer getBytes(int index, OutputStream out, int length) throws IOException {
        ioBuffer.getBytes(index, out, length);
        return this;
    }

    @Override
    public CharSequence getCharSequence(int index, int length, Charset charset) {
        return ioBuffer.getCharSequence(index, length, charset);
    }

    @Override
    public ChannelBuffer setBoolean(int index, boolean value) {
        ioBuffer.setBoolean(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setByte(int index, int value) {
        ioBuffer.setByte(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setShort(int index, int value) {
        ioBuffer.setShort(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setShortLE(int index, int value) {
        ioBuffer.setShortLE(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setInt(int index, int value) {
        ioBuffer.setInt(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setIntLE(int index, int value) {
        ioBuffer.setIntLE(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setLong(int index, long value) {
        ioBuffer.setLong(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setLongLE(int index, long value) {
        ioBuffer.setLongLE(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setChar(int index, int value) {
        ioBuffer.setChar(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setFloat(int index, float value) {
        ioBuffer.setFloat(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setDouble(int index, double value) {
        ioBuffer.setDouble(index, value);
        return this;
    }

    @Override
    public ChannelBuffer setBytes(int index, ChannelBuffer src) {
        setBytes(index, src, src.readableBytes());
        return this;
    }

    @Override
    public ChannelBuffer setBytes(int index, ChannelBuffer src, int length) {
        int readableBytes = src.readableBytes();
        if (length > readableBytes) {
            throw new IndexOutOfBoundsException(
                    "src readableBytes[" + readableBytes + "] < " + length);
        }
        setBytes(index, src, src.readerIndex(), length);
        src.readerIndex(src.readerIndex() + length);
        return this;
    }

    @Override
    public ChannelBuffer setBytes(int index, ChannelBuffer src, int srcIndex, int length) {
        byte[] data = new byte[length];
        src.getBytes(srcIndex, data, 0, length);
        setBytes(index, data, 0, length);
        return this;
    }

    @Override
    public ChannelBuffer setBytes(int index, byte[] src) {
        ioBuffer.setBytes(index, src);
        return this;
    }

    @Override
    public ChannelBuffer setBytes(int index, byte[] src, int srcIndex, int length) {
        ioBuffer.setBytes(index, src, srcIndex, length);
        return this;
    }

    @Override
    public ChannelBuffer setBytes(int index, ByteBuffer src) {
        ioBuffer.setBytes(index, src);
        return this;
    }

    @Override
    public int setBytes(int index, InputStream in, int length) throws IOException {
        return ioBuffer.setBytes(index, in, length);
    }

    @Override
    public int setCharSequence(int index, CharSequence sequence, Charset charset) {
        return ioBuffer.setCharSequence(index, sequence, charset);
    }

    @Override
    public boolean readBoolean() {
        return ioBuffer.readBoolean();
    }

    @Override
    public byte readByte() {
        return ioBuffer.readByte();
    }

    @Override
    public short readUnsignedByte() {
        return ioBuffer.readUnsignedByte();
    }

    @Override
    public short readShort() {
        return ioBuffer.readShort();
    }

    @Override
    public short readShortLE() {
        return ioBuffer.readShortLE();
    }

    @Override
    public int readUnsignedShort() {
        return ioBuffer.readUnsignedShort();
    }

    @Override
    public int readUnsignedShortLE() {
        return ioBuffer.readUnsignedShortLE();
    }

    @Override
    public int readInt() {
        return ioBuffer.readInt();
    }

    @Override
    public int readIntLE() {
        return ioBuffer.readIntLE();
    }

    @Override
    public long readUnsignedInt() {
        return ioBuffer.readUnsignedInt();
    }

    @Override
    public long readUnsignedIntLE() {
        return ioBuffer.readUnsignedIntLE();
    }

    @Override
    public long readLong() {
        return ioBuffer.readLong();
    }

    @Override
    public long readLongLE() {
        return ioBuffer.readLongLE();
    }

    @Override
    public char readChar() {
        return ioBuffer.readChar();
    }

    @Override
    public float readFloat() {
        return ioBuffer.readFloat();
    }

    @Override
    public double readDouble() {
        return ioBuffer.readDouble();
    }

    @Override
    public ChannelBuffer readBytes(int length) {
        return new NettyChannelBuffer(ioBuffer.readBytes(length));
    }

    @Override
    public ChannelBuffer readBytes(ChannelBuffer dst) {
        // Note: The semantics of Netty's readBytes method for ByteBuf is to fill the destination ByteBuf (dst)
        // with data from the source ByteBuf (src) until there is no more space to write in dst.
        // It reads data from the current ByteBuf's readerIndex until the target ByteBuf has no more writable space,
        // and writes the data starting from the target ByteBuf's writeIndex. After reading, the current ByteBuf's
        // readerIndex is incremented by the number of bytes read, and the target ByteBuf's writeIndex is incremented
        // by the number of bytes read.
        // It is not recommended to use this method, and it is recommended to use readBytes(dst, src.readableBytes())
        // instead.
        readBytes(dst, dst.writableBytes());
        return this;
    }

    @Override
    public ChannelBuffer readBytes(ChannelBuffer dst, int length) {
        if (length > dst.writableBytes()) {
            throw new IndexOutOfBoundsException();
        }
        readBytes(dst, dst.writerIndex(), length);
        dst.writerIndex(dst.writerIndex() + length);
        return this;
    }

    @Override
    public ChannelBuffer readBytes(ChannelBuffer dst, int dstIndex, int length) {
        if (readableBytes() < length) {
            throw new IndexOutOfBoundsException();
        }
        byte[] data = new byte[length];
        ioBuffer.readBytes(data, 0, length);
        dst.setBytes(dstIndex, data, 0, length);
        return this;
    }

    @Override
    public ChannelBuffer readBytes(byte[] dst) {
        ioBuffer.readBytes(dst);
        return this;
    }

    @Override
    public ChannelBuffer readBytes(byte[] dst, int dstIndex, int length) {
        ioBuffer.readBytes(dst, dstIndex, length);
        return this;
    }

    @Override
    public ChannelBuffer readBytes(ByteBuffer dst) {
        ioBuffer.readBytes(dst);
        return this;
    }

    @Override
    public ChannelBuffer readBytes(OutputStream out, int length) throws IOException {
        ioBuffer.readBytes(out, length);
        return this;
    }

    @Override
    public CharSequence readCharSequence(int length, Charset charset) {
        return ioBuffer.readCharSequence(length, charset);
    }

    @Override
    public ChannelBuffer skipBytes(int length) {
        ioBuffer.skipBytes(length);
        return this;
    }

    @Override
    public ChannelBuffer writeBoolean(boolean value) {
        ioBuffer.writeBoolean(value);
        return this;
    }

    @Override
    public ChannelBuffer writeByte(int value) {
        ioBuffer.writeByte(value);
        return this;
    }

    @Override
    public ChannelBuffer writeShort(int value) {
        ioBuffer.writeShort(value);
        return this;
    }

    @Override
    public ChannelBuffer writeShortLE(int value) {
        ioBuffer.writeShortLE(value);
        return this;
    }

    @Override
    public ChannelBuffer writeInt(int value) {
        ioBuffer.writeInt(value);
        return this;
    }

    @Override
    public ChannelBuffer writeIntLE(int value) {
        ioBuffer.writeIntLE(value);
        return this;
    }

    @Override
    public ChannelBuffer writeLong(long value) {
        ioBuffer.writeLong(value);
        return this;
    }

    @Override
    public ChannelBuffer writeLongLE(long value) {
        ioBuffer.writeLongLE(value);
        return this;
    }

    @Override
    public ChannelBuffer writeChar(int value) {
        ioBuffer.writeChar(value);
        return this;
    }

    @Override
    public ChannelBuffer writeFloat(float value) {
        ioBuffer.writeFloat(value);
        return this;
    }

    @Override
    public ChannelBuffer writeDouble(double value) {
        ioBuffer.writeDouble(value);
        return this;
    }

    @Override
    public ChannelBuffer writeBytes(ChannelBuffer src) {
        writeBytes(src, src.readableBytes());
        return this;
    }

    @Override
    public ChannelBuffer writeBytes(ChannelBuffer src, int length) {
        if (length > src.readableBytes()) {
            throw new IndexOutOfBoundsException();
        }
        writeBytes(src, src.readerIndex(), length);
        src.readerIndex(src.readerIndex() + length);
        return this;
    }

    @Override
    public ChannelBuffer writeBytes(ChannelBuffer src, int srcIndex, int length) {
        byte[] data = new byte[length];
        src.getBytes(srcIndex, data, 0, length);
        writeBytes(data, 0, length);
        return this;
    }

    @Override
    public ChannelBuffer writeBytes(byte[] src) {
        ioBuffer.writeBytes(src);
        return this;
    }

    @Override
    public ChannelBuffer writeBytes(byte[] src, int srcIndex, int length) {
        ioBuffer.writeBytes(src, srcIndex, length);
        return this;
    }

    @Override
    public ChannelBuffer writeBytes(ByteBuffer src) {
        ioBuffer.writeBytes(src);
        return this;
    }

    @Override
    public int writeBytes(InputStream in, int length) throws IOException {
        return ioBuffer.writeBytes(in, length);
    }

    @Override
    public int writeCharSequence(CharSequence sequence, Charset charset) {
        return ioBuffer.writeCharSequence(sequence, charset);
    }

    @Override
    public ChannelBuffer copy() {
        return new NettyChannelBuffer(ioBuffer.copy());
    }

    @Override
    public ChannelBuffer copy(int index, int length) {
        return new NettyChannelBuffer(ioBuffer.copy(index, length));
    }

    @Override
    public ByteBuffer nioBuffer() {
        return ioBuffer.nioBuffer();
    }

    @Override
    public ByteBuffer nioBuffer(int index, int length) {
        return ioBuffer.nioBuffer(index, length);
    }

    @Override
    public boolean hasArray() {
        return ioBuffer.hasArray();
    }

    @Override
    public byte[] array() {
        return ioBuffer.array();
    }

    @Override
    public int arrayOffset() {
        return ioBuffer.arrayOffset();
    }

    @Override
    public int compareTo(ChannelBuffer target) {
        ChannelBuffer bufferA = this;
        ChannelBuffer bufferB = target;
        final int aLen = bufferA.readableBytes();
        final int bLen = bufferB.readableBytes();
        final int minLength = Math.min(aLen, bLen);

        int aIndex = bufferA.readerIndex();
        int bIndex = bufferB.readerIndex();

        for (int i = minLength; i > 0; i--) {
            byte va = bufferA.getByte(aIndex);
            byte vb = bufferB.getByte(bIndex);
            if (va > vb) {
                return 1;
            } else if (va < vb) {
                return -1;
            }
            aIndex++;
            bIndex++;
        }
        return aLen - bLen;
    }

    @Override
    public String toString() {
        return ioBuffer.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy