class Protocol {
public:
virtual ~Protocol() {
}
/**
* @brief 把请求消息编码成二进制数据
* 编码,把msg编码到buf里面,返回写入了多长的数据,如果超过了 len,则返回-1表示错误。
* 如果返回 0 ,表示不需要编码,框架会直接从 msg 的缓冲区读取数据发送。
* @param buf 目标数据缓冲区
* @param offset 目标偏移量
* @param len 目标数据长度
* @param msg 输入消息对象
* @return 编码完成所用的字节数,如果 < 0 表示出错
*/
virtual int Encode(char* buf, int offset, int len, const Request& msg) = 0;
/**
* 编码,把msg编码到buf里面,返回写入了多长的数据,如果超过了 len,则返回-1表示错误。
* 如果返回 0 ,表示不需要编码,框架会直接从 msg 的缓冲区读取数据发送。
* @param buf 目标数据缓冲区
* @param offset 目标偏移量
* @param len 目标数据长度
* @param msg 输入消息对象
* @return 编码完成所用的字节数,如果 < 0 表示出错
*/
virtual int Encode(char* buf, int offset, int len, const Response& msg) = 0;
/**
* 编码,把msg编码到buf里面,返回写入了多长的数据,如果超过了 len,则返回-1表示错误。
* 如果返回 0 ,表示不需要编码,框架会直接从 msg 的缓冲区读取数据发送。
* @param buf 目标数据缓冲区
* @param offset 目标偏移量
* @param len 目标数据长度
* @param msg 输入消息对象
* @return 编码完成所用的字节数,如果 < 0 表示出错
*/
virtual int Encode(char* buf, int offset, int len, const Notice& msg) = 0;
/**
* 开始编码,会返回即将解码出来的消息类型,以便使用者构造合适的对象。
* 实际操作是在进行“分包”操作。
* @param buf 输入缓冲区
* @param offset 输入偏移量
* @param len 缓冲区长度
* @param msg_type 输出参数,表示下一个消息的类型,只在返回值 > 0 的情况下有效,否则都是 TypeError
* @return 如果返回0表示分包未完成,需要继续分包。如果返回-1表示协议包头解析出错。其他返回值表示这个消息包占用的长度。
*/
virtual int DecodeBegin(const char* buf, int offset, int len,
MessageType* msg_type) = 0;
/**
* 解码,把之前DecodeBegin()的buf数据解码成具体消息对象。
* @param request 输出参数,解码对象会写入此指针
* @return 返回0表示成功,-1表示失败。
*/
virtual int Decode(Request* request) = 0;
/**
* 解码,把之前DecodeBegin()的buf数据解码成具体消息对象。
* @param request 输出参数,解码对象会写入此指针
* @return 返回0表示成功,-1表示失败。
*/
virtual int Decode(Response* response) = 0;
/**
* 解码,把之前DecodeBegin()的buf数据解码成具体消息对象。
* @param request 输出参数,解码对象会写入此指针
* @return 返回0表示成功,-1表示失败。
*/
virtual int Decode(Notice* notice) = 0;protected:
Protocol() {
}
};