summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2013-06-13 08:56:51 +0000
committerNanang Izzuddin <nanang@teluu.com>2013-06-13 08:56:51 +0000
commit52dd1574caa10229ec5e672b817c75e4793d2409 (patch)
treebc877281b1e2e0a36000c8562cac6435d02357c3 /pjsip/src/pjsua-lib
parentd6ba39f9ca6c2054967ffa87275dc6b334ab3e1e (diff)
Close #1675: Added callback to allow application to specify account to handle incoming message.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4534 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 492e0594..842ad179 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -2617,6 +2617,7 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
{
pjsip_uri *uri;
pjsip_sip_uri *sip_uri;
+ pjsua_acc_id id = PJSUA_INVALID_ID;
unsigned i;
/* Check that there's at least one account configured */
@@ -2624,6 +2625,8 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
uri = rdata->msg_info.to->uri;
+ PJSUA_LOCK();
+
/* Use Req URI if To URI is not SIP */
if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
!PJSIP_URI_SCHEME_IS_SIPS(uri))
@@ -2631,19 +2634,16 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG)
uri = rdata->msg_info.msg->line.req.uri;
else
- return pjsua_var.default_acc;
+ goto on_return;
}
/* Just return default account if both To and Req URI are not SIP: */
if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
!PJSIP_URI_SCHEME_IS_SIPS(uri))
{
- return pjsua_var.default_acc;
+ goto on_return;
}
-
- PJSUA_LOCK();
-
sip_uri = (pjsip_sip_uri*)pjsip_uri_get_uri(uri);
/* Find account which has matching username and domain. */
@@ -2655,8 +2655,8 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
pj_stricmp(&acc->srv_domain, &sip_uri->host)==0)
{
/* Match ! */
- PJSUA_UNLOCK();
- return acc_id;
+ id = acc_id;
+ goto on_return;
}
}
@@ -2667,8 +2667,8 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
if (acc->valid && pj_stricmp(&acc->srv_domain, &sip_uri->host)==0) {
/* Match ! */
- PJSUA_UNLOCK();
- return acc_id;
+ id = acc_id;
+ goto on_return;
}
}
@@ -2690,14 +2690,27 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
}
/* Match ! */
- PJSUA_UNLOCK();
- return acc_id;
+ id = acc_id;
+ goto on_return;
}
}
- /* Still no match, use default account */
+on_return:
PJSUA_UNLOCK();
- return pjsua_var.default_acc;
+
+ /* Still no match, use default account */
+ if (id == PJSUA_INVALID_ID)
+ id = pjsua_var.default_acc;
+
+ /* Invoke account find callback */
+ if (pjsua_var.ua_cfg.cb.on_acc_find_for_incoming)
+ (*pjsua_var.ua_cfg.cb.on_acc_find_for_incoming)(rdata, &id);
+
+ /* Verify if the specified account id is valid */
+ if (!pjsua_acc_is_valid(id))
+ id = pjsua_var.default_acc;
+
+ return id;
}