diff --git a/doc/README.variables b/doc/README.variables index 050bd1285d9cf355724f9202fd905636d529c6d2..e84d937574715d574ddb06b53141313fda974f68 100755 --- a/doc/README.variables +++ b/doc/README.variables @@ -319,7 +319,7 @@ only read in the dialplan. Writes to such variables are silently ignored. ${ACCOUNTCODE} * Account code (if specified) -${BLINDTRANSFER} The name of the channel on the other side a blind transfer +${BLINDTRANSFER} The name of the channel on the other side of a blind transfer ${BRIDGEPEER} Bridged peer ${CALLERANI} * Caller ANI (PRI channels) ${CALLERID} * Caller ID @@ -336,6 +336,10 @@ ${DNID} * Dialed Number Identifier ${EPOCH} * Current unix style epoch ${EXTEN} * Current extension ${ENV(VAR)} * Environmental variable VAR +${GOTO_ON_BLINDXFR} Transfer to the specified context/extension/priority + after a blind transfer (use ^ characters in place of + | to separate context/extension/priority when setting + this variable from the dialplan) ${HANGUPCAUSE} * Asterisk cause of hangup (inbound/outbound) ${HINT} * Channel hints for this extension ${HINTNAME} * Suggested Caller*ID name for this extension diff --git a/pbx.c b/pbx.c index 68b55e126e82e120727915687b14a793c16a0c39..2d1c42951c01e50de856c489ad2ee923b5e0c0de 100755 --- a/pbx.c +++ b/pbx.c @@ -6271,8 +6271,7 @@ int ast_parseable_goto(struct ast_channel *chan, const char *goto_string) if (mode) ipri = chan->priority + (ipri * mode); - /* This channel is currently in the PBX */ - ast_explicit_goto(chan, context, exten, ipri - 1); + ast_explicit_goto(chan, context, exten, chan->pbx ? ipri - 1 : ipri); ast_cdr_update(chan); return 0; diff --git a/res/res_features.c b/res/res_features.c index b177549d9f104f159b251347cced64a288dc71d4..6f404ca252fd6279131e5987c80d5060d5198815 100755 --- a/res/res_features.c +++ b/res/res_features.c @@ -144,6 +144,40 @@ struct ast_bridge_thread_obj struct ast_channel *peer; }; +static void check_goto_on_transfer(struct ast_channel *chan) +{ + struct ast_channel *xferchan; + char *goto_on_transfer; + + goto_on_transfer = pbx_builtin_getvar_helper(chan, "GOTO_ON_BLINDXFR"); + + if (goto_on_transfer && !ast_strlen_zero(goto_on_transfer) && (xferchan = ast_channel_alloc(0))) { + char *x; + struct ast_frame *f; + + for (x = goto_on_transfer; x && *x; x++) + if (*x == '^') + *x = '|'; + + strcpy(xferchan->name, chan->name); + /* Make formats okay */ + xferchan->readformat = chan->readformat; + xferchan->writeformat = chan->writeformat; + ast_channel_masquerade(xferchan, chan); + ast_parseable_goto(xferchan, goto_on_transfer); + xferchan->_state = AST_STATE_UP; + ast_clear_flag(xferchan, AST_FLAGS_ALL); + xferchan->_softhangup = 0; + if ((f = ast_read(xferchan))) { + ast_frfree(f); + f = NULL; + ast_pbx_start(xferchan); + } else { + ast_hangup(xferchan); + } + } +} + static void *ast_bridge_call_thread(void *data) { struct ast_bridge_thread_obj *tobj = data; @@ -550,6 +584,7 @@ static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *p strncpy(transferee->context, transferer_real_context, sizeof(transferee->context)-1); transferee->priority = 0; } + check_goto_on_transfer(transferer); return res; } else { if (option_verbose > 2)