summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJeff Peeler <jpeeler@digium.com>2009-12-16 00:31:53 +0000
committerJeff Peeler <jpeeler@digium.com>2009-12-16 00:31:53 +0000
commit5b36dd59ea39b22b6f11924f6b7562adcadd6790 (patch)
tree61216b0c8584ee86568543300206a12baa05b277 /main
parentd4894b3d25de78ca3b2e289261a73e3aec07209e (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: https://origsvn.digium.com/svn/asterisk/trunk@235265 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/manager.c27
1 files changed, 25 insertions, 2 deletions
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;
}