📄 sip_msg.c
字号:
hdr->cseq = 0;
hdr->method.id = PJSIP_OTHER_METHOD;
hdr->method.name.ptr = NULL;
hdr->method.name.slen = 0;
return hdr;
}
PJ_DEF(pjsip_cseq_hdr*) pjsip_cseq_hdr_create( pj_pool_t *pool )
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_cseq_hdr));
return pjsip_cseq_hdr_init(pool, mem);
}
static int pjsip_cseq_hdr_print( pjsip_cseq_hdr *hdr, char *buf, pj_size_t size)
{
char *p = buf;
int len;
if ((pj_ssize_t)size < hdr->name.slen + hdr->method.name.slen + 15)
return -1;
pj_memcpy(p, hdr->name.ptr, hdr->name.slen);
p += hdr->name.slen;
*p++ = ':';
*p++ = ' ';
len = pj_utoa(hdr->cseq, p);
p += len;
*p++ = ' ';
pj_memcpy(p, hdr->method.name.ptr, hdr->method.name.slen);
p += hdr->method.name.slen;
*p = '\0';
return p-buf;
}
static pjsip_cseq_hdr* pjsip_cseq_hdr_clone( pj_pool_t *pool,
const pjsip_cseq_hdr *rhs)
{
pjsip_cseq_hdr *hdr = pjsip_cseq_hdr_create(pool);
hdr->cseq = rhs->cseq;
pjsip_method_copy(pool, &hdr->method, &rhs->method);
return hdr;
}
static pjsip_cseq_hdr* pjsip_cseq_hdr_shallow_clone( pj_pool_t *pool,
const pjsip_cseq_hdr *rhs )
{
pjsip_cseq_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr));
pj_memcpy(hdr, rhs, sizeof(*hdr));
return hdr;
}
///////////////////////////////////////////////////////////////////////////////
/*
* Contact header.
*/
static int pjsip_contact_hdr_print( pjsip_contact_hdr *hdr, char *buf, pj_size_t size);
static pjsip_contact_hdr* pjsip_contact_hdr_clone( pj_pool_t *pool, const pjsip_contact_hdr *hdr);
static pjsip_contact_hdr* pjsip_contact_hdr_shallow_clone( pj_pool_t *pool, const pjsip_contact_hdr *);
static pjsip_hdr_vptr contact_hdr_vptr =
{
(pjsip_hdr_clone_fptr) &pjsip_contact_hdr_clone,
(pjsip_hdr_clone_fptr) &pjsip_contact_hdr_shallow_clone,
(pjsip_hdr_print_fptr) &pjsip_contact_hdr_print,
};
PJ_DEF(pjsip_contact_hdr*) pjsip_contact_hdr_init( pj_pool_t *pool,
void *mem )
{
pjsip_contact_hdr *hdr = mem;
PJ_UNUSED_ARG(pool);
pj_bzero(mem, sizeof(pjsip_contact_hdr));
init_hdr(hdr, PJSIP_H_CONTACT, &contact_hdr_vptr);
hdr->expires = -1;
pj_list_init(&hdr->other_param);
return hdr;
}
PJ_DEF(pjsip_contact_hdr*) pjsip_contact_hdr_create( pj_pool_t *pool )
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_contact_hdr));
return pjsip_contact_hdr_init(pool, mem);
}
static int pjsip_contact_hdr_print( pjsip_contact_hdr *hdr, char *buf,
pj_size_t size)
{
if (hdr->star) {
char *p = buf;
if ((pj_ssize_t)size < hdr->name.slen + 6)
return -1;
pj_memcpy(p, hdr->name.ptr, hdr->name.slen);
p += hdr->name.slen;
*p++ = ':';
*p++ = ' ';
*p++ = '*';
return p - buf;
} else {
int printed;
char *startbuf = buf;
char *endbuf = buf + size;
copy_advance(buf, hdr->name);
*buf++ = ':';
*buf++ = ' ';
printed = pjsip_uri_print(PJSIP_URI_IN_CONTACT_HDR, hdr->uri,
buf, endbuf-buf);
if (printed < 1)
return -1;
buf += printed;
if (hdr->q1000) {
if (buf+19 >= endbuf)
return -1;
/*
printed = sprintf(buf, ";q=%u.%03u",
hdr->q1000/1000, hdr->q1000 % 1000);
*/
pj_memcpy(buf, ";q=", 3);
printed = pj_utoa(hdr->q1000/1000, buf+3);
buf += printed + 3;
*buf++ = '.';
printed = pj_utoa(hdr->q1000 % 1000, buf);
buf += printed;
}
if (hdr->expires >= 0) {
if (buf+23 >= endbuf)
return -1;
pj_memcpy(buf, ";expires=", 9);
printed = pj_utoa(hdr->expires, buf+9);
buf += printed + 9;
}
printed = pjsip_param_print_on(&hdr->other_param, buf, endbuf-buf,
&pjsip_TOKEN_SPEC, &pjsip_TOKEN_SPEC,
';');
if (printed < 0)
return printed;
buf += printed;
return buf-startbuf;
}
}
static pjsip_contact_hdr* pjsip_contact_hdr_clone(pj_pool_t *pool,
const pjsip_contact_hdr *rhs)
{
pjsip_contact_hdr *hdr = pjsip_contact_hdr_create(pool);
hdr->star = rhs->star;
if (hdr->star)
return hdr;
hdr->uri = pjsip_uri_clone(pool, rhs->uri);
hdr->q1000 = rhs->q1000;
hdr->expires = rhs->expires;
pjsip_param_clone(pool, &hdr->other_param, &rhs->other_param);
return hdr;
}
static pjsip_contact_hdr*
pjsip_contact_hdr_shallow_clone( pj_pool_t *pool,
const pjsip_contact_hdr *rhs)
{
pjsip_contact_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr));
pj_memcpy(hdr, rhs, sizeof(*hdr));
pjsip_param_shallow_clone(pool, &hdr->other_param, &rhs->other_param);
return hdr;
}
///////////////////////////////////////////////////////////////////////////////
/*
* Content-Type header..
*/
static int pjsip_ctype_hdr_print( pjsip_ctype_hdr *hdr, char *buf,
pj_size_t size);
static pjsip_ctype_hdr* pjsip_ctype_hdr_clone(pj_pool_t *pool,
const pjsip_ctype_hdr *hdr);
#define pjsip_ctype_hdr_shallow_clone pjsip_ctype_hdr_clone
static pjsip_hdr_vptr ctype_hdr_vptr =
{
(pjsip_hdr_clone_fptr) &pjsip_ctype_hdr_clone,
(pjsip_hdr_clone_fptr) &pjsip_ctype_hdr_shallow_clone,
(pjsip_hdr_print_fptr) &pjsip_ctype_hdr_print,
};
PJ_DEF(pjsip_ctype_hdr*) pjsip_ctype_hdr_init( pj_pool_t *pool,
void *mem )
{
pjsip_ctype_hdr *hdr = mem;
PJ_UNUSED_ARG(pool);
pj_bzero(mem, sizeof(pjsip_ctype_hdr));
init_hdr(hdr, PJSIP_H_CONTENT_TYPE, &ctype_hdr_vptr);
return hdr;
}
PJ_DEF(pjsip_ctype_hdr*) pjsip_ctype_hdr_create( pj_pool_t *pool )
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_ctype_hdr));
return pjsip_ctype_hdr_init(pool, mem);
}
static int print_media_type(char *buf, const pjsip_media_type *media)
{
char *p = buf;
pj_memcpy(p, media->type.ptr, media->type.slen);
p += media->type.slen;
*p++ = '/';
pj_memcpy(p, media->subtype.ptr, media->subtype.slen);
p += media->subtype.slen;
if (media->param.slen) {
pj_memcpy(p, media->param.ptr, media->param.slen);
p += media->param.slen;
}
return p-buf;
}
static int pjsip_ctype_hdr_print( pjsip_ctype_hdr *hdr,
char *buf, pj_size_t size)
{
char *p = buf;
int len;
if ((pj_ssize_t)size < hdr->name.slen +
hdr->media.type.slen + hdr->media.subtype.slen +
hdr->media.param.slen + 8)
{
return -1;
}
pj_memcpy(p, hdr->name.ptr, hdr->name.slen);
p += hdr->name.slen;
*p++ = ':';
*p++ = ' ';
len = print_media_type(p, &hdr->media);
p += len;
*p = '\0';
return p-buf;
}
static pjsip_ctype_hdr* pjsip_ctype_hdr_clone( pj_pool_t *pool,
const pjsip_ctype_hdr *rhs)
{
pjsip_ctype_hdr *hdr = pjsip_ctype_hdr_create(pool);
pj_strdup(pool, &hdr->media.type, &rhs->media.type);
pj_strdup(pool, &hdr->media.subtype, &rhs->media.subtype);
pj_strdup(pool, &hdr->media.param, &rhs->media.param);
return hdr;
}
///////////////////////////////////////////////////////////////////////////////
/*
* Expires header.
*/
PJ_DEF(pjsip_expires_hdr*) pjsip_expires_hdr_init( pj_pool_t *pool,
void *mem,
int value)
{
pjsip_expires_hdr *hdr = mem;
PJ_UNUSED_ARG(pool);
init_hdr(hdr, PJSIP_H_EXPIRES, &generic_int_hdr_vptr);
hdr->ivalue = value;
return hdr;
}
PJ_DEF(pjsip_expires_hdr*) pjsip_expires_hdr_create( pj_pool_t *pool,
int value )
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_expires_hdr));
return pjsip_expires_hdr_init(pool, mem, value);
}
///////////////////////////////////////////////////////////////////////////////
/*
* To or From header.
*/
static int pjsip_fromto_hdr_print( pjsip_fromto_hdr *hdr,
char *buf, pj_size_t size);
static pjsip_fromto_hdr* pjsip_fromto_hdr_clone( pj_pool_t *pool,
const pjsip_fromto_hdr *hdr);
static pjsip_fromto_hdr* pjsip_fromto_hdr_shallow_clone( pj_pool_t *pool,
const pjsip_fromto_hdr *hdr);
static pjsip_hdr_vptr fromto_hdr_vptr =
{
(pjsip_hdr_clone_fptr) &pjsip_fromto_hdr_clone,
(pjsip_hdr_clone_fptr) &pjsip_fromto_hdr_shallow_clone,
(pjsip_hdr_print_fptr) &pjsip_fromto_hdr_print,
};
PJ_DEF(pjsip_from_hdr*) pjsip_from_hdr_init( pj_pool_t *pool,
void *mem )
{
pjsip_from_hdr *hdr = mem;
PJ_UNUSED_ARG(pool);
pj_bzero(mem, sizeof(pjsip_from_hdr));
init_hdr(hdr, PJSIP_H_FROM, &fromto_hdr_vptr);
pj_list_init(&hdr->other_param);
return hdr;
}
PJ_DEF(pjsip_from_hdr*) pjsip_from_hdr_create( pj_pool_t *pool )
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_from_hdr));
return pjsip_from_hdr_init(pool, mem);
}
PJ_DEF(pjsip_to_hdr*) pjsip_to_hdr_init( pj_pool_t *pool,
void *mem )
{
pjsip_to_hdr *hdr = mem;
PJ_UNUSED_ARG(pool);
pj_bzero(mem, sizeof(pjsip_to_hdr));
init_hdr(hdr, PJSIP_H_TO, &fromto_hdr_vptr);
pj_list_init(&hdr->other_param);
return hdr;
}
PJ_DEF(pjsip_to_hdr*) pjsip_to_hdr_create( pj_pool_t *pool )
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_to_hdr));
return pjsip_to_hdr_init(pool, mem);
}
PJ_DEF(pjsip_from_hdr*) pjsip_fromto_hdr_set_from( pjsip_fromto_hdr *hdr )
{
hdr->type = PJSIP_H_FROM;
hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_FROM];
return hdr;
}
PJ_DEF(pjsip_to_hdr*) pjsip_fromto_hdr_set_to( pjsip_fromto_hdr *hdr )
{
hdr->type = PJSIP_H_TO;
hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_TO];
return hdr;
}
static int pjsip_fromto_hdr_print( pjsip_fromto_hdr *hdr,
char *buf, pj_size_t size)
{
int printed;
char *startbuf = buf;
char *endbuf = buf + size;
copy_advance(buf, hdr->name);
*buf++ = ':';
*buf++ = ' ';
printed = pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, hdr->uri,
buf, endbuf-buf);
if (printed < 1)
return -1;
buf += printed;
copy_advance_pair(buf, ";tag=", 5, hdr->tag);
printed = pjsip_param_print_on(&hdr->other_param, buf, endbuf-buf,
&pjsip_TOKEN_SPEC,
&pjsip_TOKEN_SPEC, ';');
if (printed < 0)
return -1;
buf += printed;
return buf-startbuf;
}
static pjsip_fromto_hdr* pjsip_fromto_hdr_clone( pj_pool_t *pool,
const pjsip_fromto_hdr *rhs)
{
pjsip_fromto_hdr *hdr = pjsip_from_hdr_create(pool);
hdr->type = rhs->type;
hdr->name = rhs->name;
hdr->sname = rhs->sname;
hdr->uri = pjsip_uri_clone(pool, rhs->uri);
pj_strdup( pool, &hdr->tag, &rhs->tag);
pjsip_param_clone( pool, &hdr->other_param, &rhs->other_param);
return hdr;
}
static pjsip_fromto_hdr*
pjsip_fromto_hdr_shallow_clone( pj_pool_t *pool,
const pjsip_fromto_hdr *rhs)
{
pjsip_fromto_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr));
pj_memcpy(hdr, rhs, sizeof(*hdr));
pjsip_param_shallow_clone( pool, &hdr->other_param, &rhs->other_param);
return hdr;
}
///////////////////////////////////////////////////////////////////////////////
/*
* Max-Forwards header.
*/
PJ_DEF(pjsip_max_fwd_hdr*) pjsip_max_fwd_hdr_init( pj_pool_t *pool,
void *mem,
int value)
{
pjsip_max_fwd_hdr *hdr = mem;
PJ_UNUSED_ARG(pool);
init_hdr(hdr, PJSIP_H_MAX_FORWARDS, &generic_int_hdr_vptr);
hdr->ivalue = value;
return hdr;
}
PJ_DEF(pjsip_max_fwd_hdr*) pjsip_max_fwd_hdr_create(pj_pool_t *pool,
int value)
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_max_fwd_hdr));
return pjsip_max_fwd_hdr_init(pool, mem, value);
}
///////////////////////////////////////////////////////////////////////////////
/*
* Min-Expires header.
*/
PJ_DEF(pjsip_min_expires_hdr*) pjsip_min_expires_hdr_init( pj_pool_t *pool,
void *mem,
int value )
{
pjsip_min_expires_hdr *hdr = mem;
PJ_UNUSED_ARG(pool);
init_hdr(hdr, PJSIP_H_MIN_EXPIRES, &generic_int_hdr_vptr);
hdr->ivalue = value;
return hdr;
}
PJ_DEF(pjsip_min_expires_hdr*) pjsip_min_expires_hdr_create(pj_pool_t *pool,
int value )
{
void *mem = pj_pool_alloc(pool, sizeof(pjsip_min_expires_hdr));
return pjsip_min_expires_hdr_init(pool, mem, value );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -