package org.ripple.power.server.chat;
import java.util.List;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
public class ByteMesDecoder extends ByteToMessageDecoder {
private IMessageRecognizer messageRecognizer;
public ByteMesDecoder(IMessageRecognizer messageRecognizer) {
this.messageRecognizer = messageRecognizer;
}
@Override
protected void decode(ChannelHandlerContext chx, ByteBuf in,
List<Object> out) throws Exception {
if (in.readableBytes() < 6) {
return;
}
in.markReaderIndex();
int expectLen = in.getInt(in.readerIndex());
int buffCurLen = in.readableBytes();
if (buffCurLen < expectLen) {
in.resetWriterIndex();
return;
}
int msgLen = in.readInt();
short msgType = in.readShort();
AMessage msg = messageRecognizer.createMessage(msgType);
if (msg == null) {
int msgContentLen = msgLen - 6;
if (0 < msgContentLen) {
in.readBytes(msgContentLen);
}
return;
}
msg.setByteBuf(in);
msg.read();
out.add(msg);
}
}