package com.aionemu.packetsamurai.session.packetbuffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import com.aionemu.packetsamurai.protocol.Protocol; /** * @author Ulysses R. Ribeiro * */ public class DefaultPacketBuffer implements PacketBuffer { public static final int BUFFER_SIZE = 65536; private ByteBuffer _buffer; public DefaultPacketBuffer() { _buffer = ByteBuffer.allocate(BUFFER_SIZE); _buffer.order(ByteOrder.LITTLE_ENDIAN); } public int nextAvaliablePacket() { //System.out.println("PacketBuffer : availablePacket : avaiableBytes: "+_availableBytes); //if there isnt bytes enough for a header if (_buffer.position() < 2) { return 0; } int size = (_buffer.getShort(0) & 0xFFFF); //System.out.println("PacketBuffer : availablePacket : size: "+size); //header but no data ? consume the header if (size == 2) { // just reset the pos to get it overwritten _buffer.position(0); return 0; //System.out.println("PacketBuffer : availablePacket : consumed 2 bytes of useless header"); } // if size is greater then avaliable bytes else if (size > _buffer.position()) { //System.out.println("PacketBuffer : availablePacket : not enough data available"); return 0; } //System.out.println("PacketBuffer : availablePacket : available :"+size); return size-2; } public void getNextPacket(byte[] header, byte[] data) { _buffer.limit(_buffer.position()); //rewind it so we can get the very first packet in buffer _buffer.position(0); //get the packet header _buffer.get(header); //Get packet data _buffer.get(data); //System.out.println("PacketBuffer : newtPacket : returned one packet size="+(data.length + header.length)); //System.out.println("PacketBuffer : newtPacket : mark:"+mark); //compact the buffer _buffer.compact(); //System.out.println("PacketBuffer : newtPacket : wants to position to :"+(mark - (data.length + header.length))+" and limit : "+_buffer.limit()); } public void addData(byte[] data) { _buffer.put(data); } public void setProtocol(Protocol p) { // no use here } }