diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index 1f7f733aef..5529d9af66 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -245,6 +245,11 @@ SWITCH_DECLARE(const char *) switch_channel_get_variable_partner(switch_channel_ #define switch_channel_set_variable(_channel, _var, _val) switch_channel_set_variable_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) + +SWITCH_DECLARE(switch_status_t) switch_channel_export_variable_var_check(switch_channel_t *channel, const char *varname, const char *value, switch_bool_t var_check, switch_bool_t nolocal); + +#define switch_channel_export_variable(_channel, _varname, _value, _nolocal) switch_channel_export_variable_var_check(_channel, _varname, _value, SWITCH_TRUE, _nolocal) + /*! \brief Retrieve a variable from a given channel \param channel channel to retrieve variable from diff --git a/src/switch_channel.c b/src/switch_channel.c index fe661d4d66..ba9429721a 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -737,6 +737,37 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_profile_var(switch_channel_t return status; } +SWITCH_DECLARE(switch_status_t) switch_channel_export_variable_var_check(switch_channel_t *channel, const char *varname, const char *value, switch_bool_t var_check, switch_bool_t nolocal) +{ + const char *exports, *exports_varname = varname; + switch_status_t status; + + exports = switch_channel_get_variable(channel, SWITCH_EXPORT_VARS_VARIABLE); + + if (nolocal) { + exports_varname = switch_mprintf("nolocal:%s", varname); + } + + if ((status = switch_channel_set_variable_var_check(channel, exports_varname, value, var_check)) != SWITCH_STATUS_SUCCESS) { + goto done; + } + + if (varname && value) { + if (exports) { + switch_channel_set_variable_printf(channel, SWITCH_EXPORT_VARS_VARIABLE, "%s,%s", exports, exports_varname); + } else { + switch_channel_set_variable(channel, SWITCH_EXPORT_VARS_VARIABLE, exports_varname); + } + } + +done: + if (exports_varname != varname) { + free((char*)exports_varname); + } + + return status; +} + 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) {