最近在处理OSIP中碰到发现协议栈在osip_osip_message_t结构体有三个内部变量如下:
struct osip_message
{
...........................
int message_property; /**@internal */
char *message; /**@internal */
size_t message_length; /**@internal */
..................
};
刚开始一直不知道是做什么用的,而且每次对osip_osip_message_t结构体进行操作时都会将message_property进行赋值
如在设置allow函数中:
int
osip_message_set_allow (osip_message_t * sip, const char *hvalue)
{
osip_allow_t *allow;
int i;
if (hvalue == NULL || hvalue[0] == '\0')
return OSIP_SUCCESS;
i = osip_allow_init (&allow);
if (i != 0)
return i;
i = osip_allow_parse (allow, hvalue);
if (i != 0)
{
osip_allow_free (allow);
return i;
}
sip->message_property = 2;
osip_list_add (&sip->allows, allow, -1);
return OSIP_SUCCESS;
}
通过研究才发现message_property 是为了标记结构体中
char *message; /**@internal */
里面存储的message是不是最新结构体转换过来的字符串,如果是那么下次要将结构体转换为字符串时,只要直接拷贝message就可以了,不用再进行转换.
如果不是最新转换过来的,那么就要先把message释放掉,然后再重新转换过来,再将message_property设置为1(表明当前的message保存着最新的消息)。
当然如果我们设置了osip_osip_message_t结构体的话就要将message_property设置为2表明当前的结构体被改变了,如果想要得到字符串,那么需要将message 释放掉
然后重新转换.
代码中如下:
static int
_osip_message_to_str (osip_message_t * sip, char **dest,
size_t * message_length, int sipfrag)
{
...................
if (1 == osip_message_get__property (sip))
{ /* message is already available in "message" */
*dest = osip_malloc (sip->message_length + 1);
if (*dest == NULL)
return OSIP_NOMEM;
memcpy (*dest, sip->message, sip->message_length);
(*dest)[sip->message_length] = '\0';
if (message_length != NULL)
*message_length = sip->message_length;
return OSIP_SUCCESS;
} else
{
/* message should be rebuilt: delete the old one if exists. */
osip_free (sip->message);
sip->message = NULL;
}
.....................
}
message_property值有如下几种(其中4是我因为需要使用扩展的,表明message中存的是body结构体转换过来的字符串)
/*
* 1:sip->message存放的字符串是最新的结构体转换过来的.
* 2:sip->message中存放的字符串不是最新的结构体转换过来的,可能结构体中的某个参数被修改了,所以需要重新转换.
* 3:初始化的值,应该表示sip->message为空.
* 4:表示sip->message中存放的是最新的body结构体转换给来的字符串.
*/
代码中还有和message_property相关的函数,如下:
int
osip_message_get__property (const osip_message_t * sip)
{
if (sip == NULL)
return OSIP_BADPARAMETER;
return sip->message_property;
}
int
osip_message_force_update (osip_message_t * sip)
{
if (sip == NULL)
return OSIP_BADPARAMETER;
sip->message_property = 2;
return OSIP_SUCCESS;
}
auth:JobPan
date:2011-10-14