package com.mogujie.tt.imlib.proto; import com.mogujie.tt.config.ProtocolConstant; import com.mogujie.tt.config.SysConstant; import com.mogujie.tt.log.Logger; import com.mogujie.tt.packet.base.DataBuffer; import com.mogujie.tt.packet.base.DefaultHeader; import com.mogujie.tt.packet.base.Header; import com.mogujie.tt.packet.base.Packet; /** * MsgServerPacket:请求(返回)登陆消息服务器 yugui 2014-05-04 */ public class MessageNotifyPacket extends Packet { private Logger logger = Logger.getLogger(MessageNotifyPacket.class); public MessageNotifyPacket() { // todo eric remove this setNeedMonitor(true); } public MessageNotifyPacket(MessageEntity msg) { mRequest = new PacketAck(msg); setNeedMonitor(true); } @Override public DataBuffer encode() { Header header = mRequest.getHeader(); DataBuffer headerBuffer = header.encode(); DataBuffer bodyBuffer = new DataBuffer(); PacketAck req = (PacketAck) mRequest; if (null == req) return null; MsgAckEntity msgAck = req.msgAck; bodyBuffer.writeInt(msgAck.seqNo); bodyBuffer.writeString(msgAck.fromId); int headLength = headerBuffer.readableBytes(); int bodyLength = bodyBuffer.readableBytes(); DataBuffer buffer = new DataBuffer(headLength + bodyLength); buffer.writeDataBuffer(headerBuffer); buffer.writeDataBuffer(bodyBuffer); return buffer; } @Override public void decode(DataBuffer buffer) { if (null == buffer) { return; } try { packetNotify res = new packetNotify(); Header header = new Header(); header.decode(buffer); res.setHeader(header); logger.d("chat#recv message header:%s, actually len:%d", header, buffer.getOrignalBuffer().capacity()); MessageEntity msg = res.msg; msg.seqNo = buffer.readInt(); msg.fromId = buffer.readString(); msg.toId = buffer.readString(); msg.createTime = buffer.readInt(); msg.type = buffer.readByte(); //todo eric check the acutual remaining buffer length first, to refuse bug like notorious ssl heartbleed one //todo eric test:modify the incoming packet, and see if the client can handle wrong packet, and should be no crash msg.msgLen = buffer.readInt(); if (msg.msgLen > 0) { msg.msgData = buffer.readBytes(msg.msgLen); } msg.attach = buffer.readString(); mResponse = res; } catch (Exception e) { logger.e(e.getMessage()); } } public static class PacketAck extends Ack { private MsgAckEntity msgAck = new MsgAckEntity(); public PacketAck(MessageEntity msg) { msgAck.seqNo = msg.seqNo; msgAck.fromId = msg.fromId; Header header = new DefaultHeader(ProtocolConstant.SID_MSG, ProtocolConstant.CID_MSG_DATA_ACK); int contentLength = 4 + (4 + msgAck.fromId.length()); header.setLength(SysConstant.PROTOCOL_HEADER_LENGTH + contentLength); setHeader(header); } } public static class packetNotify extends Notify { public MessageEntity msg = new MessageEntity(); } }