Close #1675: Added callback to allow application to specify account to handle incoming message.
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@4534 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
parent
590f4e221b
commit
5c4b102f97
|
@ -1276,6 +1276,27 @@ typedef struct pjsua_callback
|
||||||
pjmedia_transport *base_tp,
|
pjmedia_transport *base_tp,
|
||||||
unsigned flags);
|
unsigned flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This callback can be used by application to override the account
|
||||||
|
* to be used to handle an incoming message. Initially, the account to
|
||||||
|
* be used will be calculated automatically by the library. This initial
|
||||||
|
* account will be used if application does not implement this callback,
|
||||||
|
* or application sets an invalid account upon returning from this
|
||||||
|
* callback.
|
||||||
|
*
|
||||||
|
* Note that currently the incoming messages requiring account assignment
|
||||||
|
* are INVITE, MESSAGE, SUBSCRIBE, and unsolicited NOTIFY. This callback
|
||||||
|
* may be called before the callback of the SIP event itself, i.e:
|
||||||
|
* incoming call, pager, subscription, or unsolicited-event.
|
||||||
|
*
|
||||||
|
* @param rdata The incoming message.
|
||||||
|
* @param acc_id On input, initial account ID calculated automatically
|
||||||
|
* by the library. On output, the account ID prefered
|
||||||
|
* by application to handle the incoming message.
|
||||||
|
*/
|
||||||
|
void (*on_acc_find_for_incoming)(const pjsip_rx_data *rdata,
|
||||||
|
pjsua_acc_id* acc_id);
|
||||||
|
|
||||||
} pjsua_callback;
|
} pjsua_callback;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2617,6 +2617,7 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
|
||||||
{
|
{
|
||||||
pjsip_uri *uri;
|
pjsip_uri *uri;
|
||||||
pjsip_sip_uri *sip_uri;
|
pjsip_sip_uri *sip_uri;
|
||||||
|
pjsua_acc_id id = PJSUA_INVALID_ID;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* Check that there's at least one account configured */
|
/* 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;
|
uri = rdata->msg_info.to->uri;
|
||||||
|
|
||||||
|
PJSUA_LOCK();
|
||||||
|
|
||||||
/* Use Req URI if To URI is not SIP */
|
/* Use Req URI if To URI is not SIP */
|
||||||
if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
|
if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
|
||||||
!PJSIP_URI_SCHEME_IS_SIPS(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)
|
if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG)
|
||||||
uri = rdata->msg_info.msg->line.req.uri;
|
uri = rdata->msg_info.msg->line.req.uri;
|
||||||
else
|
else
|
||||||
return pjsua_var.default_acc;
|
goto on_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Just return default account if both To and Req URI are not SIP: */
|
/* Just return default account if both To and Req URI are not SIP: */
|
||||||
if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
|
if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
|
||||||
!PJSIP_URI_SCHEME_IS_SIPS(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);
|
sip_uri = (pjsip_sip_uri*)pjsip_uri_get_uri(uri);
|
||||||
|
|
||||||
/* Find account which has matching username and domain. */
|
/* 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)
|
pj_stricmp(&acc->srv_domain, &sip_uri->host)==0)
|
||||||
{
|
{
|
||||||
/* Match ! */
|
/* Match ! */
|
||||||
PJSUA_UNLOCK();
|
id = acc_id;
|
||||||
return 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) {
|
if (acc->valid && pj_stricmp(&acc->srv_domain, &sip_uri->host)==0) {
|
||||||
/* Match ! */
|
/* Match ! */
|
||||||
PJSUA_UNLOCK();
|
id = acc_id;
|
||||||
return acc_id;
|
goto on_return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2690,14 +2690,27 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Match ! */
|
/* Match ! */
|
||||||
PJSUA_UNLOCK();
|
id = acc_id;
|
||||||
return acc_id;
|
goto on_return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Still no match, use default account */
|
on_return:
|
||||||
PJSUA_UNLOCK();
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue