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 MessagePacket extends Packet {
private Logger logger = Logger.getLogger(MessagePacket.class);
public MessagePacket() {
// todo eric remove this
setNeedMonitor(true);
}
public MessagePacket(MessageEntity entity) {
mRequest = new PacketRequest(entity);
setNeedMonitor(true);
}
@Override
public DataBuffer encode() {
Header header = mRequest.getHeader();
DataBuffer headerBuffer = header.encode();
DataBuffer bodyBuffer = new DataBuffer();
PacketRequest req = (PacketRequest) mRequest;
if (null == req)
return null;
MessageEntity entity = req.entity;
bodyBuffer.writeInt(entity.seqNo);
bodyBuffer.writeString(entity.fromId);
bodyBuffer.writeString(entity.toId);
bodyBuffer.writeInt(entity.createTime);
bodyBuffer.writeByte(entity.type);
bodyBuffer.writeInt(entity.msgLen);
bodyBuffer.writeBytes(entity.msgData);
bodyBuffer.writeString(entity.attach);
int headLength = headerBuffer.readableBytes();
int bodyLength = bodyBuffer.readableBytes();
logger.d("chat#message len:%d, header report len:%d", headLength + bodyLength, header.getLength());
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 {
PacketResponse res = new PacketResponse();
Header header = new Header();
header.decode(buffer);
res.setHeader(header);
logger.d("chat#header:%s", header);
// starts filling from here
res.msgAck.seqNo = buffer.readInt();
res.msgAck.fromId = buffer.readString();
mResponse = res;
} catch (Exception e) {
logger.e("chat#decode exception:%s", e.getMessage());
logger.e(e.getMessage());
}
}
public static class PacketRequest extends Request {
private MessageEntity entity;
public PacketRequest(MessageEntity message) {
entity = message;
Header header = new DefaultHeader(ProtocolConstant.SID_MSG,
ProtocolConstant.CID_MSG_DATA);
int contentLength = 4 + (4 + getUtf8Bytes(message.fromId).length)
+ (4 + getUtf8Bytes(message.toId).length) + 4 + 1 + message.msgLen
+ 4 + getUtf8Bytes(message.attach).length + 4;
header.setLength(SysConstant.PROTOCOL_HEADER_LENGTH + contentLength);
setHeader(header);
}
}
public static class PacketResponse extends Response {
public MsgAckEntity msgAck = new MsgAckEntity();
}
}