diff options
Diffstat (limited to 'pjsip/src/pjsip-simple/publishc.c')
-rw-r--r-- | pjsip/src/pjsip-simple/publishc.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/pjsip/src/pjsip-simple/publishc.c b/pjsip/src/pjsip-simple/publishc.c index 6840d028..2f5b415e 100644 --- a/pjsip/src/pjsip-simple/publishc.c +++ b/pjsip/src/pjsip-simple/publishc.c @@ -81,6 +81,7 @@ struct pjsip_publishc pjsip_expires_hdr *expires_hdr; pj_uint32_t expires; pjsip_route_hdr route_set; + pjsip_hdr usr_hdr; /* Authorization sessions. */ pjsip_auth_clt_sess auth_sess; @@ -157,6 +158,7 @@ PJ_DEF(pj_status_t) pjsip_publishc_create( pjsip_endpoint *endpt, return status; pj_list_init(&pubc->route_set); + pj_list_init(&pubc->usr_hdr); /* Done */ *p_pubc = pubc; @@ -186,7 +188,9 @@ PJ_DEF(pj_pool_t*) pjsip_publishc_get_pool(pjsip_publishc *pubc) static void set_expires( pjsip_publishc *pubc, pj_uint32_t expires) { - if (expires != pubc->expires) { + if (expires != pubc->expires && + expires != PJSIP_PUBC_EXPIRATION_NOT_SPECIFIED) + { pubc->expires_hdr = pjsip_expires_hdr_create(pubc->pool, expires); } else { pubc->expires_hdr = NULL; @@ -281,6 +285,23 @@ PJ_DEF(pj_status_t) pjsip_publishc_set_route_set( pjsip_publishc *pubc, return PJ_SUCCESS; } +PJ_DEF(pj_status_t) pjsip_publishc_set_headers( pjsip_publishc *pubc, + const pjsip_hdr *hdr_list) +{ + const pjsip_hdr *h; + + PJ_ASSERT_RETURN(pubc && hdr_list, PJ_EINVAL); + + pj_list_init(&pubc->usr_hdr); + h = hdr_list->next; + while (h != hdr_list) { + pj_list_push_back(&pubc->usr_hdr, pjsip_hdr_clone(pubc->pool, h)); + h = h->next; + } + + return PJ_SUCCESS; +} + static pj_status_t create_request(pjsip_publishc *pubc, pjsip_tx_data **p_tdata) { @@ -345,6 +366,19 @@ static pj_status_t create_request(pjsip_publishc *pubc, pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*)hdr); } + /* Add user headers */ + if (!pj_list_empty(&pubc->usr_hdr)) { + const pjsip_hdr *hdr; + + hdr = pubc->usr_hdr.next; + while (hdr != &pubc->usr_hdr) { + pjsip_hdr *new_hdr = (pjsip_hdr*) + pjsip_hdr_shallow_clone(tdata->pool, hdr); + pjsip_msg_add_hdr(tdata->msg, new_hdr); + hdr = hdr->next; + } + } + /* Done. */ *p_tdata = tdata; @@ -530,7 +564,7 @@ static void tsx_callback(void *token, pjsip_event *event) expires = (pjsip_expires_hdr*) pjsip_msg_find_hdr(msg, PJSIP_H_EXPIRES, NULL); - if (expires) + if (pubc->auto_refresh && expires) expiration = expires->ivalue; if (pubc->auto_refresh && expiration!=0 && expiration!=0xFFFF) { |