]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_parking: Fix blind transfer dynamic lots creation. 70/2470/3
authorRichard Mudgett <rmudgett@digium.com>
Sat, 26 Mar 2016 04:19:22 +0000 (23:19 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Sat, 26 Mar 2016 07:52:08 +0000 (02:52 -0500)
Blind transfers to a recognized parking extension need to use the parker's
channel variable values to create the dynamic parking lot.  This is
because there is always only one parker while the parkee may actually be a
multi-party bridge.  A multi-party bridge can never supply the needed
channel variables to create the dynamic parking lot.  In the multi-party
bridge blind transfer scenario, the parker's CHANNEL(parkinglot) value and
channel variables are inherited by the local channel used to park the
bridge.

* In park_common_setup(), make use the parker instead of the parkee to
supply the dynamic parking lot channel variable values.  In all but one
case, the parkee is the same as the parker.  However, in the recognized
parking extension blind transfer scenario for a two party bridge they are
different channels.  For consistency, we need to use the parker channel.

* In park_local_transfer(), pass the CHANNEL(parkinglot) value to the
local channel when blind transferring a multi-party bridge to a recognized
parking extension.

* When a local channel starts a call, the Local;2 side needs to inherit
the CHANNEL(parkinglot) value from Local;1.

The DTMF one-touch parking case wasn't even trying to create dynamic
parking lots before it aborted the attempt.

* In parking_park_call(), add missing code to create a dynamic parking
lot.

A DTMF bridge hook is documented as returning -1 to remove the hook.
Though the hook caller is really coded to accept non-zero.  See the
ast_bridge_hook_callback typedef.

* In feature_park_call(), don't remove the DTMF one-touch parking hook
because of an error.

ASTERISK-24605 #close
Reported by:  Philip Correia
Patches:
      call_park.patch (license #6672) patch uploaded by Philip Correia

Change-Id: I221d3a8fcc181877a1158d17004474d35d8016c9

CHANGES
main/core_unreal.c
res/parking/parking_applications.c
res/parking/parking_bridge_features.c

diff --git a/CHANGES b/CHANGES
index da516efdc2a63719f10fc333ed7d732df5977ab0..4b607b7a2dfa68b9051f6ed8885926386143713b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -250,6 +250,20 @@ Queue
    'queue show'.
 
 
+------------------------------------------------------------------------------
+--- Functionality changes from Asterisk 13.8.0 to Asterisk 13.9.0 ------------
+------------------------------------------------------------------------------
+
+res_parking:
+ - The dynamic parking lot creation channel variables PARKINGDYNAMIC,
+   PARKINGDYNCONTEXT, PARKINGDYNEXTEN, and PARKINGDYNPOS are now looked
+   for in the parker's channel instead of the parked channel.  This is only
+   of significance if the parker uses blind transfer or the DTMF one-step
+   parking feature.  You need to use the double underscore '__' inheritance
+   for these variables.  The indefinite inheritance is also recommended
+   for the PARKINGEXTEN variable.
+
+
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 13.7.0 to Asterisk 13.8.0 ------------
 ------------------------------------------------------------------------------
index 19f2d1f6516668410d03e69800353cb87783d612..da0bb43bba67202f07bdbaa924f7545eaee6759a 100644 (file)
@@ -687,13 +687,13 @@ void ast_unreal_call_setup(struct ast_channel *semi1, struct ast_channel *semi2)
        ast_connected_line_copy_from_caller(ast_channel_connected(semi2), ast_channel_caller(semi1));
 
        ast_channel_language_set(semi2, ast_channel_language(semi1));
+       ast_channel_musicclass_set(semi2, ast_channel_musicclass(semi1));
+       ast_channel_parkinglot_set(semi2, ast_channel_parkinglot(semi1));
 
        /* Crossover the accountcode and peeraccount to cross the unreal bridge. */
        ast_channel_accountcode_set(semi2, ast_channel_peeraccount(semi1));
        ast_channel_peeraccount_set(semi2, ast_channel_accountcode(semi1));
 
-       ast_channel_musicclass_set(semi2, ast_channel_musicclass(semi1));
-
        ast_channel_cc_params_init(semi2, ast_channel_get_cc_config_params(semi1));
 
        /*
index 0a0ea3c4b82ce33203a87fc157206e37a00f0ab8..7dd53599154c15c9c23c03fdfd2e98e4ee8baf97 100644 (file)
@@ -455,7 +455,7 @@ struct ast_bridge *park_common_setup(struct ast_channel *parkee, struct ast_chan
 
        lot = parking_lot_find_by_name(lot_name);
        if (!lot) {
-               lot = parking_create_dynamic_lot(lot_name, parkee);
+               lot = parking_create_dynamic_lot(lot_name, parker);
        }
 
        if (!lot) {
index 4cb87c81a73ba78d5342c88f0942c04d554bb133..5fe576424586868f2ed6d73752fdd7bc3ad21fa7 100644 (file)
@@ -236,6 +236,7 @@ static struct ast_channel *park_local_transfer(struct ast_channel *parker, const
        /* Before we actually dial out let's inherit appropriate information. */
        ast_channel_lock_both(parker, parkee);
        ast_channel_req_accountcodes(parkee, parker, AST_CHANNEL_REQUESTOR_REPLACEMENT);
+       ast_channel_parkinglot_set(parkee, ast_channel_parkinglot(parker));
        ast_connected_line_copy_from_caller(ast_channel_connected(parkee), ast_channel_caller(parker));
        ast_channel_inherit_variables(parker, parkee);
        ast_channel_datastore_inherit(parker, parkee);
@@ -488,6 +489,9 @@ static int parking_park_call(struct ast_bridge_channel *parker, char *exten, siz
        }
 
        lot = parking_lot_find_by_name(lot_name);
+       if (!lot) {
+               lot = parking_create_dynamic_lot(lot_name, parker->chan);
+       }
        if (!lot) {
                ast_log(AST_LOG_WARNING, "Cannot Park %s: lot %s unknown\n",
                        ast_channel_name(parker->chan), lot_name);
@@ -504,7 +508,8 @@ static int feature_park_call(struct ast_bridge_channel *bridge_channel, void *ho
 {
        SCOPED_MODULE_USE(AST_MODULE_SELF);
 
-       return parking_park_call(bridge_channel, NULL, 0);
+       parking_park_call(bridge_channel, NULL, 0);
+       return 0;
 }
 
 /*!