From fbf720db91ae8942e9c2ba092179ab2352d44b06 Mon Sep 17 00:00:00 2001 From: Jonathan Rose Date: Thu, 3 Sep 2015 14:07:35 -0500 Subject: ParkAndAnnounce: Add variable inheritance In Asterisk 11, the announcer channel would receive channel variables from the channel being parked by means of normal channel inheritance. This functionality was lost during the big res_parking project in Asterisk 12. This patch restores that functionality. ASTERISK-25369 #close Review: https://gerrit.asterisk.org/#/c/1180/ Change-Id: Ie47e618330114ad2ea91e2edcef1cb6f341eed6e --- res/parking/parking_applications.c | 65 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/res/parking/parking_applications.c b/res/parking/parking_applications.c index 733c943ab..d8cda6f50 100644 --- a/res/parking/parking_applications.c +++ b/res/parking/parking_applications.c @@ -694,6 +694,68 @@ static struct park_announce_subscription_data *park_announce_subscription_data_c return pa_data; } +/*! \internal + * \brief Gathers inheritable channel variables from a channel by name. + * + * \param oh outgoing helper struct we are bestowing inheritable variables to + * \param channel_id name or uniqueID of the channel to inherit variables from + * + * \return Nothing + */ +static void inherit_channel_vars_from_id(struct outgoing_helper *oh, const char *channel_id) +{ + struct ast_channel *chan = ast_channel_get_by_name(channel_id); + struct ast_var_t *current; + struct ast_variable *newvar; + const char *varname; + int vartype; + + + if (!chan) { + /* Already gone */ + return; + } + + ast_channel_lock(chan); + + AST_LIST_TRAVERSE(ast_channel_varshead((struct ast_channel *) chan), current, entries) { + varname = ast_var_full_name(current); + if (!varname) { + continue; + } + + vartype = 0; + if (varname[0] == '_') { + vartype = 1; + if (varname[1] == '_') { + vartype = 2; + } + } + + switch (vartype) { + case 1: + newvar = ast_variable_new(&varname[1], ast_var_value(current), ""); + break; + case 2: + newvar = ast_variable_new(varname, ast_var_value(current), ""); + break; + default: + continue; + } + if (newvar) { + ast_debug(1, "Inheriting variable %s from %s.\n", + newvar->name, ast_channel_name(chan)); + if (oh->vars) { + newvar->next = oh->vars; + oh->vars = newvar; + } + } + } + + ast_channel_unlock(chan); + ast_channel_cleanup(chan); +} + static void announce_to_dial(char *dial_string, char *announce_string, int parkingspace, struct ast_channel_snapshot *parkee_snapshot) { struct ast_channel *dchan; @@ -715,6 +777,9 @@ static void announce_to_dial(char *dial_string, char *announce_string, int parki snprintf(buf, sizeof(buf), "%d", parkingspace); oh.vars = ast_variable_new("_PARKEDAT", buf, ""); + + inherit_channel_vars_from_id(&oh, parkee_snapshot->uniqueid); + dchan = __ast_request_and_dial(dial_tech, cap_slin, NULL, NULL, dial_string, 30000, &outstate, parkee_snapshot->caller_number, -- cgit v1.2.3