diff options
author | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-12-16 00:31:53 +0000 |
---|---|---|
committer | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-12-16 00:31:53 +0000 |
commit | 0264354e6775d48f94186c6ef4e8bdacff2bdc26 (patch) | |
tree | 61216b0c8584ee86568543300206a12baa05b277 | |
parent | a7ea4800e321ad59145c7beefd6aba7ea4e699a6 (diff) |
Enhance AMI redirect to allow channels to be redirected to different places.
New parameters ExtraContext, ExtraExtension, and ExtraPriority have been added
to redirect the second channel to a different location. Previously, it was only
possible to redirect both channels to the same place.
(closes issue #15853)
Reported by: haakon
Patches:
trunk-manager.c.patch uploaded by haakon (license 880)
Tested by: jpeeler
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@235265 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | main/manager.c | 27 |
2 files changed, 28 insertions, 2 deletions
@@ -306,6 +306,9 @@ Asterisk Manager Interface * The configuration file manager.conf now supports a channelvars option, which specifies a list of channel variables to include in each channel-oriented event. + * The redirect command now has new parameters ExtraContext, ExtraExtension, + and ExtraPriority to allow redirecting the second channel to a different + location than the first. Channel Event Logging --------------------- diff --git a/main/manager.c b/main/manager.c index 7db4c1bfe..998942605 100644 --- a/main/manager.c +++ b/main/manager.c @@ -353,12 +353,21 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <parameter name="Exten" required="true"> <para>Extension to transfer to.</para> </parameter> + <parameter name="ExtraExten"> + <para>Extension to transfer extrachannel to (optional).</para> + </parameter> <parameter name="Context" required="true"> <para>Context to transfer to.</para> </parameter> + <parameter name="ExtraContext"> + <para>Context to transfer extrachannel to (optional).</para> + </parameter> <parameter name="Priority" required="true"> <para>Priority to transfer to.</para> </parameter> + <parameter name="ExtraPriority"> + <para>Priority to transfer extrachannel to (optional).</para> + </parameter> </syntax> <description> <para>Redirect (transfer) a call.</para> @@ -3054,10 +3063,13 @@ static int action_redirect(struct mansession *s, const struct message *m) const char *name = astman_get_header(m, "Channel"); const char *name2 = astman_get_header(m, "ExtraChannel"); const char *exten = astman_get_header(m, "Exten"); + const char *exten2 = astman_get_header(m, "ExtraExten"); const char *context = astman_get_header(m, "Context"); + const char *context2 = astman_get_header(m, "ExtraContext"); const char *priority = astman_get_header(m, "Priority"); + const char *priority2 = astman_get_header(m, "ExtraPriority"); struct ast_channel *chan, *chan2 = NULL; - int pi = 0; + int pi, pi2 = 0; int res; if (ast_strlen_zero(name)) { @@ -3072,6 +3084,13 @@ static int action_redirect(struct mansession *s, const struct message *m) } } + if (!ast_strlen_zero(priority2) && (sscanf(priority2, "%30d", &pi2) != 1)) { + if ((pi2 = ast_findlabel_extension(NULL, context2, exten2, priority2, NULL)) < 1) { + astman_send_error(s, m, "Invalid ExtraPriority"); + return 0; + } + } + if (!(chan = ast_channel_get_by_name(name))) { char buf[256]; snprintf(buf, sizeof(buf), "Channel does not exist: %s", name); @@ -3111,7 +3130,11 @@ static int action_redirect(struct mansession *s, const struct message *m) ast_set_flag(chan2, AST_FLAG_BRIDGE_HANGUP_DONT); /* don't let the after-bridge code run the h-exten */ ast_channel_unlock(chan2); } - res = ast_async_goto(chan2, context, exten, pi); + if (context2) { + res = ast_async_goto(chan2, context2, exten2, pi2); + } else { + res = ast_async_goto(chan2, context, exten, pi); + } } else { res = -1; } |