From: Anthony Minessale Date: Wed, 27 Feb 2013 15:04:51 +0000 (-0600) Subject: FS-5118 take 2 X-Git-Tag: v1.3.13~10^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fc1316601b7169b6ff1a8b88c71e8f4ee0c53572;p=thirdparty%2Ffreeswitch.git FS-5118 take 2 --- diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 9fecaceacf..f0d0ab280b 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -4687,10 +4687,7 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session * */ - if ((params = strchr(dest, '+'))) { - *params = ';'; - params = NULL; - } else if ((params = strchr(dest, ';'))) { + if ((params = strchr(dest, ';'))) { char *tp_param; *params++ = '\0'; diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index ee4776de51..de32b2c7c3 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -1046,7 +1046,7 @@ void sofia_presence_set_hash_key(char *hash_key, int32_t len, sip_t const *sip); void sofia_glue_sql_close(sofia_profile_t *profile, time_t prune); int sofia_glue_init_sql(sofia_profile_t *profile); char *sofia_overcome_sip_uri_weakness(switch_core_session_t *session, const char *uri, const sofia_transport_t transport, switch_bool_t uri_only, - const char *params); + const char *params, const char *invite_tel_params); switch_bool_t sofia_glue_execute_sql_callback(sofia_profile_t *profile, switch_mutex_t *mutex, char *sql, switch_core_db_callback_func_t callback, void *pdata); char *sofia_glue_execute_sql2str(sofia_profile_t *profile, switch_mutex_t *mutex, char *sql, char *resbuf, size_t len); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 69d6fd7269..b8eaff50dd 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -8060,7 +8060,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); } - tmp = sofia_overcome_sip_uri_weakness(session, url, transport, SWITCH_TRUE, NULL); + tmp = sofia_overcome_sip_uri_weakness(session, url, transport, SWITCH_TRUE, NULL, NULL); if ((at = strchr(tmp, '@'))) { url = switch_core_session_sprintf(session, "sip:%s%s", user, at); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 15f6d529f2..78ba3c2132 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1447,12 +1447,13 @@ void sofia_glue_get_addr(msg_t *msg, char *buf, size_t buflen, int *port) } char *sofia_overcome_sip_uri_weakness(switch_core_session_t *session, const char *uri, const sofia_transport_t transport, switch_bool_t uri_only, - const char *params) + const char *params, const char *invite_tel_params) { char *stripped = switch_core_session_strdup(session, uri); char *new_uri = NULL; char *p; + stripped = sofia_glue_get_url_from_contact(stripped, 0); /* remove our params so we don't make any whiny moronic device piss it's pants and forget who it is for a half-hour */ @@ -1496,6 +1497,18 @@ char *sofia_overcome_sip_uri_weakness(switch_core_session_t *session, const char } } + + + if (!zstr(invite_tel_params)) { + char *lhs, *rhs = strchr(new_uri, '@'); + + if (!zstr(rhs)) { + *rhs++ = '\0'; + lhs = new_uri; + new_uri = switch_core_session_sprintf(session, "%s;%s@%s", lhs, invite_tel_params, rhs); + } + } + return new_uri; } @@ -2191,6 +2204,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) const char *screen = "no"; const char *invite_params = switch_channel_get_variable(tech_pvt->channel, "sip_invite_params"); const char *invite_to_params = switch_channel_get_variable(tech_pvt->channel, "sip_invite_to_params"); + const char *invite_tel_params = switch_channel_get_variable(switch_core_session_get_channel(session), "sip_invite_tel_params"); const char *invite_to_uri = switch_channel_get_variable(tech_pvt->channel, "sip_invite_to_uri"); const char *invite_from_uri = switch_channel_get_variable(tech_pvt->channel, "sip_invite_from_uri"); const char *invite_contact_params = switch_channel_get_variable(tech_pvt->channel, "sip_invite_contact_params"); @@ -2199,6 +2213,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) const char *from_display = switch_channel_get_variable(tech_pvt->channel, "sip_from_display"); const char *invite_req_uri = switch_channel_get_variable(tech_pvt->channel, "sip_invite_req_uri"); const char *invite_domain = switch_channel_get_variable(tech_pvt->channel, "sip_invite_domain"); + const char *use_name, *use_number; if (zstr(tech_pvt->dest)) { @@ -2335,10 +2350,10 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) } } - url_str = sofia_overcome_sip_uri_weakness(session, url, tech_pvt->transport, SWITCH_TRUE, invite_params); - invite_contact = sofia_overcome_sip_uri_weakness(session, tech_pvt->invite_contact, tech_pvt->transport, SWITCH_FALSE, invite_contact_params); - from_str = sofia_overcome_sip_uri_weakness(session, invite_from_uri ? invite_from_uri : use_from_str, 0, SWITCH_TRUE, invite_from_params); - to_str = sofia_overcome_sip_uri_weakness(session, invite_to_uri ? invite_to_uri : tech_pvt->dest_to, 0, SWITCH_FALSE, invite_to_params); + url_str = sofia_overcome_sip_uri_weakness(session, url, tech_pvt->transport, SWITCH_TRUE, invite_params, invite_tel_params); + invite_contact = sofia_overcome_sip_uri_weakness(session, tech_pvt->invite_contact, tech_pvt->transport, SWITCH_FALSE, invite_contact_params, NULL); + from_str = sofia_overcome_sip_uri_weakness(session, invite_from_uri ? invite_from_uri : use_from_str, 0, SWITCH_TRUE, invite_from_params, NULL); + to_str = sofia_overcome_sip_uri_weakness(session, invite_to_uri ? invite_to_uri : tech_pvt->dest_to, 0, SWITCH_FALSE, invite_to_params, NULL); switch_channel_set_variable(channel, "sip_outgoing_contact_uri", invite_contact); @@ -2603,7 +2618,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) dst = sofia_glue_get_destination(tech_pvt->dest); if (dst->route_uri) { - route_uri = sofia_overcome_sip_uri_weakness(tech_pvt->session, dst->route_uri, tech_pvt->transport, SWITCH_TRUE, NULL); + route_uri = sofia_overcome_sip_uri_weakness(tech_pvt->session, dst->route_uri, tech_pvt->transport, SWITCH_TRUE, NULL, NULL); } if (dst->route) {