diff options
Diffstat (limited to 'pjsip/src/pjsip-ua/sip_reg.c')
-rw-r--r-- | pjsip/src/pjsip-ua/sip_reg.c | 24 |
1 files changed, 16 insertions, 8 deletions
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); } |