mirror of
https://github.com/2006-Scape/2006Scape.git
synced 2026-07-06 08:39:06 +00:00
83 lines
2.2 KiB
Java
83 lines
2.2 KiB
Java
package redone.net;
|
|
|
|
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;
|
|
|
|
public class RS2ProtocolEncoder implements ProtocolEncoder {
|
|
|
|
/**
|
|
* Only CodecFactory can create us.
|
|
*/
|
|
protected RS2ProtocolEncoder() {
|
|
}
|
|
|
|
@Override
|
|
/**
|
|
* Encodes a message.
|
|
* @param session
|
|
* @param message
|
|
* @param out
|
|
*/
|
|
public void encode(IoSession session, Object message,
|
|
ProtocolEncoderOutput out) throws Exception {
|
|
try {
|
|
synchronized (session) {
|
|
Packet p = (Packet) message;
|
|
byte[] data = p.getData();
|
|
int dataLength = p.getLength();
|
|
ByteBuffer buffer;
|
|
if (!p.isBare()) {
|
|
buffer = ByteBuffer.allocate(dataLength + 3);
|
|
int id = p.getId();
|
|
buffer.put((byte) id);
|
|
if (p.getSize() != Packet.Size.Fixed) { // variable length
|
|
// Logger.log("variable length: id="+id+",dataLength="+dataLength);
|
|
if (p.getSize() == Packet.Size.VariableByte) {
|
|
if (dataLength > 255) {
|
|
// then we can represent
|
|
// with 8 bits!
|
|
throw new IllegalArgumentException(
|
|
"Tried to send packet length "
|
|
+ dataLength
|
|
+ " in 8 bits [pid="
|
|
+ p.getId() + "]");
|
|
}
|
|
buffer.put((byte) dataLength);
|
|
} else if (p.getSize() == Packet.Size.VariableShort) {
|
|
if (dataLength > 65535) {
|
|
// then we can represent
|
|
// with 16 bits!
|
|
throw new IllegalArgumentException(
|
|
"Tried to send packet length "
|
|
+ dataLength
|
|
+ " in 16 bits [pid="
|
|
+ p.getId() + "]");
|
|
}
|
|
buffer.put((byte) (dataLength >> 8));
|
|
buffer.put((byte) dataLength);
|
|
}
|
|
}
|
|
} else {
|
|
buffer = ByteBuffer.allocate(dataLength);
|
|
}
|
|
buffer.put(data, 0, dataLength);
|
|
buffer.flip();
|
|
out.write(buffer);
|
|
}
|
|
} catch (Exception err) {
|
|
err.printStackTrace();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
/**
|
|
* Releases resources used by this encoder.
|
|
* @param session
|
|
*/
|
|
public void dispose(IoSession session) throws Exception {
|
|
}
|
|
|
|
}
|