请声明出处:http://blog.csdn.net/u012377333/article/details/45917579
本文开始详细的学习yate里面自定义的SIP协议库,消息体的定义:
/** * An object that holds the sip message parsed into this library model. * 一个保存被解析的sip信息到这个库模型的对象 * This class can be used to parse a sip message from a text buffer, or it * can be used to create a text buffer from a sip message. * 这个类可以被用于从text的缓冲下中解析一个sip消息, * 或者能被用于从sip消息创建一个text缓冲区 * @short A container and parser for SIP messages */ class YSIP_API SIPMessage : public RefObject { public: /** * Various message flags * 多种消息标志 */ enum Flags { Defaults = 0, NotReqRport = 0x0001, NotAddAllow = 0x0002, NotAddAgent = 0x0004, RportAfterBranch = 0x0008, NotSetRport = 0x0010, NotSetReceived = 0x0020, NoConnReuse = 0x0040, // Don't add 'alias' parameter to Via header (reliable only) }; /** * Copy constructor * 拷贝构造函数 */ SIPMessage(const SIPMessage& original); /** * Creates a new, empty, outgoing SIPMessage. * 创建一个新的,空的,外出的sip消息 */ SIPMessage(const char* _method, const char* _uri, const char* _version = "SIP/2.0"); /** * Creates a new SIPMessage from parsing a text buffer. * 创建一个的新的sip消息从解析text缓冲区 * @param ep Party to set in message * @参数ep,设置到消息的party * @param buf Buffer to parse * @参数buf,要解析的缓冲区 * @param len Optional buffer length * @参数len, 可选择的缓冲区的大小 * @param bodyLen Pointer to body length to be set if the message was received * on a stream transport. If not 0 the buffer must contain the message * without its body * @参数bodylen, 指向去设置在流传输中被接受的消息的长度的指针,如果不为0, * 缓冲区必须包含不包括消息体的消息 */ SIPMessage(SIPParty* ep, const char* buf, int len = -1, unsigned int* bodyLen = 0); /** * Creates a new SIPMessage as answer to another message. * 创建一个新的sip消息去应答另外一个消息 */ SIPMessage(const SIPMessage* message, int _code, const char* _reason = 0); /** * Creates an ACK message from an original message and a response. * 创建一个确认消息从一个原始的消息并且响应 */ SIPMessage(const SIPMessage* original, const SIPMessage* answer); /** * Destroy the message and all * 销毁消息 */ virtual ~SIPMessage(); /** * Construct a new SIP message by parsing a text buffer * 通过解析一个text缓冲区来构造一个新的sip消息 * @param ep Party to set in message * @参数ep,设置到消息的party * @param buf Buffer to parse * @参数buf,要解析的缓冲区 * @param len Optional buffer length * @参数len, 可选择的缓冲区的大小 * @param bodyLen Pointer to body length to be set if the message was received * on a stream transport. If not 0 the buffer must contain the message * without its body * @参数bodylen, 指向去设置在流传输中被接受的消息的长度的指针,如果不为0, * 缓冲区必须包含不包括消息体的消息 * @return A pointer to a valid new message or NULL * @返回指向有效的新消息的指针或者NULL */ static SIPMessage* fromParsing(SIPParty* ep, const char* buf, int len = -1, unsigned int* bodyLen = 0); /** * Build message's body. Reset it before. * 构建消息体,之前重置 * This method should be called after parsing a partial message (headers only) * 这个方法必须在解析部分消息(仅仅是消息头)之后调用 * @param buf Buffer to parse * @参数buf,要解析的缓冲区 * @param len Optional buffer length * @参数len, 可选择的缓冲区的大小 */ void buildBody(const char* buf, int len = -1); /** * Complete missing fields with defaults taken from a SIP engine * 从sip engine中完成丢失字段的默认值 * @param engine Pointer to the SIP engine to use for extra parameters * @参数engine,要使用附加参数的sip engine的指针 * @param user Username to set in the From header instead of that in rURI * @参数user,设置到文件头的From的用户名代替rURI * @param domain Domain to use in From instead of the local IP address * @参数domain,用于文件头From代替本地IP地址的域 * @param dlgTag Value of dialog tag parameter to set in To header * @参数dlgTag,设置到消息头的会话标志参数 * @param flags Miscellaneous completion flags, -1 to take them from engine * @参数标志,杂项完成的标志,-1从engine中使用 */ void complete(SIPEngine* engine, const char* user = 0, const char* domain = 0, const char* dlgTag = 0, int flags = -1); /** * Copy an entire header line (including all parameters) from another message * 从另外一个消息拷贝一个全部的消息头列(包含所有的参数) * @param message Pointer to the message to copy the header from * @参数message,指向要拷贝文件头的消息的指针 * @param name Name of the header to copy * @参数name, 要拷贝的消息头的名称 * @param newName New name to force in headers, NULL to just copy * @参数newName,消息头的新名称,NULL仅仅拷贝 * @return True if the header was found and copied * @返回true,如果消息头被找到并且被拷贝 */ bool copyHeader(const SIPMessage* message, const char* name, const char* newName = 0); /** * Copy multiple header lines (including all parameters) from another message * 从另外一个消息拷贝一个全部的消息头列(包含所有的参数) * @param message Pointer to the message to copy the header from * @参数message,指向要拷贝文件头的消息的指针 * @param name Name of the headers to copy * @参数name, 要拷贝的消息头的名称 * @param newName New name to force in headers, NULL to just copy * @参数newName,消息头的新名称,NULL仅仅拷贝 * @return Number of headers found and copied * @返回消息头被找到并且被拷贝的数量 */ int copyAllHeaders(const SIPMessage* message, const char* name, const char* newName = 0); /** * Get the endpoint this message uses * 获得这个消息的 sip party * @return Pointer to the endpoint of this message * @返回指向消息的 sip party的指针 */ inline SIPParty* getParty() const { return m_ep; } /** * Set the endpoint this message uses * 设置这个消息的 sip party * @param ep Pointer to the endpoint of this message * @参数ep,指向消息的 sip party的指针 */ void setParty(SIPParty* ep = 0); /** * Check if this message is valid as result of the parsing * 核查这个消息解析的结果是否是有效的 */ inline bool isValid() const { return m_valid; } /** * Check if this message is an answer or a request * 核查消息是一个应答还是一个请求 */ inline bool isAnswer() const { return m_answer; } /** * Check if this message is an outgoing message * 核查该消息是否是一个外出的消息 * @return True if this message should be sent to remote * @返回true,如果该消息被发送到远端 */ inline bool isOutgoing() const { return m_outgoing; } /** * Check if this message is an ACK message * 检查这个消息是否是一个确认消息 * @return True if this message has an ACK method * @返回rtue 如果这个消息是一个确认的方式 */ inline bool isACK() const { return m_ack; } /** * Check if this message is handled by a reliable protocol * 核查该消息是否被可靠的协议处理 * @return True if a reliable protocol (TCP, SCTP) is used * @返回true,如果使用可靠的协议(tcp,sctp) */ inline bool isReliable() const { return m_ep ? m_ep->isReliable() : false; } /** * Get the Command Sequence number from this message * 从该消息中获得信令的序号 * @return Number part of CSEQ in this message * @返回消息的CSEQ部分的序号 */ inline int getCSeq() const { return m_cseq; } /** * Get the last flags used by this message * 获得被该消息使用的最后一个标志 * @return Flags last used, ORed together * @返回最后一个被使用的标志 */ inline int getFlags() const { return m_flags; } /** * Find a header line by name * 通过名称找到消息头的列 * @param name Name of the header to locate * @参数name,定位消息头的名称 * @return A pointer to the first matching header line or 0 if not found * @返回指向第一个匹配到的消息头列的指针,或者为0 如果没有找到 */ const MimeHeaderLine* getHeader(const char* name) const; /** * Find the last header line that matches a given name name * 找到最后匹配消息头列的名称 * @param name Name of the header to locate * @参数name,定位消息头的名称 * @return A pointer to the last matching header line or 0 if not found * @返回指向最后一个匹配到的消息头列的指针,或者为0 如果没有找到 */ const MimeHeaderLine* getLastHeader(const char* name) const; /** * Count the header lines matching a specific name * 计算匹配特殊名称的消息头列的条数 * @param name Name of the header to locate * @参数name,定位消息头的名称 * @return Number of matching header lines * @返回匹配消息头列的数量 */ int countHeaders(const char* name) const; /** * Find a header parameter by name * 通过名称找到消息的参数 * @param name Name of the header to locate * @参数name,定位消息头的名称 * @param param Name of the parameter to locate in the tag * @参数param,要定位的参数的名称 * @param last Find the last header with that name instead of first * @参数last,找到名称最后的消息头代替第一个 * @return A pointer to the first matching header line or 0 if not found * @返回指向第一个匹配到的消息头列的指针,或者为0 如果没有找到 */ const NamedString* getParam(const char* name, const char* param, bool last = false) const; /** * Get a string value (without parameters) from a header line * 从消息头列中获取字符串值(没有参数) * @param name Name of the header to locate * @参数name,定位消息头的名称 * @param last Find the last header with that name instead of first * @参数last,找到名称最后的消息头代替第一个 * @return The value hold in the header or an empty String * @返回保存消息头的值,或者空串 */ const String& getHeaderValue(const char* name, bool last = false) const; /** * Get a string value from a parameter in a header line * 从消息头列中获取参数的字符串值 * @param name Name of the header to locate * @参数name,定位消息头的名称 * @param param Name of the parameter to locate in the tag * @参数param,要定位的参数的名称 * @param last Find the last header with that name instead of first * @参数last,找到名称最后的消息头代替第一个 * @return The value hold in the parameter or an empty String * @返回保存消息头参数的值,或者空串 */ const String& getParamValue(const char* name, const char* param, bool last = false) const; /** * Append a new header line constructed from name and content * 添加一个新的被构造的消息头从名称和内容 * @param name Name of the header to add * @参数name,要添加到消息头的名称 * @param value Content of the new header line * @参数value,新消息头的内容 */ inline void addHeader(const char* name, const char* value = 0) { header.append(new MimeHeaderLine(name,value)); } /** * Append an already constructed header line * 添加一个已近被构造好的消息头列 * @param line Header line to add * @参数line,要添加的消息头列 */ inline void addHeader(MimeHeaderLine* line) { header.append(line); } /** * Clear all header lines that match a name * 清理所有匹配名称的消息头列 * @param name Name of the header to clear * @参数name,要清理的名称 */ void clearHeaders(const char* name); /** * Set a header line constructed from name and content * 从名称和内容来设置一个被构造好的消息头列 */ inline void setHeader(const char* name, const char* value = 0) { clearHeaders(name); addHeader(name,value); } /** * Construct a new authorization line based on credentials and challenge * 构造一个新的鉴权列基于证书和挑战(?) * @param username User account name * @参数username,账户的用户名 * @param password Clear text password for the account * @参数password,账户的明文密码 * @param meth Method to include in the authorization digest * @参数meth,鉴权摘要的方法 * @param uri URI to include in the authorization digest * @参数uri,鉴权摘要的地址 * @param proxy Set to true to authenticate to a proxy, false to a server * @参数proxy,设置为true,代理鉴权,false,服务器鉴权 * @param engine Optional engine processing this message * @参数engine,可选的引擎处理此消息 * @return A new authorization line to be used in a new transaction * @返回一个新的鉴权列被用于新的会话 */ MimeAuthLine* buildAuth(const String& username, const String& password, const String& meth, const String& uri, bool proxy = false, SIPEngine* engine = 0) const; /** * Construct a new authorization line based on this answer and original message * 构造一个新的鉴权列基于应答和原始的消息 * @param original Origianl outgoing message * @参数original,原始的外出消息 * @param engine Optional engine processing this message * @参数engine,可选的引擎处理此消息 * @return A new authorization line to be used in a new transaction * @返回一个新的鉴权列被用于新的会话 */ MimeAuthLine* buildAuth(const SIPMessage& original, SIPEngine* engine = 0) const; /** * Prepare the message for automatic client transaction authentication. * 为自动的客户端鉴权会话准备用户名和密码 * @param username Username for auto authentication * @参数username,鉴权的用户名 * @param password Password for auto authentication * @参数password,鉴权的密码 */ inline void setAutoAuth(const char* username = 0, const char* password = 0) { m_authUser = username; m_authPass = password; } /** * Retrieve the username to be used for auto authentication * 检索被用于鉴权的用户名 * @return Username for auto authentication */ inline const String& getAuthUsername() const { return m_authUser; } /** * Retrieve the password to be used for auto authentication * 检索被用于鉴权的密码 * @return Password for auto authentication */ inline const String& getAuthPassword() const { return m_authPass; } /** * Extract routes from Record-Route: headers * 从记录路由中提取路线:头 * @return A list of MimeHeaderLine representing SIP routes * @返回标示sip路由的MimeHeaderLine链表 */ ObjList* getRoutes() const; /** * Add Route: headers to an outgoing message * 添加路由:外出消息头 * @param routes List of MimeHeaderLine representing SIP routes * @返回标示sip路由的MimeHeaderLine链表 */ void addRoutes(const ObjList* routes); /** * Creates a binary buffer from a SIPMessage. * 从sip消息中创建一个2进制的缓冲区 */ const DataBlock& getBuffer() const; /** * Creates a text buffer from the headers. * 从文件头创建一个文本缓冲区 */ const String& getHeaders() const; /** * Set a new body for this message * 设置新的消息体 */ void setBody(MimeBody* newbody = 0); /** * Sip Version * sip 版本 */ String version; /** * This holds the method name of the message. * 这个消息的方法名称 */ String method; /** * URI of the request * 请求的地址 */ String uri; /** * Status code * 状态码 */ int code; /** * Reason Phrase * 原因描述 */ String reason; /** * All the headers should be in this list. * 消息头 */ ObjList header; /** * All the body related things should be here, including the entire body and * the parsed body. * 消息体 */ MimeBody* body; protected: bool parse(const char* buf, int len, unsigned int* bodyLen); bool parseFirst(String& line); SIPParty* m_ep; bool m_valid; bool m_answer; bool m_outgoing; bool m_ack; int m_cseq; int m_flags; mutable String m_string; mutable DataBlock m_data; String m_authUser; String m_authPass; private: SIPMessage(); // no, thanks };