diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2016-06-24 13:03:25 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2016-06-24 13:03:25 +0000 |
commit | b6286dbe1a6fef17f94c0483bd20c5dab1212bd8 (patch) | |
tree | a29d71a06506305e8bdf2fd3aa86dd5933cbde76 | |
parent | 13c39fa2ab87b1e08c0780b143c974402c479f8e (diff) |
Fix #1938: Wrong registration renewal flag info in PJSUA registration callback when unregistration fails.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5356 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjsip/include/pjsip-ua/sip_regc.h | 1 | ||||
-rw-r--r-- | pjsip/src/pjsip-ua/sip_reg.c | 24 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 2 |
3 files changed, 18 insertions, 9 deletions
diff --git a/pjsip/include/pjsip-ua/sip_regc.h b/pjsip/include/pjsip-ua/sip_regc.h index 80c7a331..6b13665c 100644 --- a/pjsip/include/pjsip-ua/sip_regc.h +++ b/pjsip/include/pjsip-ua/sip_regc.h @@ -77,6 +77,7 @@ struct pjsip_regc_cbparam int expiration;/**< Next expiration interval. */ int contact_cnt;/**<Number of contacts in response. */ pjsip_contact_hdr *contact[PJSIP_REGC_MAX_CONTACT]; /**< Contacts. */ + pj_bool_t is_unreg; /**< Expire header, if any, set to zero?*/ }; diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c index 8b7f928b..2bc05a70 100644 --- a/pjsip/src/pjsip-ua/sip_reg.c +++ b/pjsip/src/pjsip-ua/sip_reg.c @@ -746,7 +746,8 @@ static void cbparam_init( struct pjsip_regc_cbparam *cbparam, pj_status_t status, int st_code, const pj_str_t *reason, pjsip_rx_data *rdata, pj_int32_t expiration, - int contact_cnt, pjsip_contact_hdr *contact[]) + int contact_cnt, pjsip_contact_hdr *contact[], + pj_bool_t is_unreg) { cbparam->regc = regc; cbparam->token = regc->token; @@ -757,6 +758,7 @@ static void cbparam_init( struct pjsip_regc_cbparam *cbparam, cbparam->contact_cnt = contact_cnt; cbparam->expiration = (expiration >= 0? expiration: regc->expires_requested); + cbparam->is_unreg = is_unreg; if (contact_cnt) { pj_memcpy( cbparam->contact, contact, contact_cnt*sizeof(pjsip_contact_hdr*)); @@ -766,7 +768,8 @@ static void cbparam_init( struct pjsip_regc_cbparam *cbparam, static void call_callback(pjsip_regc *regc, pj_status_t status, int st_code, const pj_str_t *reason, pjsip_rx_data *rdata, pj_int32_t expiration, - int contact_cnt, pjsip_contact_hdr *contact[]) + int contact_cnt, pjsip_contact_hdr *contact[], + pj_bool_t is_unreg) { struct pjsip_regc_cbparam cbparam; @@ -774,7 +777,7 @@ static void call_callback(pjsip_regc *regc, pj_status_t status, int st_code, return; cbparam_init(&cbparam, regc, status, st_code, reason, rdata, expiration, - contact_cnt, contact); + contact_cnt, contact, is_unreg); (*regc->cb)(&cbparam); } @@ -801,7 +804,8 @@ static void regc_refresh_timer_cb( pj_timer_heap_t *timer_heap, if (status != PJ_SUCCESS && regc->cb) { char errmsg[PJ_ERR_MSG_SIZE]; pj_str_t reason = pj_strerror(status, errmsg, sizeof(errmsg)); - call_callback(regc, status, 400, &reason, NULL, -1, 0, NULL); + call_callback(regc, status, 400, &reason, NULL, -1, 0, NULL, + PJ_FALSE); } /* Delete the record if user destroy regc during the callback. */ @@ -1099,7 +1103,7 @@ static void regc_tsx_callback(void *token, pjsip_event *event) &tsx->status_text, (event->body.tsx_state.type==PJSIP_EVENT_RX_MSG) ? event->body.tsx_state.src.rdata : NULL, - -1, 0, NULL); + -1, 0, NULL, PJ_FALSE); /* Call regc tsx callback before handling any response */ pj_lock_release(regc->lock); @@ -1138,8 +1142,10 @@ static void regc_tsx_callback(void *token, pjsip_event *event) { pjsip_rx_data *rdata = event->body.tsx_state.src.rdata; pjsip_tx_data *tdata; + pj_bool_t is_unreg; /* reset current op */ + is_unreg = (regc->current_op == REGC_UNREGISTERING); regc->current_op = REGC_IDLE; if (update_contact) { @@ -1205,7 +1211,7 @@ static void regc_tsx_callback(void *token, pjsip_event *event) pj_lock_release(regc->lock); call_callback(regc, status, tsx->status_code, &rdata->msg_info.msg->line.status.reason, - rdata, -1, 0, NULL); + rdata, -1, 0, NULL, is_unreg); pj_lock_acquire(regc->lock); } } @@ -1294,7 +1300,7 @@ static void regc_tsx_callback(void *token, pjsip_event *event) pj_lock_release(regc->lock); call_callback(regc, status, tsx->status_code, &rdata->msg_info.msg->line.status.reason, - rdata, -1, 0, NULL); + rdata, -1, 0, NULL, PJ_FALSE); pj_lock_acquire(regc->lock); } } @@ -1309,6 +1315,7 @@ handle_err: pj_int32_t expiration = NOEXP; unsigned contact_cnt = 0; pjsip_contact_hdr *contact[PJSIP_REGC_MAX_CONTACT]; + pj_bool_t is_unreg; if (tsx->status_code/100 == 2) { @@ -1333,6 +1340,7 @@ handle_err: regc->expires = expiration; /* Mark operation as complete */ + is_unreg = (regc->current_op == REGC_UNREGISTERING); regc->current_op = REGC_IDLE; /* Call callback. */ @@ -1344,7 +1352,7 @@ handle_err: (rdata ? &rdata->msg_info.msg->line.status.reason : &tsx->status_text), rdata, expiration, - contact_cnt, contact); + contact_cnt, contact, is_unreg); pj_lock_acquire(regc->lock); } diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index 3923be3e..1a294c20 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -2304,7 +2304,7 @@ static void regc_cb(struct pjsip_regc_cbparam *param) pjsip_regc_get_info(param->regc, &rinfo); reg_info.cbparam = param; reg_info.regc = param->regc; - reg_info.renew = (rinfo.interval != 0); + reg_info.renew = !param->is_unreg; (*pjsua_var.ua_cfg.cb.on_reg_state2)(acc->index, ®_info); } |