summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2016-06-24 13:03:25 +0000
committerNanang Izzuddin <nanang@teluu.com>2016-06-24 13:03:25 +0000
commitb6286dbe1a6fef17f94c0483bd20c5dab1212bd8 (patch)
treea29d71a06506305e8bdf2fd3aa86dd5933cbde76
parent13c39fa2ab87b1e08c0780b143c974402c479f8e (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.h1
-rw-r--r--pjsip/src/pjsip-ua/sip_reg.c24
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c2
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, &reg_info);
}