diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-04-22 02:55:14 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-04-22 02:55:14 +0000 |
commit | 4692a24b4d1c697a767c53542fe76bd7d7e64425 (patch) | |
tree | a3a21733b337d545e51000dfcbf9e2cddf122818 /res | |
parent | 4eea4687ba7cfdccc2ae157b004d82041130840e (diff) |
add ability to send transferring party to a dialplan target after they blind transfer another party (bug #4056, with mods)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5495 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rwxr-xr-x | res/res_features.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/res/res_features.c b/res/res_features.c index b177549d9..6f404ca25 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) |