/*
* This file is part of LanternServer, licensed under the MIT License (MIT).
*
* Copyright (c) LanternPowered <https://www.lanternpowered.org>
* Copyright (c) SpongePowered <https://www.spongepowered.org>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the Software), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.lanternpowered.server.network.buffer;
import io.netty.handler.codec.DecoderException;
import io.netty.util.ReferenceCounted;
import org.lanternpowered.server.network.buffer.objects.Type;
import org.spongepowered.api.data.DataView;
import org.spongepowered.api.network.ChannelBuf;
import java.io.IOException;
import java.nio.ByteOrder;
import java.util.UUID;
import javax.annotation.Nullable;
public interface ByteBuffer extends ChannelBuf, ReferenceCounted {
@Override
ByteBuffer retain();
@Override
ByteBuffer retain(int increment);
@Override
ByteBuffer touch();
@Override
ByteBuffer touch(Object hint);
@Override
ByteBuffer order(ByteOrder order);
@Override
ByteBuffer setReadIndex(int index);
@Override
ByteBuffer setWriteIndex(int index);
@Override
ByteBuffer setIndex(int readIndex, int writeIndex);
@Override
ByteBuffer clear();
@Override
ByteBuffer markRead();
@Override
ByteBuffer markWrite();
@Override
ByteBuffer resetRead();
@Override
ByteBuffer resetWrite();
@Override
ByteBuffer slice();
@Override
ByteBuffer slice(int index, int length);
@Override
ByteBuffer writeBoolean(boolean data);
@Override
ByteBuffer setBoolean(int index, boolean data);
@Override
ByteBuffer writeByte(byte data);
@Override
ByteBuffer setByte(int index, byte data);
/**
* Reads a byte array and checks whether the length isn't
* longer then the specified maximum length.
*
* @param maxLength The maximum length
* @return The byte array
* @throws DecoderException If the length of the byte
* array exceeded the specified maximum length
*/
byte[] readLimitedByteArray(int maxLength) throws DecoderException;
@Override
ByteBuffer writeByteArray(byte[] data);
@Override
ByteBuffer writeByteArray(byte[] data, int start, int length);
@Override
ByteBuffer setByteArray(int index, byte[] data);
@Override
ByteBuffer setByteArray(int index, byte[] data, int start, int length);
@Override
ByteBuffer writeBytes(byte[] data);
@Override
ByteBuffer writeBytes(byte[] data, int start, int length);
@Override
ByteBuffer setBytes(int index, byte[] data);
@Override
ByteBuffer setBytes(int index, byte[] data, int start, int length);
@Override
ByteBuffer writeShort(short data);
@Override
ByteBuffer setShort(int index, short data);
@Override
ByteBuffer writeChar(char data);
@Override
ByteBuffer setChar(int index, char data);
@Override
ByteBuffer writeInteger(int data);
@Override
ByteBuffer setInteger(int index, int data);
@Override
ByteBuffer writeLong(long data);
@Override
ByteBuffer setLong(int index, long data);
@Override
ByteBuffer writeFloat(float data);
@Override
ByteBuffer setFloat(int index, float data);
@Override
ByteBuffer writeDouble(double data);
@Override
ByteBuffer setDouble(int index, double data);
@Override
ByteBuffer writeVarInt(int value);
@Override
ByteBuffer setVarInt(int index, int value);
/**
* Reads a string and checks whether the length isn't longer
* then the specified maximum length.
*
* @param maxLength The maximum length
* @return The byte array
* @throws DecoderException If the length of the byte
* array exceeded the specified maximum length
*/
String readLimitedString(int maxLength) throws DecoderException;
@Override
ByteBuffer writeString(String data);
@Override
ByteBuffer setString(int index, String data);
@Override
ByteBuffer writeUTF(String data);
@Override
ByteBuffer setUTF(int index, String data);
@Override
ByteBuffer writeUniqueId(UUID data);
@Override
ByteBuffer setUniqueId(int index, UUID data);
@Override
ByteBuffer writeDataView(@Nullable DataView data);
@Override
ByteBuffer setDataView(int index, @Nullable DataView data);
/**
* Reads a {@link DataView} and checks whether the depth of the underlying
* tree doesn't get bigger then the specified maximum depth and is not bigger
* then the maximum amount of bytes.
*
* @param maxDepth The maximum depth
* @param maxBytes The maximum amount of bytes
* @return The data view
* @throws IOException If the depth exceeded the maximum depth or
* if the size exceeded the maximum bytes
*/
@Nullable
DataView readLimitedDataView(int maxDepth, int maxBytes);
@Nullable
@Override
DataView readDataView();
@Nullable
@Override
DataView getDataView(int index);
ByteBuffer writeBytes(ByteBuffer byteBuffer);
/**
* Transfers this buffer's data to the specified byte array, starting
* from the current readerIndex. Transferring until either this buffer
* is at the end of the reader index or the specified array is filled.
*
* @param dst The destination byte array
* @return This stream for chaining
*/
ByteBuffer readBytes(byte[] dst);
ByteBuffer readBytes(byte[] dst, int dstIndex, int length);
/**
* Transfers this buffer's data to the specified byte buffer, starting
* from the current readerIndex.
*
* @param byteBuffer The target byte buffer
* @return This stream for chaining
*/
ByteBuffer readBytes(ByteBuffer byteBuffer);
ByteBuffer readBytes(ByteBuffer dst, int dstIndex, int length);
/**
* Sets the specified varlong at the current writerIndex and increases the
* writerIndex by the number of bytes written.
*
* <p>The number of bytes written depends on the size of the value.</p>
*
* @param value The varlong value
* @return This stream for chaining
*/
ByteBuffer writeVarLong(long value);
/**
* Sets the specified varlong at the specified absolute index in this buffer.
* This method does not modify readerIndex or writerIndex of this buffer.
*
* <p>The number of bytes written depends on the size of the value.</p>
*
* @param index The index
* @param value The varlong value
* @return This stream for chaining
*/
ByteBuffer setVarLong(int index, long value);
/**
* Gets a varlong at the current readerIndex and increases the readerIndex by
* the number of bytes read.
*
* <p>The number of bytes read depends on the size of the value.</p>
*
* @return The varlong value
*/
long readVarLong();
/**
* Gets a varlong at the specified absolute index in this buffer.
*
* <p>The number of bytes read depends on the size of the value.</p>
*
* @param index The index
* @return The varlong value
*/
long getVarLong(int index);
/**
* Writes the specified value for the {@link Type}.
*
* @param type The type
* @param value The value
* @param <V> The value type
* @return This stream for chaining
*/
<V> ByteBuffer write(Type<V> type, @Nullable V value);
<V> ByteBuffer set(int index, Type<V> type, @Nullable V value);
<V> V read(Type<V> type);
<V> V get(int index, Type<V> type);
/**
* Makes sure the number of the writable bytes is equal to
* or greater than the specified value.
*
* @param minWritableBytes The minimum writable bytes
* @return This stream for chaining
*/
ByteBuffer ensureWritable(int minWritableBytes);
ByteBuffer copy();
}