summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-07-02 14:22:35 +0000
committerBenny Prijono <bennylp@teluu.com>2006-07-02 14:22:35 +0000
commit713d5d262d7cf03d499a4b2ea06fac1dc5367d89 (patch)
tree74e14857b466bb597d141f534568eef94681bb37 /pjsip
parenta293625a363645b1d9b1eaede805526ec64c8c64 (diff)
Disconnect call when failed to start media when sending 200/OK response in pjsua, also pjsua should not try to force terminate dialog after sending 500 response
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@574 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index a40dceb9..466d9818 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -409,6 +409,8 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata,
PJSIP_SC_BUSY_HERE, NULL,
NULL, NULL);
+ PJ_LOG(2,(THIS_FILE,
+ "Unable to accept incoming call (too many calls)"));
return PJ_TRUE;
}
@@ -458,8 +460,20 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
/* Create invite session: */
status = pjsip_inv_create_uas( dlg, rdata, answer, 0, &inv);
if (status != PJ_SUCCESS) {
- pjsip_dlg_respond(dlg, rdata, 500, NULL, NULL, NULL);
+ pjsip_hdr hdr_list;
+ pjsip_warning_hdr *w;
+
+ w = pjsip_warning_hdr_create_from_status(dlg->pool,
+ pjsip_endpt_name(pjsua_var.endpt),
+ status);
+ pj_list_init(&hdr_list);
+ pj_list_push_back(&hdr_list, w);
+
+ pjsip_dlg_respond(dlg, rdata, 500, NULL, &hdr_list, NULL);
+
+ /* Can't terminate dialog because transaction is in progress.
pjsip_dlg_terminate(dlg);
+ */
return PJ_TRUE;
}
@@ -1701,6 +1715,20 @@ static void pjsua_call_on_forked( pjsip_inv_session *inv,
/*
+ * Disconnect call upon error.
+ */
+static void call_disconnect( pjsip_inv_session *inv,
+ int code )
+{
+ pjsip_tx_data *tdata;
+ pj_status_t status;
+
+ status = pjsip_inv_end_session(inv, code, NULL, &tdata);
+ if (status == PJ_SUCCESS)
+ pjsip_inv_send_msg(inv, tdata);
+}
+
+/*
* Callback to be called when SDP offer/answer negotiation has just completed
* in the session. This function will start/update media if negotiation
* has succeeded.
@@ -1778,7 +1806,7 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Unable to create media session",
status);
- //call_disconnect(inv, PJSIP_SC_UNSUPPORTED_MEDIA_TYPE);
+ call_disconnect(inv, PJSIP_SC_UNSUPPORTED_MEDIA_TYPE);
PJSUA_UNLOCK();
return;
}