声明
/*
1: structure and buffer "message" are identical.
2: buffer "message" is not up to date with the structure info (call osip_message_to_str to update it).
*/
int message_property; /**< internal value */
当被返回1,说明当前的sip结构体已经正确转化为字符串报文
返回2,说明需要重新构建
操作函数
/* return values:
1: structure and buffer "message" are identical.
2: buffer "message" is not up to date with the structure info (call osip_message_to_str to update it).
-1 on error.
*/
int
osip_message_get__property (const osip_message_t * sip)
int
osip_message_force_update (osip_message_t * sip)
{
if (sip == NULL)
return OSIP_BADPARAMETER;
sip->message_property = 2;
return OSIP_SUCCESS;
}
如何引导重新组装SIP报文
int
osip_message_to_str (osip_message_t * sip, char **dest, size_t * message_length)
{
return _osip_message_to_str (sip, dest, message_length, 0);
}
static int
_osip_message_to_str (osip_message_t * sip, char **dest, size_t * message_length, int sipfrag)
{
size_t malloc_size;
size_t total_length = 0;
/* Added at SIPit day1 */
char *start_of_bodies;
char *content_length_to_modify = NULL;
char *message;
char *next;
char *tmp;
int pos;
int i;
char *boundary = NULL;
malloc_size = SIP_MESSAGE_MAX_LENGTH;
*dest = NULL;
if (sip == NULL)
return OSIP_BADPARAMETER;
{
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;
}
}
通过判断if (1 == osip_message_get__property (sip))
相关设置函数
几乎SIP结构体的任何修改,都会触发重新构建,例如:
/* adds the route header to message. */
/* INPUT : const char *hvalue | value of header. */
/* OUTPUT: osip_message_t *sip | structure to save results. */
/* returns -1 on error. */
int
osip_message_set_route (osip_message_t * sip, const char *hvalue)
sip->message_property = 2;
就修改了消息属性