summaryrefslogtreecommitdiff
path: root/res/parking/parking_bridge_features.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2013-10-22 16:33:16 +0000
committerRichard Mudgett <rmudgett@digium.com>2013-10-22 16:33:16 +0000
commit8f03a463e1e04384fc8d5609d318566de2c7437b (patch)
tree7f9b0ff842e5de6165bc37cff9b93d4cfac94b42 /res/parking/parking_bridge_features.c
parentc17731620dd2da8e241d538484a8f8111d6513bc (diff)
res_parking: Give parking timeout comebacktoorigin channel DTMF features.
Parking timeouts did not set any DTMF features for the channel calling the parker back. * Added code to set the parkedcalltransfers, parkedcallreparking, parkedcallhangup, and parkedcallrecording options appropriately for the channels when a parking timeout occurs. The recall channel DTMF options are set using the BRIDGE_FEATURES channel variable to allow the other timeout options to have the DTMF features available. (closes issue ASTERISK-22630) Reported by: Kevin Harwell Review: https://reviewboard.asterisk.org/r/2942/ ........ Merged revisions 401422 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@401423 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/parking/parking_bridge_features.c')
-rw-r--r--res/parking/parking_bridge_features.c51
1 files changed, 44 insertions, 7 deletions
diff --git a/res/parking/parking_bridge_features.c b/res/parking/parking_bridge_features.c
index 6c1d4d65e..4f39e2e94 100644
--- a/res/parking/parking_bridge_features.c
+++ b/res/parking/parking_bridge_features.c
@@ -452,6 +452,43 @@ static int feature_park_call(struct ast_bridge_channel *bridge_channel, void *ho
return parking_park_call(bridge_channel, NULL, 0);
}
+/*!
+ * \internal
+ * \brief Setup the caller features for when that channel is dialed.
+ * \since 12.0.0
+ *
+ * \param chan Parked channel leaving the parking lot.
+ * \param cfg Parking lot configuration.
+ *
+ * \return Nothing
+ */
+static void parking_timeout_set_caller_features(struct ast_channel *chan, struct parking_lot_cfg *cfg)
+{
+ char features[5];
+ char *pos;
+
+ /*
+ * We are setting the callee Dial flag values because in the
+ * timeout case, the caller is who is being called back.
+ */
+ pos = features;
+ if (cfg->parkedcalltransfers & AST_FEATURE_FLAG_BYCALLER) {
+ *pos++ = 't';
+ }
+ if (cfg->parkedcallreparking & AST_FEATURE_FLAG_BYCALLER) {
+ *pos++ = 'k';
+ }
+ if (cfg->parkedcallhangup & AST_FEATURE_FLAG_BYCALLER) {
+ *pos++ = 'h';
+ }
+ if (cfg->parkedcallrecording & AST_FEATURE_FLAG_BYCALLER) {
+ *pos++ = 'x';
+ }
+ *pos = '\0';
+
+ pbx_builtin_setvar_helper(chan, "BRIDGE_FEATURES", features);
+}
+
/*! \internal
* \brief Interval hook. Pulls a parked call from the parking bridge after the timeout is passed and sets the resolution to timeout.
*
@@ -481,25 +518,26 @@ static int parking_duration_callback(struct ast_bridge_channel *bridge_channel,
ao2_unlock(user);
return -1;
}
-
user->resolution = PARK_TIMEOUT;
ao2_unlock(user);
ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE,
AST_CAUSE_NORMAL_CLEARING);
+ dial_string = user->parker_dial_string;
+ dial_string_flat = ast_strdupa(dial_string);
+ flatten_dial_string(dial_string_flat);
+
/* Set parking timeout channel variables */
snprintf(parking_space, sizeof(parking_space), "%d", user->parking_space);
+ ast_channel_stage_snapshot(chan);
pbx_builtin_setvar_helper(chan, "PARKING_SPACE", parking_space);
pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parking_space); /* Deprecated version of PARKING_SPACE */
pbx_builtin_setvar_helper(chan, "PARKEDLOT", user->lot->name);
-
- dial_string = user->parker_dial_string;
- dial_string_flat = ast_strdupa(dial_string);
- flatten_dial_string(dial_string_flat);
-
pbx_builtin_setvar_helper(chan, "PARKER", dial_string);
pbx_builtin_setvar_helper(chan, "PARKER_FLAT", dial_string_flat);
+ parking_timeout_set_caller_features(chan, user->lot->cfg);
+ ast_channel_stage_snapshot_done(chan);
/* Dialplan generation for park-dial extensions */
@@ -532,7 +570,6 @@ static int parking_duration_callback(struct ast_bridge_channel *bridge_channel,
user->lot->cfg->comebackdialtime);
duplicate_returnexten = ast_strdup(returnexten);
-
if (!duplicate_returnexten) {
ast_log(LOG_ERROR, "Failed to create parking redial parker extension %s@%s - Dial(%s)\n",
dial_string_flat, PARK_DIAL_CONTEXT, returnexten);