package protocol.soe;
import java.nio.ByteBuffer;
import java.util.Vector;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.buffer.SimpleBufferAllocator;
import protocol.swg.SWGMessage;
public class FragmentedChannelA extends SOEMessage implements ICombinable, ISequenced {
private short sequence;
private int length;
public FragmentedChannelA(SimpleBufferAllocator bufferPool) {
this.bufferPool = bufferPool;
}
public FragmentedChannelA(IoBuffer data, SimpleBufferAllocator bufferPool) {
super(data);
if(data.array().length < 8)
return;
sequence = data.getShort(2);
length = data.getInt(4);
this.bufferPool = bufferPool;
}
public FragmentedChannelA[] create(SWGMessage message) {
return create(message.serialize().array());
}
public FragmentedChannelA [] create(byte [] message) {
ByteBuffer buffer = ByteBuffer.wrap(message);
Vector<FragmentedChannelA> fragChannelAs = new Vector<FragmentedChannelA>();
while (buffer.remaining() > 0)
fragChannelAs.add(createSegment(buffer));
return fragChannelAs.toArray(new FragmentedChannelA[fragChannelAs.size()]);
}
private FragmentedChannelA createSegment(ByteBuffer buffer) {
IoBuffer message = bufferPool.allocate(Math.min(buffer.remaining() + 4, 493), false);
message.putShort((short)13);
message.putShort((short)0);
if (buffer.position() == 0)
message.putInt(buffer.capacity());
byte[] messageData = new byte[message.remaining()];
buffer.get(messageData, 0, message.remaining());
message.put(messageData);
message.flip();
return new FragmentedChannelA(message, bufferPool);
}
@Override
public void deserialize(IoBuffer data) {
}
public int getSize() { return data.array().length; }
public short getSequence() { return sequence; }
public boolean isComplete() { return length == data.array().length; }
public int getOpcode() { return 0x0D; }
public void setSequence(short sequence) {
this.sequence = sequence;
}
@Override
public IoBuffer serialize() {
if(data.array().length < 2)
return data;
data.putShort(2, sequence);
return data;
}
}