SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_var_check(switch_channel_t *channel,
const char *varname, const char *value, switch_bool_t var_check);
+SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_strip_quotes_var_check(switch_channel_t *channel,
+ const char *varname, const char *value, switch_bool_t var_check);
SWITCH_DECLARE(switch_status_t) switch_channel_add_variable_var_check(switch_channel_t *channel,
const char *varname, const char *value, switch_bool_t var_check, switch_stack_t stack);
SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_printf(switch_channel_t *channel, const char *varname, const char *fmt, ...);
#define switch_channel_set_variable_safe(_channel, _var, _val) switch_channel_set_variable_var_check(_channel, _var, _val, SWITCH_FALSE)
#define switch_channel_set_variable(_channel, _var, _val) switch_channel_set_variable_var_check(_channel, _var, _val, SWITCH_TRUE)
+#define switch_channel_set_variable_strip_quotes(_channel, _var, _val) switch_channel_set_variable_strip_quotes_var_check(_channel, _var, _val, SWITCH_TRUE)
#define switch_channel_set_variable_partner(_channel, _var, _val) switch_channel_set_variable_partner_var_check(_channel, _var, _val, SWITCH_TRUE)
return uri;
}
-static char *strip_quotes(const char *in)
-{
- char *t = (char *) in;
- char *r = (char *) in;
-
- if (t && *t == '"') {
- t++;
-
- if (end_of(t) == '"') {
- r = strdup(t);
- switch_assert(r);
- end_of(r) = '\0';
- }
- }
-
- return r;
-}
-
static void extract_header_vars(sofia_profile_t *profile, sip_t const *sip,
switch_core_session_t *session, nua_handle_t *nh)
{
}
if (sip->sip_from) {
- char *p = strip_quotes(sip->sip_from->a_display);
+ switch_channel_set_variable_strip_quotes(channel, "sip_from_display", sip->sip_from->a_display);
- if (p) {
- switch_channel_set_variable(channel, "sip_from_display", p);
- }
- if (p != sip->sip_from->a_display) free(p);
if ((full = sip_header_as_string(nua_handle_get_home(nh), (void *) sip->sip_from))) {
switch_channel_set_variable(channel, "sip_full_from", full);
su_free(nua_handle_get_home(nh), full);
}
if (sip->sip_to) {
- char *p = strip_quotes(sip->sip_to->a_display);
-
- if (p) {
- switch_channel_set_variable(channel, "sip_to_display", p);
- }
-
- if (p != sip->sip_to->a_display) free(p);
+ switch_channel_set_variable_strip_quotes(channel, "sip_to_display", sip->sip_to->a_display);
if ((full = sip_header_as_string(nua_handle_get_home(nh), (void *) sip->sip_to))) {
switch_channel_set_variable(channel, "sip_full_to", full);
return status;
}
+SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_strip_quotes_var_check(switch_channel_t *channel,
+ const char *varname, const char *value, switch_bool_t var_check)
+{
+ switch_status_t status = SWITCH_STATUS_FALSE;
+
+ switch_assert(channel != NULL);
+
+ switch_mutex_lock(channel->profile_mutex);
+ if (channel->variables && !zstr(varname)) {
+ if (zstr(value)) {
+ switch_event_del_header(channel->variables, varname);
+ } else {
+ int ok = 1;
+ char *t = (char *)value;
+ char *r = (char *)value;
+
+ if (t && *t == '"') {
+ t++;
+ if (end_of(t) == '"') {
+ r = strdup(t);
+ switch_assert(r);
+ end_of(r) = '\0';
+ }
+ }
+
+ if (var_check) {
+ ok = !switch_string_var_check_const(r);
+ }
+ if (ok) {
+ switch_event_add_header_string(channel->variables, SWITCH_STACK_BOTTOM, varname, r);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_CRIT, "Invalid data (${%s} contains a variable)\n", varname);
+ }
+
+ if (r != value) free(r);
+ }
+ status = SWITCH_STATUS_SUCCESS;
+ }
+ switch_mutex_unlock(channel->profile_mutex);
+
+ return status;
+}
SWITCH_DECLARE(switch_status_t) switch_channel_add_variable_var_check(switch_channel_t *channel,
const char *varname, const char *value, switch_bool_t var_check, switch_stack_t stack)