From 9115df1d57547f0d3747ddeb048e9ac87c0b9292 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Sat, 11 Nov 2006 21:25:55 +0000 Subject: Add pjsip_regc_add_headers() APi to set headers to be added to the REGISTER request. This solves the problem where headers registered in the initial REGISTER request (such as User-Agent header) are not sent in subsequent reregistration request. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@799 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/include/pjsip-ua/sip_regc.h | 13 +++++++++++++ pjsip/src/pjsip-ua/sip_reg.c | 33 +++++++++++++++++++++++++++++++++ pjsip/src/pjsua-lib/pjsua_acc.c | 18 +++++++++++++++++- 3 files changed, 63 insertions(+), 1 deletion(-) (limited to 'pjsip') diff --git a/pjsip/include/pjsip-ua/sip_regc.h b/pjsip/include/pjsip-ua/sip_regc.h index a071fcc1..81aa07ed 100644 --- a/pjsip/include/pjsip-ua/sip_regc.h +++ b/pjsip/include/pjsip-ua/sip_regc.h @@ -198,6 +198,19 @@ PJ_DECL(pj_status_t) pjsip_regc_set_credentials( pjsip_regc *regc, PJ_DECL(pj_status_t) pjsip_regc_set_route_set(pjsip_regc *regc, const pjsip_route_hdr*route_set); +/** + * Add headers to be added to outgoing REGISTER requests. + * + * @param regc The client registration structure. + * @param hdr_list List containing SIP headers to be added for all outgoing + * REGISTER requests. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjsip_regc_add_headers(pjsip_regc *regc, + const pjsip_hdr *hdr_list); + + /** * Create REGISTER request for the specified client registration structure. * diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c index b7770488..20bfb786 100644 --- a/pjsip/src/pjsip-ua/sip_reg.c +++ b/pjsip/src/pjsip-ua/sip_reg.c @@ -65,6 +65,7 @@ struct pjsip_regc pjsip_expires_hdr *unreg_expires_hdr; pj_uint32_t expires; pjsip_route_hdr route_set; + pjsip_hdr hdr_list; /* Authorization sessions. */ pjsip_auth_clt_sess auth_sess; @@ -106,6 +107,7 @@ PJ_DEF(pj_status_t) pjsip_regc_create( pjsip_endpoint *endpt, void *token, return status; pj_list_init(®c->route_set); + pj_list_init(®c->hdr_list); /* Done */ *p_regc = regc; @@ -307,6 +309,25 @@ PJ_DEF(pj_status_t) pjsip_regc_set_route_set( pjsip_regc *regc, return PJ_SUCCESS; } +PJ_DEF(pj_status_t) pjsip_regc_add_headers( pjsip_regc *regc, + const pjsip_hdr *hdr_list) +{ + const pjsip_hdr *hdr; + + PJ_ASSERT_RETURN(regc && hdr_list, PJ_EINVAL); + + //This is "add" operation, so don't remove headers. + //pj_list_init(®c->hdr_list); + + hdr = hdr_list->next; + while (hdr != hdr_list) { + pj_list_push_back(®c->hdr_list, pjsip_hdr_clone(regc->pool, hdr)); + hdr = hdr->next; + } + + return PJ_SUCCESS; +} + static pj_status_t create_request(pjsip_regc *regc, pjsip_tx_data **p_tdata) { @@ -350,6 +371,18 @@ static pj_status_t create_request(pjsip_regc *regc, } } + /* Add additional request headers */ + if (!pj_list_empty(®c->hdr_list)) { + const pjsip_hdr *hdr; + + hdr = regc->hdr_list.next; + while (hdr != ®c->hdr_list) { + pjsip_hdr *new_hdr = pjsip_hdr_shallow_clone(tdata->pool, hdr); + pjsip_msg_add_hdr(tdata->msg, new_hdr); + hdr = hdr->next; + } + } + /* Done. */ *p_tdata = tdata; return PJ_SUCCESS; diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index 10cc2367..fd71f993 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -550,6 +550,22 @@ static pj_status_t pjsua_regc_init(int acc_id) pjsip_regc_set_route_set( acc->regc, &acc->route_set ); } + /* Add other request headers. */ + if (pjsua_var.ua_cfg.user_agent.slen) { + pjsip_hdr hdr_list; + const pj_str_t STR_USER_AGENT = { "User-Agent", 10 }; + pjsip_generic_string_hdr *h; + + pool = pj_pool_create_on_buf(NULL, contact_buf, sizeof(contact_buf)); + pj_list_init(&hdr_list); + + h = pjsip_generic_string_hdr_create(pool, &STR_USER_AGENT, + &pjsua_var.ua_cfg.user_agent); + pj_list_push_back(&hdr_list, (pjsip_hdr*)h); + + pjsip_regc_add_headers(acc->regc, &hdr_list); + } + return PJ_SUCCESS; } @@ -596,7 +612,7 @@ PJ_DEF(pj_status_t) pjsua_acc_set_registration( pjsua_acc_id acc_id, } if (status == PJ_SUCCESS) { - pjsua_process_msg_data(tdata, NULL); + //pjsua_process_msg_data(tdata, NULL); status = pjsip_regc_send( pjsua_var.acc[acc_id].regc, tdata ); } -- cgit v1.2.3