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 MultiProtocol extends SOEMessage { private Vector<SOEMessage> messages; private Vector<SWGMessage> messages2; private Vector<IoBuffer> swgMessages; public Vector<SOEMessage> Sequencedmessages; private short sequencedMessageCount = 0; public MultiProtocol(SimpleBufferAllocator bufferPool) { this.bufferPool = bufferPool; } public MultiProtocol(IoBuffer data) { super(data); } public boolean addMessage(SOEMessage message) { int messageLength; if (messages == null) messages = new Vector<SOEMessage>(); if (messages.size() > 0) { messageLength = message.getSize(); if (messageLength + 1 > getRemainingSize()) return false; } messages.add(message); if(message instanceof ISequenced){ sequencedMessageCount ++; } for (int i = 0; i < messages.size(); i++) { if(messages.get(i) instanceof ISequenced) { if(Sequencedmessages == null) { Sequencedmessages = new Vector<SOEMessage>(); Sequencedmessages.add(messages.get(i)); } else { Sequencedmessages.add(messages.get(i)); } } } return true; } public boolean addMessage(SWGMessage message) { int messageLength; if (messages == null) messages2 = new Vector<SWGMessage>(); if (messages2.size() > 0) { messageLength = message.getSize(); if (messageLength + 1 > getRemainingSize()) return false; } messages2.add(message); return true; } public boolean addSWGMessage(IoBuffer message) { if(swgMessages == null) swgMessages = new Vector<IoBuffer>(); int messageLength = message.array().length; if(messageLength + 1 > getRemainingSize()) return false; swgMessages.add(message); return true; } public Vector<SOEMessage> getSequencedmessages() { return Sequencedmessages; } public short getSequencedMessageCount() { return sequencedMessageCount; } public void deserialize(IoBuffer buffer) { // TODO: Implement This. } @Override public IoBuffer serialize() { if (swgMessages.size() == 0) return IoBuffer.allocate(0); IoBuffer message = bufferPool.allocate(getMessagesSize(), false); message.putShort((short)3); for(IoBuffer swgMsg : swgMessages) { byte[] packet = swgMsg.array(); int length = packet.length; message.put((byte) length); message.put(packet); } return message.flip(); } public int getMessagesSize() { int size = 2; for(IoBuffer swgMsg : swgMessages) { byte[] packet = swgMsg.array(); int length = packet.length; size += length + 1; } return size; } public IoBuffer[] getMessages() { Vector<IoBuffer> msgs = new Vector<IoBuffer>(); IoBuffer buffer = data; buffer.position(2); while (buffer.position() < buffer.limit()) { short length = (short)(buffer.get() & 0xFF); if (length == 255) length = buffer.getShort(); //if (length > Utilities.getActiveLengthOfBuffer(buffer) - buffer.position()) // break; if (buffer.remaining() < length || !buffer.hasArray()) break; if(length < 0) break; IoBuffer packet = IoBuffer.allocate(length); packet.setAutoExpand(true); packet.put(buffer.array(), buffer.position(), length); packet.flip(); //System.out.println("RECV: "+ packet.getHexDump()); msgs.add(packet); buffer.position(buffer.position() + length); } IoBuffer [] tmp = new IoBuffer[msgs.size()]; msgs.toArray(tmp); return tmp; } public boolean hasMessages() { return swgMessages != null && swgMessages.size() > 0; } public byte[] GetData() { return null; } private int getRemainingSize() { return 493 - getSize(); } public int getSize() { int size = 2; // header int currentLength; for (int i = 0; i < swgMessages.size(); i++) { currentLength = swgMessages.get(i).array().length; size += currentLength + 1; } return size; } }