aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2009-12-16 00:31:53 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2009-12-16 00:31:53 +0000
commit0264354e6775d48f94186c6ef4e8bdacff2bdc26 (patch)
tree61216b0c8584ee86568543300206a12baa05b277
parenta7ea4800e321ad59145c7beefd6aba7ea4e699a6 (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--CHANGES3
-rw-r--r--main/manager.c27
2 files changed, 28 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 38d54f7c0..745c9d9bd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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;
}