package org.infinispan.server.core.transport;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.CharsetUtil;
/**
* Static helper class that provides methods to be used with a {@link ByteBuf} that are useful for Infinispan.
*/
public class ExtendedByteBuf {
private ExtendedByteBuf() { }
public static ByteBuf wrappedBuffer(byte[]... arrays) {
return Unpooled.wrappedBuffer(arrays);
}
public static ByteBuf buffer(int capacity) {
return Unpooled.buffer(capacity);
}
public static ByteBuf dynamicBuffer() {
return Unpooled.buffer();
}
public static int readUnsignedShort(ByteBuf bf) {
return bf.readUnsignedShort();
}
public static int readUnsignedInt(ByteBuf bf) {
return VInt.read(bf);
}
public static long readUnsignedLong(ByteBuf bf) {
return VLong.read(bf);
}
public static byte[] readRangedBytes(ByteBuf bf) {
int length = readUnsignedInt(bf);
return readRangedBytes(bf, length);
}
public static byte[] readRangedBytes(ByteBuf bf, int length) {
if (length > 0) {
byte[] array = new byte[length];
bf.readBytes(array);
return array;
} else {
return new byte[0];
}
}
/**
* Reads length of String and then returns an UTF-8 formatted String of such length.
* If the length is 0, an empty String is returned.
*/
public static String readString(ByteBuf bf) {
byte[] bytes = readRangedBytes(bf);
return bytes.length > 0 ? new String(bytes, CharsetUtil.UTF_8) : "";
}
public static void writeUnsignedShort(int i, ByteBuf bf) {
bf.writeShort(i);
}
public static void writeUnsignedInt(int i, ByteBuf bf) {
VInt.write(bf, i);
}
public static void writeUnsignedLong(long l, ByteBuf bf) {
VLong.write(bf, l);
}
public static void writeRangedBytes(byte[] src, ByteBuf bf) {
writeUnsignedInt(src.length, bf);
if (src.length > 0)
bf.writeBytes(src);
}
public static void writeString(String msg, ByteBuf bf) {
writeRangedBytes(msg.getBytes(CharsetUtil.UTF_8), bf);
}
}