Enhance AMI redirect to allow channels to be redirected to different places.
authorJeff Peeler <jpeeler@digium.com>
Wed, 16 Dec 2009 00:31:53 +0000 (00:31 +0000)
committerJeff Peeler <jpeeler@digium.com>
Wed, 16 Dec 2009 00:31:53 +0000 (00:31 +0000)
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

CHANGES
main/manager.c

diff --git a/CHANGES b/CHANGES
index 38d54f7..745c9d9 100644 (file)
--- 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
 ---------------------
index 7db4c1b..9989426 100644 (file)
@@ -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;
                        }