/*
* Init call subsystem.
*/
pj_status_t pjsua_call_subsys_init(const pjsua_config *cfg)
{
pjsip_inv_callback inv_cb;
unsigned i;
const pj_str_t str_norefersub = { "norefersub", 10 };
const pj_str_t str_trickle_ice = { "trickle-ice", 11 };
pj_status_t status;
/* Init calls array. */
for (i=0; i<PJ_ARRAY_SIZE(pjsua_var.calls); ++i)
reset_call(i);
/* Copy config */
pjsua_config_dup(pjsua_var.pool, &pjsua_var.ua_cfg, cfg);
/* Verify settings */
if (pjsua_var.ua_cfg.max_calls >= PJSUA_MAX_CALLS) {
pjsua_var.ua_cfg.max_calls = PJSUA_MAX_CALLS;
}
/* Check the route URI's and force loose route if required */
for (i=0; i<pjsua_var.ua_cfg.outbound_proxy_cnt; ++i) {
status = normalize_route_uri(pjsua_var.pool,
&pjsua_var.ua_cfg.outbound_proxy[i]);
if (status != PJ_SUCCESS)
return status;
}
/* Initialize invite session callback. */
pj_bzero(&inv_cb, sizeof(inv_cb));
inv_cb.on_state_changed = &pjsua_call_on_state_changed;
inv_cb.on_new_session = &pjsua_call_on_forked;
inv_cb.on_media_update = &pjsua_call_on_media_update;
inv_cb.on_rx_offer2 = &pjsua_call_on_rx_offer;
inv_cb.on_create_offer = &pjsua_call_on_create_offer;
inv_cb.on_tsx_state_changed = &pjsua_call_on_tsx_state_changed;
inv_cb.on_redirected = &pjsua_call_on_redirected;
if (pjsua_var.ua_cfg.cb.on_call_rx_reinvite) {
inv_cb.on_rx_reinvite = &pjsua_call_on_rx_reinvite;
}
/* Initialize invite session module: */
status = pjsip_inv_usage_init(pjsua_var.endpt, &inv_cb);
PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
/* Add "norefersub" in Supported header */
pjsip_endpt_add_capability(pjsua_var.endpt, NULL, PJSIP_H_SUPPORTED,
NULL, 1, &str_norefersub);
/* Add "INFO" in Allow header, for DTMF and video key frame request. */
pjsip_endpt_add_capability(pjsua_var.endpt, NULL, PJSIP_H_ALLOW,
NULL, 1, &pjsip_info_method.name);
/* Add "trickle-ice" in Supported header */
pjsip_endpt_add_capability(pjsua_var.endpt, NULL, PJSIP_H_SUPPORTED,
NULL, 1, &str_trickle_ice);
return status;
}