All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.zx.sms.codec.cmpp.CmppHeaderCodec Maven / Gradle / Ivy

There is a newer version: 2.1.13.6
Show newest version
package com.zx.sms.codec.cmpp;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.zx.sms.codec.cmpp.msg.DefaultHeader;
import com.zx.sms.codec.cmpp.msg.DefaultMessage;
import com.zx.sms.codec.cmpp.msg.Header;
import com.zx.sms.codec.cmpp.msg.Message;
import com.zx.sms.codec.cmpp.packet.CmppHead;
import com.zx.sms.common.GlobalConstance;

/**
 *
 * @author huzorro([email protected])
 * @author Lihuanghe([email protected])
 */
public class CmppHeaderCodec extends MessageToMessageCodec {
	private final Logger logger = LoggerFactory.getLogger(CmppHeaderCodec.class);

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List list) throws Exception {
		//此时已处理过粘包和断包了,bytebuf里是完整的一帧
		Header header = new DefaultHeader();
		header.setPacketLength(bytebuf.readUnsignedInt());
		header.setCommandId(bytebuf.readUnsignedInt());
		header.setSequenceId(bytebuf.readUnsignedInt());
		header.setHeadLength(CmppHead.COMMANDID.getHeadLength());
		header.setBodyLength(header.getPacketLength() - header.getHeadLength());

		Message message = new DefaultMessage();
		if (header.getBodyLength() > 0) {
			message.setBodyBuffer(new byte[(int)header.getBodyLength()]);
			
			assert(header.getBodyLength() == bytebuf.readableBytes());
			
			bytebuf.readBytes(message.getBodyBuffer());
		} else {
			message.setBodyBuffer(GlobalConstance.emptyBytes);
		}
		message.setHeader(header);
		list.add(message);
	}

	@Override
	protected void encode(ChannelHandlerContext ctx, Message message, List list) throws Exception {

		int headerLength = CmppHead.COMMANDID.getHeadLength();
		int packetLength = message.getBodyBuffer().length + headerLength;

		// buf由netty写channel的时候释放
		ByteBuf buf = ctx.alloc().buffer(packetLength);
		buf.writeInt(packetLength);
		buf.writeInt((int) message.getHeader().getCommandId());
		buf.writeInt((int) message.getHeader().getSequenceId());
		if (packetLength > headerLength) {
			buf.writeBytes(message.getBodyBuffer());
		}
		list.add(buf);

	}

}