From 0ffc4eba3bb8b11bb9f79017385b3cebc96ea5db Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Thu, 26 Apr 2012 20:25:05 +0000 Subject: [PATCH] Fix DTMF atxfer running h exten after the wrong bridge ends. When party B does an attended transfer of party A to party C, the attending bridge between party B and C should not be running an h exten when the bridge ends. Running an h exten now sets a softhangup flag to ensure that an AGI will run in dead AGI mode. * Set the AST_FLAG_BRIDGE_HANGUP_DONT on the party B channel for the attending bridge between party B and C. (closes issue AST-870) (closes issue ASTERISK-19717) Reported by: Mario (closes issue ASTERISK-19633) Reported by: Andrey Solovyev Patches: jira_asterisk_19633_v1.8.patch (license #5621) patch uploaded by rmudgett Tested by: rmudgett, Andrey Solovyev, Mario ........ Merged revisions 364060 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@364065 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/features.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/main/features.c b/main/features.c index 4f5b00a8fe..d4d57d436e 100644 --- a/main/features.c +++ b/main/features.c @@ -2631,16 +2631,30 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st ast_set_flag(&(bconfig.features_caller), AST_FEATURE_DISCONNECT); ast_set_flag(&(bconfig.features_callee), AST_FEATURE_DISCONNECT); - /* ast_bridge_call clears AST_FLAG_BRIDGE_HANGUP_DONT, but we don't - want that to happen here because we're also in another bridge already + /* + * ast_bridge_call clears AST_FLAG_BRIDGE_HANGUP_DONT, but we + * don't want that to happen here because the transferer is in + * another bridge already. */ - if (ast_test_flag(chan, AST_FLAG_BRIDGE_HANGUP_DONT)) { + if (ast_test_flag(transferer, AST_FLAG_BRIDGE_HANGUP_DONT)) { hangup_dont = 1; } - /* Let party B and party C talk as long as they want. */ + + /* + * Don't let the after-bridge code run the h-exten. It is the + * wrong bridge to run the h-exten after. + */ + ast_set_flag(transferer, AST_FLAG_BRIDGE_HANGUP_DONT); + + /* + * Let party B and C talk as long as they want while party A + * languishes in autoservice listening to MOH. + */ ast_bridge_call(transferer, newchan, &bconfig); + if (hangup_dont) { - ast_set_flag(chan, AST_FLAG_BRIDGE_HANGUP_DONT); + /* Restore the AST_FLAG_BRIDGE_HANGUP_DONT flag */ + ast_set_flag(transferer, AST_FLAG_BRIDGE_HANGUP_DONT); } if (ast_check_hangup(newchan) || !ast_check_hangup(transferer)) { -- 2.47.2