summaryrefslogtreecommitdiff
path: root/res/parking/parking_bridge.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2016-03-18 14:01:02 -0500
committerRichard Mudgett <rmudgett@digium.com>2016-03-25 18:27:20 -0500
commita4189763ab562ee2e8e79fda60b213ee90aab6f1 (patch)
treeefb672e9f605011f11ad227e7fa6f7b2eff3121c /res/parking/parking_bridge.c
parent01150597f60cb0e4b906b2bf2b94188bb3b6ca14 (diff)
res_parking: Misc fixes.
res/parking/parking_applications.c: * Add malloc fail checks in setup_park_common_datastore(). * Fix playing parking failed announcement to only happen on non-blind transfers in park_app_exec(). It could never go out before because a test was provedly always false. res/parking/parking_bridge.c: * Fix NULL tolerance in generate_parked_user() because bridge_parking_push() can theoretically pass a NULL parker channel if the parker channel went away for some reason. * Clarify some weird code dealing with blind_transfer in bridge_parking_push(). res/parking/parking_bridge_features.c: * Made park_local_transfer() set BLINDTRANSFER on the Local;1 channel which will be bulk copied to the Local;2 channel on the subsequent ast_call(). The additional advantage is if the parker channel has the BLINDTRANSFER and ATTENDEDTRANSFER variables set they are now guaranteed to be overridden. res/parking/parking_manager.c: * Fix AMI Park action input range checking of the Timeout header in manager_park(). * Reduced locking scope to where needed in manager_park(). res/res_parking.c: * Fix some off nominal missing unlocks by eliminating the returns. Change-Id: Ib64945bc285acb05a306dc12e6f16854898915ca
Diffstat (limited to 'res/parking/parking_bridge.c')
-rw-r--r--res/parking/parking_bridge.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/res/parking/parking_bridge.c b/res/parking/parking_bridge.c
index 4f7198b4f..e61486e3c 100644
--- a/res/parking/parking_bridge.c
+++ b/res/parking/parking_bridge.c
@@ -167,7 +167,7 @@ static struct parked_user *generate_parked_user(struct parking_lot *lot, struct
if (parker_dial_string) {
new_parked_user->parker_dial_string = ast_strdup(parker_dial_string);
} else {
- if (parked_user_set_parker_dial_string(new_parked_user, parker)) {
+ if (!parker || parked_user_set_parker_dial_string(new_parked_user, parker)) {
ao2_ref(new_parked_user, -1);
ao2_unlock(lot);
return NULL;
@@ -269,14 +269,11 @@ static int bridge_parking_push(struct ast_bridge_parking *self, struct ast_bridg
* the park application. It's possible that the channel that transferred it is still alive (particularly
* when a multichannel bridge is parked), so try to get the real parker if possible. */
ast_channel_lock(bridge_channel->chan);
- blind_transfer = S_OR(pbx_builtin_getvar_helper(bridge_channel->chan, "BLINDTRANSFER"),
- ast_channel_name(bridge_channel->chan));
- if (blind_transfer) {
- blind_transfer = ast_strdupa(blind_transfer);
- }
+ blind_transfer = pbx_builtin_getvar_helper(bridge_channel->chan, "BLINDTRANSFER");
+ blind_transfer = ast_strdupa(S_OR(blind_transfer, ""));
ast_channel_unlock(bridge_channel->chan);
-
- if (parker == bridge_channel->chan) {
+ if ((!parker || parker == bridge_channel->chan)
+ && !ast_strlen_zero(blind_transfer)) {
struct ast_channel *real_parker = ast_channel_get_by_name(blind_transfer);
if (real_parker) {
@@ -300,8 +297,8 @@ static int bridge_parking_push(struct ast_bridge_parking *self, struct ast_bridg
/* Generate ParkedCall Stasis Message */
publish_parked_call(pu, PARKED_CALL);
- /* If the parkee and the parker are the same and silence_announce isn't set, play the announcement to the parkee */
- if (!strcmp(blind_transfer, ast_channel_name(bridge_channel->chan)) && !park_datastore->silence_announce) {
+ /* If not a blind transfer and silence_announce isn't set, play the announcement to the parkee */
+ if (ast_strlen_zero(blind_transfer) && !park_datastore->silence_announce) {
char saynum_buf[16];
snprintf(saynum_buf, sizeof(saynum_buf), "%d %d", 0, pu->parking_space);