package com.mogujie.tt.packet.base; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import com.squareup.picasso.Downloader.Response; /** * 协议包基类,子类必须实现{@link #encode()}和{@link #decode(DataBuffer)} * * @author dolphinWang * @time 2014/04/30 */ public abstract class Packet { protected Request mRequest; protected Response mResponse; protected boolean mNeedMonitor; public void setNeedMonitor(boolean bNeedMonitor) { mNeedMonitor = bNeedMonitor; } public int getSequenceNo() { return (int) (mRequest.mHeader.getReserved()); } public boolean getNeedMonitor() { return mNeedMonitor; } public Response getResponse() { return mResponse; } public void setRequest(Request request) { mRequest = request; } public Request getRequest() { return mRequest; } /** * 把Request数据结构编码成一个DataBuffer,必须先调用setRequest */ public abstract DataBuffer encode(); /** * 把DataBuffer解包构造一个Response对象,getResponse函数必须在调用完decode函数之后才能得到真实的包 */ public abstract void decode(DataBuffer buffer); /** * 请求包的数据结构基类,子类可以继承后添加属于自己的字段 */ public static class Request { /*** 成员变量 ***/ protected Header mHeader; public Header getHeader() { return mHeader; } public void setHeader(Header header) { mHeader = header; } } public static class Ack extends Request { } public static class Notify extends Response { } /** * 应答包的数据结构基类,子类可以继承后添加属于自己的字段 */ public static class Response { /*** 成员变量 ***/ protected Header mHeader; public Header getHeader() { return mHeader; } public void setHeader(Header header) { mHeader = header; } } public static byte[] getUtf8Bytes(String content) { if (content == null) { return null; } return content.getBytes(Charset.forName("utf8")); } public static int getStringLen(String content) { if (content == null || content.isEmpty()) { return 4 + 0; } return 4 + getUtf8Bytes(content).length; } public static int getIntLen(int a) { return 4; } public static int getStringListLen(List<String> stringList) { int len = 4; // cnt size for (String content : stringList) { len += getStringLen(content); } return len; } public static void writeStringList(List<String> stringList, DataBuffer bodyBuffer) { bodyBuffer.writeInt(stringList.size()); for (String content : stringList) { bodyBuffer.writeString(content); } } public static List<String> readStringList(DataBuffer buffer) { List<String> stringList = new ArrayList<String>(); int cnt = buffer.readInt(); for (int i = 0; i < cnt; ++i) { String content = buffer.readString(); stringList.add(content); } return stringList; } }