diff options
author | Kevin P. Fleming <kpfleming@digium.com> | 2005-04-22 02:55:14 +0000 |
---|---|---|
committer | Kevin P. Fleming <kpfleming@digium.com> | 2005-04-22 02:55:14 +0000 |
commit | 06de953fbc258431f0f161cba3026cb3a33e242b (patch) | |
tree | a3a21733b337d545e51000dfcbf9e2cddf122818 /res/res_features.c | |
parent | 5a6d5c1751e9df27d7a4b0715e204bfbc8d5ed2c (diff) |
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
Diffstat (limited to 'res/res_features.c')
-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) |