package com.netifera.platform.net.packets;
import java.nio.ByteBuffer;
public class PacketPayload implements IPacketHeader {
public static final PacketPayload EMPTY_PAYLOAD = new PacketPayload(ByteBuffer.allocate(0).asReadOnlyBuffer());
//static private final HexDump hexdump = new HexDump();
private IPacketHeader previousHeader;
static public PacketPayload emptyPayload() {
return EMPTY_PAYLOAD;
}
private ByteBuffer payloadBuffer;
/*
public PacketPayload() {
// XXX NPE this.payloadBuffer.*
}
*/
public PacketPayload(ByteBuffer buffer) {
this.payloadBuffer = buffer;
}
public PacketPayload payload() {
return this;
}
public int getHeaderLength() {
return payloadBuffer.limit();
}
public int getLength() {
return payloadBuffer.limit();
}
public IPacketHeader getPreviousHeader() {
return previousHeader;
}
public IPacketHeader getNextHeader() {
return null;
}
public int getNextProtocol() {
return -1;
}
public boolean pack(ByteBuffer buffer) {
payloadBuffer.rewind();
if(buffer.remaining() < payloadBuffer.limit()) {
return false;
}
buffer.put(payloadBuffer);
return true;
}
public boolean unpack(ByteBuffer buffer) {
payloadBuffer = buffer;
return true;
}
public String print() {
return toString();
}
public void persist() {
ByteBuffer tmp = ByteBuffer.allocate(payloadBuffer.limit());
payloadBuffer.rewind();
tmp.put(payloadBuffer);
payloadBuffer = tmp;
}
@Override
public String toString() {
return "Payload (" + payloadBuffer.limit() + " bytes)";// + hexdump.bufferDump(payloadBuffer.slice());
}
public ByteBuffer toByteBuffer() {
return payloadBuffer.duplicate();
}
public byte[] toBytes() {
ByteBuffer buffer = toByteBuffer();
byte[] answer = new byte[buffer.limit()];
buffer.get(answer);
return answer;
}
public IPacketHeader findHeader(Class<? extends IPacketHeader> packetClass) {
if (packetClass.isInstance(this)) return this;
return null;
}
public void setPreviousPacket(IPacketHeader packet) {
previousHeader = packet;
}
public void setNextPacket(IPacketHeader packet) {
throw new IllegalArgumentException("Cannot call setNextPacket() on PacketPayload");
}
}