diff options
author | Richard Mudgett <rmudgett@digium.com> | 2013-09-13 22:19:23 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2013-09-13 22:19:23 +0000 |
commit | 2a371cd80bfb88552d2f42545718da2489e1a5ba (patch) | |
tree | 188cc0f08f5ef185f215cf2d07ea59f5164311f0 /res/parking | |
parent | 03c7857375b475883a81141da05ca2d2376bf066 (diff) |
Restore Dial, Queue, and FollowMe 'I' option support.
The Dial, Queue, and FollowMe applications need to inhibit the bridging
initial connected line exchange in order to support the 'I' option.
* Replaced the pass_reference flag on ast_bridge_join() with a flags
parameter to pass other flags defined by enum ast_bridge_join_flags.
* Replaced the independent flag on ast_bridge_impart() with a flags
parameter to pass other flags defined by enum ast_bridge_impart_flags.
* Since the Dial, Queue, and FollowMe applications are now the only
callers of ast_bridge_call() and ast_bridge_call_with_flags(), changed the
calling contract to require the initial COLP exchange to already have been
done by the caller.
* Made all callers of ast_bridge_impart() check the return value. It is
important. As a precaution, I also made the compiler complain now if it
is not checked.
* Did some cleanup in parking_tests.c as a result of checking the
ast_bridge_impart() return value.
An independent, but associated change is:
* Reduce stack usage in ast_indicate_data() and add a dropping redundant
connected line verbose message.
(closes issue ASTERISK-22072)
Reported by: Joshua Colp
Review: https://reviewboard.asterisk.org/r/2845/
........
Merged revisions 399136 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@399138 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/parking')
-rw-r--r-- | res/parking/parking_applications.c | 3 | ||||
-rw-r--r-- | res/parking/parking_bridge_features.c | 3 | ||||
-rw-r--r-- | res/parking/parking_tests.c | 39 |
3 files changed, 20 insertions, 25 deletions
diff --git a/res/parking/parking_applications.c b/res/parking/parking_applications.c index e34b403e2..fc74ac2be 100644 --- a/res/parking/parking_applications.c +++ b/res/parking/parking_applications.c @@ -639,7 +639,8 @@ static int parked_call_app_exec(struct ast_channel *chan, const char *data) } /* Now we should try to join the new bridge ourselves... */ - ast_bridge_join(retrieval_bridge, chan, NULL, &chan_features, NULL, 1); + ast_bridge_join(retrieval_bridge, chan, NULL, &chan_features, NULL, + AST_BRIDGE_JOIN_PASS_REFERENCE); ast_bridge_features_cleanup(&chan_features); diff --git a/res/parking/parking_bridge_features.c b/res/parking/parking_bridge_features.c index 1f0237b9e..0e5e05d8f 100644 --- a/res/parking/parking_bridge_features.c +++ b/res/parking/parking_bridge_features.c @@ -316,7 +316,8 @@ static int parking_blind_transfer_park(struct ast_bridge_channel *bridge_channel return -1; } - if (ast_bridge_impart(bridge_channel->bridge, transfer_chan, NULL, NULL, 1)) { + if (ast_bridge_impart(bridge_channel->bridge, transfer_chan, NULL, NULL, + AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) { ast_hangup(transfer_chan); return -1; } diff --git a/res/parking/parking_tests.c b/res/parking/parking_tests.c index 57edd37ce..e046ca8cf 100644 --- a/res/parking/parking_tests.c +++ b/res/parking/parking_tests.c @@ -82,6 +82,12 @@ static void safe_channel_release(struct ast_channel *chan) ast_channel_release(chan); } +static void do_sleep(struct timespec *to_sleep) +{ + while ((nanosleep(to_sleep, to_sleep) == -1) && (errno == EINTR)) { + } +} + static int fake_fixup(struct ast_channel *clonechan, struct ast_channel *original) { return 0; @@ -99,7 +105,6 @@ static struct parking_lot *generate_test_parking_lot(const char *name, int low_s struct parking_lot *test_lot; test_cfg = parking_lot_cfg_create(name); - if (!test_cfg) { return NULL; } @@ -120,7 +125,6 @@ static struct parking_lot *generate_test_parking_lot(const char *name, int low_s } test_lot = parking_lot_build_or_update(test_cfg, 1); - if (!test_lot) { return NULL; } @@ -195,7 +199,6 @@ AST_TEST_DEFINE(park_call) RAII_VAR(struct ast_channel *, chan_alice, NULL, safe_channel_release); RAII_VAR(struct ast_bridge *, parking_bridge, NULL, ao2_cleanup); - struct ast_bridge_features chan_features; struct timespec to_sleep = {1, 0}; switch (cmd) { @@ -219,7 +222,6 @@ AST_TEST_DEFINE(park_call) } chan_alice = create_alice_channel(); - if (!chan_alice) { ast_test_status_update(test, "Failed to create test channel to park. Test failed.\n"); dispose_test_lot(test_lot, 1); @@ -227,27 +229,23 @@ AST_TEST_DEFINE(park_call) } ast_channel_state_set(chan_alice, AST_STATE_UP); - pbx_builtin_setvar_helper(chan_alice, "BLINDTRANSFER", ast_channel_name(chan_alice)); parking_bridge = park_application_setup(chan_alice, chan_alice, TEST_LOT_NAME, NULL); - if (!parking_bridge) { ast_test_status_update(test, "Failed to get the parking bridge for '%s'. Test failed.\n", TEST_LOT_NAME); dispose_test_lot(test_lot, 1); return AST_TEST_FAIL; } - if (ast_bridge_features_init(&chan_features)) { - ast_bridge_features_cleanup(&chan_features); - ast_test_status_update(test, "Failed to initialize bridge features. Test failed.\n"); + if (ast_bridge_impart(parking_bridge, chan_alice, NULL, NULL, + AST_BRIDGE_IMPART_CHAN_DEPARTABLE)) { + ast_test_status_update(test, "Failed to impart alice into parking lot. Test failed.\n"); dispose_test_lot(test_lot, 1); return AST_TEST_FAIL; } - ast_bridge_impart(parking_bridge, chan_alice, NULL, NULL, 0); - - while ((nanosleep(&to_sleep, &to_sleep) == -1) && (errno == EINTR)); + do_sleep(&to_sleep); ast_bridge_depart(chan_alice); @@ -255,6 +253,7 @@ AST_TEST_DEFINE(park_call) if (dispose_test_lot(test_lot, 1)) { ast_test_status_update(test, "Found parking lot in container after attempted removal. Test failed.\n"); + return AST_TEST_FAIL; } return AST_TEST_PASS; @@ -353,8 +352,6 @@ AST_TEST_DEFINE(retrieve_call) .resolution = PARK_ANSWERED, }; - struct ast_bridge_features chan_features; - switch (cmd) { case TEST_INIT: info->name = "park_retrieve"; @@ -383,7 +380,6 @@ AST_TEST_DEFINE(retrieve_call) } ast_channel_state_set(chan_alice, AST_STATE_UP); - pbx_builtin_setvar_helper(chan_alice, "BLINDTRANSFER", ast_channel_name(chan_alice)); parking_bridge = park_application_setup(chan_alice, chan_alice, TEST_LOT_NAME, NULL); @@ -393,26 +389,23 @@ AST_TEST_DEFINE(retrieve_call) return AST_TEST_FAIL; } - if (ast_bridge_features_init(&chan_features)) { - ast_bridge_features_cleanup(&chan_features); - ast_test_status_update(test, "Failed to initialize bridge features. Test failed.\n"); + if (ast_bridge_impart(parking_bridge, chan_alice, NULL, NULL, + AST_BRIDGE_IMPART_CHAN_DEPARTABLE)) { + ast_test_status_update(test, "Failed to impart alice into parking lot. Test failed.\n"); dispose_test_lot(test_lot, 1); return AST_TEST_FAIL; } - ast_bridge_impart(parking_bridge, chan_alice, NULL, NULL, 0); - - while ((nanosleep(&to_sleep, &to_sleep) == -1) && (errno == EINTR)); + do_sleep(&to_sleep); retrieved_user = parking_lot_retrieve_parked_user(test_lot, 701); if (!retrieved_user) { ast_test_status_update(test, "Failed to retrieve the parked user from the expected parking space. Test failed.\n"); - failure = 1; goto test_cleanup; } - ast_test_status_update(test, "Successfully retrieved parked user from the parking lot. Validating user data. Test failed.\n"); + ast_test_status_update(test, "Successfully retrieved parked user from the parking lot. Validating user data.\n"); if (!parked_users_match(retrieved_user, &expected_user, test)) { ast_test_status_update(test, "Parked user validation failed\n"); |