add ability to send transferring party to a dialplan target after they blind transfer another party (bug #4056, with mods)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5495 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin P. Fleming
2005-04-22 02:55:14 +00:00
parent 5a6d5c1751
commit 06de953fbc
3 changed files with 41 additions and 3 deletions

View File

@@ -319,7 +319,7 @@ only read in the dialplan. Writes to such variables are silently
ignored. ignored.
${ACCOUNTCODE} * Account code (if specified) ${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 ${BRIDGEPEER} Bridged peer
${CALLERANI} * Caller ANI (PRI channels) ${CALLERANI} * Caller ANI (PRI channels)
${CALLERID} * Caller ID ${CALLERID} * Caller ID
@@ -336,6 +336,10 @@ ${DNID} * Dialed Number Identifier
${EPOCH} * Current unix style epoch ${EPOCH} * Current unix style epoch
${EXTEN} * Current extension ${EXTEN} * Current extension
${ENV(VAR)} * Environmental variable VAR ${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) ${HANGUPCAUSE} * Asterisk cause of hangup (inbound/outbound)
${HINT} * Channel hints for this extension ${HINT} * Channel hints for this extension
${HINTNAME} * Suggested Caller*ID name for this extension ${HINTNAME} * Suggested Caller*ID name for this extension

3
pbx.c
View File

@@ -6271,8 +6271,7 @@ int ast_parseable_goto(struct ast_channel *chan, const char *goto_string)
if (mode) if (mode)
ipri = chan->priority + (ipri * mode); ipri = chan->priority + (ipri * mode);
/* This channel is currently in the PBX */ ast_explicit_goto(chan, context, exten, chan->pbx ? ipri - 1 : ipri);
ast_explicit_goto(chan, context, exten, ipri - 1);
ast_cdr_update(chan); ast_cdr_update(chan);
return 0; return 0;

View File

@@ -144,6 +144,40 @@ struct ast_bridge_thread_obj
struct ast_channel *peer; 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) static void *ast_bridge_call_thread(void *data)
{ {
struct ast_bridge_thread_obj *tobj = 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); strncpy(transferee->context, transferer_real_context, sizeof(transferee->context)-1);
transferee->priority = 0; transferee->priority = 0;
} }
check_goto_on_transfer(transferer);
return res; return res;
} else { } else {
if (option_verbose > 2) if (option_verbose > 2)