提交 941052b6 authored 作者: Anthony Minessale's avatar Anthony Minessale

allow <params> tag in gateways as well as <variables> with direction…

allow <params> tag in gateways as well as <variables> with direction inbound/outbound (default both) and call counter

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11468 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 cba7c53e
......@@ -315,6 +315,7 @@ struct sofia_gateway {
char *register_password;
char *register_from;
char *register_contact;
char *extension;
char *register_to;
char *register_proxy;
char *register_sticky_proxy;
......@@ -334,7 +335,10 @@ struct sofia_gateway {
reg_state_t state;
switch_memory_pool_t *pool;
int deleted;
switch_event_t *vars;
switch_event_t *ib_vars;
switch_event_t *ob_vars;
uint32_t ib_calls;
uint32_t ob_calls;
char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1];
int failures;
struct sofia_gateway *next;
......
......@@ -953,7 +953,7 @@ static void parse_gateway_subscriptions(sofia_profile_t *profile, sofia_gateway_
static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
{
switch_xml_t gateway_tag, param, gw_subs_tag;
switch_xml_t gateway_tag, param = NULL, x_params, gw_subs_tag;
sofia_gateway_t *gp;
for (gateway_tag = switch_xml_child(gateways_tag, "gateway"); gateway_tag; gateway_tag = gateway_tag->next) {
......@@ -1001,8 +1001,55 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
gateway->next = NULL;
gateway->ping = 0;
gateway->ping_freq = 0;
if ((x_params = switch_xml_child(gateway_tag, "variables"))) {
param = switch_xml_child(x_params, "variable");
} else {
param = switch_xml_child(gateway_tag, "variable");
}
for (; param; param = param->next) {
const char *var = switch_xml_attr(param, "name");
const char *val = switch_xml_attr(param, "value");
const char *direction = switch_xml_attr(param, "direction");
int in = 0, out = 0;
if (var && val) {
if (direction) {
if (!strcasecmp(direction, "inbound")) {
in = 1;
} else if (!strcasecmp(direction, "outbound")) {
out = 1;
}
} else {
in = out = 1;
}
if (in) {
if (!gateway->ib_vars) {
switch_event_create(&gateway->ib_vars, SWITCH_EVENT_GENERAL);
}
switch_event_add_header_string(gateway->ib_vars, SWITCH_STACK_BOTTOM, var, val);
}
if (out) {
if (!gateway->ob_vars) {
switch_event_create(&gateway->ob_vars, SWITCH_EVENT_GENERAL);
}
switch_event_add_header_string(gateway->ob_vars, SWITCH_STACK_BOTTOM, var, val);
}
}
}
for (param = switch_xml_child(gateway_tag, "param"); param; param = param->next) {
if ((x_params = switch_xml_child(gateway_tag, "params"))) {
param = switch_xml_child(x_params, "param");
} else {
param = switch_xml_child(gateway_tag, "param");
}
for (; param; param = param->next) {
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
......@@ -1144,12 +1191,13 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
gateway->register_from = switch_core_sprintf(gateway->pool, "<sip:%s@%s;transport=%s>", from_user, from_domain, register_transport);
sipip = profile->extsipip ? profile->extsipip : profile->sipip;
format = strchr(sipip, ':') ? "<sip:%s@[%s]:%d%s>" : "<sip:%s@%s:%d%s>";
gateway->register_contact = switch_core_sprintf(gateway->pool, format, extension,
format = strchr(sipip, ':') ? "<sip:gw+%s@[%s]:%d%s>" : "<sip:gw+%s@%s:%d%s>";
gateway->extension = switch_core_strdup(gateway->pool, extension);
gateway->register_contact = switch_core_sprintf(gateway->pool, format, gateway->name,
sipip,
sofia_glue_transport_has_tls(gateway->register_transport) ? profile->tls_sip_port : profile->
sip_port, params);
sofia_glue_transport_has_tls(gateway->register_transport) ?
profile->tls_sip_port : profile->sip_port, params);
if (!strncasecmp(proxy, "sip:", 4)) {
gateway->register_proxy = switch_core_strdup(gateway->pool, proxy);
gateway->register_to = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, proxy + 4);
......@@ -4024,6 +4072,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
check_decode(destination_number, session);
}
if (sip->sip_to && sip->sip_to->a_url) {
const char *host, *user;
int port;
......@@ -4174,20 +4223,6 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
switch_channel_set_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE, max_forwards);
}
if (sip->sip_request->rq_url) {
sofia_gateway_t *gateway;
char *from_key;
char *user = (char *) sip->sip_request->rq_url->url_user;
check_decode(user, session);
from_key = switch_core_session_sprintf(session, "sip:%s@%s", user, sip->sip_request->rq_url->url_host);
if ((gateway = sofia_reg_find_gateway(from_key))) {
context = gateway->register_context;
switch_channel_set_variable(channel, "sip_gateway", gateway->name);
sofia_reg_release_gateway(gateway);
}
}
if (!context) {
context = switch_channel_get_variable(channel, "user_context");
}
......@@ -4220,6 +4255,35 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
free(tmp);
}
if (strstr(destination_number, "gw+")) {
const char *gw_name = destination_number + 3;
sofia_gateway_t *gateway;
if (gw_name && (gateway = sofia_reg_find_gateway(gw_name))) {
context = switch_core_session_strdup(session, gateway->register_context);
switch_channel_set_variable(channel, "sip_gateway", gateway->name);
if (gateway->extension) {
destination_number = switch_core_session_strdup(session, gateway->extension);
}
gateway->ib_calls++;
if (gateway->ib_vars) {
switch_event_header_t *hp;
for(hp = gateway->ib_vars->headers; hp; hp = hp->next) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s setting variable [%s]=[%s]\n",
switch_channel_get_name(channel), hp->name, hp->value);
switch_channel_set_variable(channel, hp->name, hp->value);
}
}
sofia_reg_release_gateway(gateway);
}
}
check_decode(displayname, session);
tech_pvt->caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
from_user,
......
......@@ -194,8 +194,11 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now)
switch_core_hash_delete(mod_sofia_globals.gateway_hash, gateway_ptr->register_from);
switch_core_hash_delete(mod_sofia_globals.gateway_hash, gateway_ptr->register_contact);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleted gateway %s\n", gateway_ptr->name);
if (gateway_ptr->vars) {
switch_event_destroy(&gateway_ptr->vars);
if (gateway_ptr->ob_vars) {
switch_event_destroy(&gateway_ptr->ob_vars);
}
if (gateway_ptr->ib_vars) {
switch_event_destroy(&gateway_ptr->ib_vars);
}
} else {
last = gateway_ptr;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论