85 lines
2.7 KiB
Java
85 lines
2.7 KiB
Java
package org.moparscape.msc.gs.connection;
|
|
|
|
import org.apache.mina.common.ByteBuffer;
|
|
import org.apache.mina.common.IoSession;
|
|
import org.apache.mina.filter.codec.ProtocolEncoder;
|
|
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
|
|
import org.moparscape.msc.gs.model.Player;
|
|
import org.moparscape.msc.gs.util.Logger;
|
|
|
|
|
|
/**
|
|
* Encodes the high level <code>RSCPacket</code> class into the proper protocol
|
|
* data required for transmission.
|
|
*/
|
|
public class RSCProtocolEncoder implements ProtocolEncoder {
|
|
/**
|
|
* Releases all resources used by this encoder.
|
|
*
|
|
* @param session
|
|
* The IO session
|
|
*/
|
|
public void dispose(IoSession session) {
|
|
}
|
|
|
|
/**
|
|
* Converts a <code>RSCPacket</code> object into the raw data needed for
|
|
* transmission.
|
|
*
|
|
* @param session
|
|
* The IO session associated with the packet
|
|
* @param message
|
|
* A <code>RSCPacket</code> to encode
|
|
* @param out
|
|
* The output stream to which to write the data
|
|
*/
|
|
public synchronized void encode(IoSession session, Object message, ProtocolEncoderOutput out) {
|
|
if (!(message instanceof RSCPacket)) {
|
|
Logger.error(new Exception("Wrong packet type! " + message.toString()));
|
|
return;
|
|
}
|
|
try {
|
|
RSCPacket p = (RSCPacket) message;
|
|
byte[] data = p.getData();
|
|
int dataLength = data.length;
|
|
ByteBuffer buffer;
|
|
// byte[] debug = new byte[dataLength + 4];
|
|
if (!p.isBare()) {
|
|
buffer = ByteBuffer.allocate(dataLength + 3);
|
|
byte[] outlen = { (byte) (dataLength >> 8), (byte) (dataLength) };
|
|
buffer.put(outlen);
|
|
// debug[0] = outlen[0]; debug[1] = outlen[1];
|
|
int id = p.getID();
|
|
// debug[2] = (byte)offset; debug[3] = (byte)id;
|
|
buffer.put((byte) id);
|
|
} else {
|
|
buffer = ByteBuffer.allocate(dataLength);
|
|
}
|
|
// System.arraycopy(data, 0, debug, 4, dataLength);
|
|
// Logging.debug(java.util.Arrays.toString(data));
|
|
buffer.put(data, 0, dataLength);
|
|
buffer.flip();
|
|
out.write(buffer);
|
|
return;
|
|
|
|
/*
|
|
* byte[] data = p.getData(); int packetLength = data.length; int
|
|
* dataLength = data.length; ByteBuffer buffer; if (!p.isBare()) {
|
|
* buffer = ByteBuffer.allocate(dataLength + 3); packetLength++; if
|
|
* (data.length >= 160) { buffer.put((byte) (160 + (packetLength /
|
|
* 256))); buffer.put((byte) (packetLength & 0xff)); } else {
|
|
* buffer.put((byte) (packetLength)); if (dataLength > 0) {
|
|
* dataLength--; buffer.put((byte) data[dataLength]); } }
|
|
* buffer.put((byte) p.getID()); } else { buffer =
|
|
* ByteBuffer.allocate(dataLength); } buffer.put(data, 0,
|
|
* dataLength); buffer.flip();
|
|
*
|
|
* out.write(buffer);
|
|
*/
|
|
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|