summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-09-24 10:10:15 +0000
committerBenny Prijono <bennylp@teluu.com>2008-09-24 10:10:15 +0000
commitc2476cfffd0fa7f90ac72295de24ba6dea4ea161 (patch)
tree0a76d346be96d75d14e4ce627f689f76c1914a07 /pjsip/src/pjsua-lib
parent8fa5079ad7ee39493cd3231de2030335ad56eccc (diff)
Ticket #635: Disconnect the other call leg when multiple 2xx/OK responses to INVITE are received due to forking
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2315 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c41
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c8
2 files changed, 48 insertions, 1 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 7eb061cc..546be666 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -2943,6 +2943,47 @@ static void pjsua_call_on_forked( pjsip_inv_session *inv,
/*
+ * Callback from UA layer when forked dialog response is received.
+ */
+pjsip_dialog* on_dlg_forked(pjsip_dialog *dlg, pjsip_rx_data *res)
+{
+ if (dlg->uac_has_2xx &&
+ res->msg_info.cseq->method.id == PJSIP_INVITE_METHOD &&
+ pjsip_rdata_get_tsx(res) == NULL &&
+ res->msg_info.msg->line.status.code/100 == 2)
+ {
+ pjsip_dialog *forked_dlg;
+ pjsip_tx_data *bye;
+ pj_status_t status;
+
+ /* Create forked dialog */
+ status = pjsip_dlg_fork(dlg, res, &forked_dlg);
+ if (status != PJ_SUCCESS)
+ return NULL;
+
+ pjsip_dlg_inc_lock(forked_dlg);
+
+ /* Disconnect the call */
+ status = pjsip_dlg_create_request(forked_dlg, &pjsip_bye_method,
+ -1, &bye);
+ if (status == PJ_SUCCESS) {
+ status = pjsip_dlg_send_request(forked_dlg, bye, -1, NULL);
+ }
+
+ pjsip_dlg_dec_lock(forked_dlg);
+
+ if (status != PJ_SUCCESS) {
+ return NULL;
+ }
+
+ return forked_dlg;
+
+ } else {
+ return dlg;
+ }
+}
+
+/*
* Disconnect call upon error.
*/
static void call_disconnect( pjsip_inv_session *inv,
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 40830d73..650217a2 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -96,6 +96,7 @@ PJ_DEF(void) pjsua_config_default(pjsua_config *cfg)
cfg->use_srtp = PJSUA_DEFAULT_USE_SRTP;
cfg->srtp_secure_signaling = PJSUA_DEFAULT_SRTP_SECURE_SIGNALING;
#endif
+ cfg->hangup_forked_call = PJ_TRUE;
}
PJ_DEF(void) pjsua_config_dup(pj_pool_t *pool,
@@ -622,6 +623,7 @@ PJ_DEF(pj_status_t) pjsua_init( const pjsua_config *ua_cfg,
pjsua_config default_cfg;
pjsua_media_config default_media_cfg;
const pj_str_t STR_OPTIONS = { "OPTIONS", 7 };
+ pjsip_ua_init_param ua_init_param;
pj_status_t status;
@@ -694,7 +696,11 @@ PJ_DEF(pj_status_t) pjsua_init( const pjsua_config *ua_cfg,
/* Initialize UA layer module: */
- status = pjsip_ua_init_module( pjsua_var.endpt, NULL );
+ pj_bzero(&ua_init_param, sizeof(ua_init_param));
+ if (ua_cfg->hangup_forked_call) {
+ ua_init_param.on_dlg_forked = &on_dlg_forked;
+ }
+ status = pjsip_ua_init_module( pjsua_var.endpt, &ua_init_param);
PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);