diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index 255516893d..49b563134c 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -210,6 +210,15 @@ SWITCH_DECLARE(char *) switch_channel_get_uuid(switch_channel_t *channel); */ SWITCH_DECLARE(switch_status_t) switch_channel_set_variable(switch_channel_t *channel, const char *varname, const char *value); +/*! + \brief Set a variable on a given channel, without duplicating the value from the session pool. + \param channel channel to set variable on + \param varname the name of the variable + \param value the vaule of the variable (MUST BE ALLOCATED FROM THE SESSION POOL ALREADY) + \returns SWITCH_STATUS_SUCCESS if successful +*/ +SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_nodup(switch_channel_t *channel, const char *varname, char *value); + /*! \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 958cd269b9..77874f7126 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -373,6 +373,23 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_variable(switch_channel_t *ch return SWITCH_STATUS_FALSE; } +SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_nodup(switch_channel_t *channel, const char *varname, char *value) +{ + assert(channel != NULL); + + if (varname) { + switch_core_hash_delete(channel->variables, varname); + if (!switch_strlen_zero(value)) { + switch_core_hash_insert_dup(channel->variables, varname, value); + } else { + switch_core_hash_delete(channel->variables, varname); + } + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; +} + SWITCH_DECLARE(int) switch_channel_test_flag(switch_channel_t *channel, switch_channel_flag_t flags) { assert(channel != NULL);