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
10
Richard Mudgett 14 years ago
parent 5faafa4aca
commit 0ffc4eba3b

@ -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)) {

Loading…
Cancel
Save