From 3d63ec89e0a0148b77fcc57dd3cb7259aae504eb Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 7 Sep 2011 19:35:18 +0000 Subject: [PATCH] Merged revisions 334841 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/10 ................ r334841 | rmudgett | 2011-09-07 14:33:38 -0500 (Wed, 07 Sep 2011) | 17 lines Merged revisions 334840 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r334840 | rmudgett | 2011-09-07 14:31:44 -0500 (Wed, 07 Sep 2011) | 10 lines Fix AMI action Park crash. * Made AMI action Park not say anything to the parker channel (AMI header Channel2) since the AMI action is a third party parking the call. (This is a change in behavior that cannot be preserved without a lot of effort.) * Made not play pbx-parkingfailed if the Park 's' option is used. JIRA AST-660 ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@334842 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/features.c | 64 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/main/features.c b/main/features.c index 9af0a86533..819b67fb03 100644 --- a/main/features.c +++ b/main/features.c @@ -341,7 +341,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") Channel name to park. - Channel to announce park info to (and return to if timeout). + Channel to return to if timeout. Number of milliseconds to wait before callback. @@ -1549,12 +1549,14 @@ static int masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, i rchan->context, rchan->linkedid, rchan->amaflags, "Parked/%s", rchan->name); if (!chan) { ast_log(LOG_WARNING, "Unable to create parked channel\n"); - if (peer == rchan) { - /* Only have one channel to worry about. */ - ast_stream_and_wait(peer, "pbx-parkingfailed", ""); - } else if (peer) { - /* Have two different channels to worry about. */ - play_message_on_chan(peer, rchan, "failure message", "pbx-parkingfailed"); + if (!ast_test_flag(args, AST_PARK_OPT_SILENCE)) { + if (peer == rchan) { + /* Only have one channel to worry about. */ + ast_stream_and_wait(peer, "pbx-parkingfailed", ""); + } else if (peer) { + /* Have two different channels to worry about. */ + play_message_on_chan(peer, rchan, "failure message", "pbx-parkingfailed"); + } } return -1; } @@ -1563,12 +1565,14 @@ static int masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, i if (!args->pu) { chan->hangupcause = AST_CAUSE_SWITCH_CONGESTION; ast_hangup(chan); - if (peer == rchan) { - /* Only have one channel to worry about. */ - ast_stream_and_wait(peer, "pbx-parkingfailed", ""); - } else if (peer) { - /* Have two different channels to worry about. */ - play_message_on_chan(peer, rchan, "failure message", "pbx-parkingfailed"); + if (!ast_test_flag(args, AST_PARK_OPT_SILENCE)) { + if (peer == rchan) { + /* Only have one channel to worry about. */ + ast_stream_and_wait(peer, "pbx-parkingfailed", ""); + } else if (peer) { + /* Have two different channels to worry about. */ + play_message_on_chan(peer, rchan, "failure message", "pbx-parkingfailed"); + } } return -1; } @@ -1688,7 +1692,9 @@ static int xfer_park_call_helper(struct ast_channel *park_me, struct ast_channel parkinglot_unref(args.parkinglot); } else { /* Parking failed because parking lot does not exist. */ - ast_stream_and_wait(parker, "pbx-parkingfailed", ""); + if (!ast_test_flag(&args, AST_PARK_OPT_SILENCE)) { + ast_stream_and_wait(parker, "pbx-parkingfailed", ""); + } finishup(park_me); res = -1; } @@ -4802,7 +4808,9 @@ static int park_call_exec(struct ast_channel *chan, const char *data) parkinglot_unref(args.parkinglot); } else { /* Parking failed because the parking lot does not exist. */ - ast_stream_and_wait(chan, "pbx-parkingfailed", ""); + if (!ast_test_flag(&args, AST_PARK_OPT_SILENCE)) { + ast_stream_and_wait(chan, "pbx-parkingfailed", ""); + } res = -1; } if (res) { @@ -6865,6 +6873,9 @@ static int manager_parking_status(struct mansession *s, const struct message *m) * * Get channels involved in park, create event. * \return Always 0 + * + * \note ADSI is not compatible with this AMI action for the + * same reason ch2 can no longer announce the parking space. */ static int manager_park(struct mansession *s, const struct message *m) { @@ -6875,7 +6886,28 @@ static int manager_park(struct mansession *s, const struct message *m) char buf[BUFSIZ]; int res = 0; struct ast_channel *ch1, *ch2; - struct ast_park_call_args args = {0,}; + struct ast_park_call_args args = { + /* + * Don't say anything to ch2 since AMI is a third party parking + * a call and we will likely crash if we do. + * + * XXX When the AMI action was originally implemented, the + * parking space was announced to ch2. Unfortunately, grabbing + * the ch2 lock and holding it while the announcement is played + * was not really a good thing to do to begin with since it + * could hold up the system. Also holding the lock is no longer + * possible with a masquerade. + * + * Restoring the announcement to ch2 is not easily doable for + * the following reasons: + * + * 1) The AMI manager is not the thread processing ch2. + * + * 2) ch2 could be the same as ch1, bridged to ch1, or some + * random uninvolved channel. + */ + .flags = AST_PARK_OPT_SILENCE, + }; if (ast_strlen_zero(channel)) { astman_send_error(s, m, "Channel not specified");