mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
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:
@@ -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
3
pbx.c
@@ -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;
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user