]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Change ARI originate to also allow dialing an exten/context/priority.
authorJason Parker <jparker@digium.com>
Fri, 28 Jun 2013 16:23:24 +0000 (16:23 +0000)
committerJason Parker <jparker@digium.com>
Fri, 28 Jun 2013 16:23:24 +0000 (16:23 +0000)
The old way didn't make much sense, so some of the fields were repurposed.

(closes issue ASTERISK-21658)

Review: https://reviewboard.asterisk.org/r/2626/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393144 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_stasis_http_channels.c
res/stasis_http/resource_channels.c
res/stasis_http/resource_channels.h
rest-api/api-docs/channels.json

index 2776b167ed8f8250d3f9ae2a0c4c02fa1d7c9ae4..6f5515110cd2045c9fff8d68a5b5ef68d32a9907 100644 (file)
@@ -83,11 +83,8 @@ static void stasis_http_originate_cb(
                if (strcmp(i->name, "context") == 0) {
                        args.context = (i->value);
                } else
-               if (strcmp(i->name, "callerId") == 0) {
-                       args.caller_id = (i->value);
-               } else
-               if (strcmp(i->name, "timeout") == 0) {
-                       args.timeout = atoi(i->value);
+               if (strcmp(i->name, "priority") == 0) {
+                       args.priority = atol(i->value);
                } else
                if (strcmp(i->name, "app") == 0) {
                        args.app = (i->value);
@@ -95,6 +92,12 @@ static void stasis_http_originate_cb(
                if (strcmp(i->name, "appArgs") == 0) {
                        args.app_args = (i->value);
                } else
+               if (strcmp(i->name, "callerId") == 0) {
+                       args.caller_id = (i->value);
+               } else
+               if (strcmp(i->name, "timeout") == 0) {
+                       args.timeout = atoi(i->value);
+               } else
                {}
        }
        stasis_http_originate(headers, &args, response);
index 7ee4126898824aa711bc553497e2fdc3a1e7d8be..1fc16e576e871a98d63cdd14a7087fa0d8d4057d 100644 (file)
@@ -320,24 +320,31 @@ void stasis_http_originate(struct ast_variable *headers,
                           struct ast_originate_args *args,
                           struct stasis_http_response *response)
 {
-       const char *dialtech = NULL;
+       char *dialtech;
        char dialdevice[AST_CHANNEL_NAME];
        char *caller_id = NULL;
        char *cid_num = NULL;
        char *cid_name = NULL;
        int timeout = 30000;
 
-       const char *app = "Stasis";
-       RAII_VAR(struct ast_str *, appdata, ast_str_create(64), ast_free);
+       char *stuff;
 
-       if (!appdata) {
-               stasis_http_response_alloc_failed(response);
+       if (ast_strlen_zero(args->endpoint)) {
+               stasis_http_response_error(response, 400, "Bad Request",
+                       "Endpoint must be specified");
                return;
        }
 
-       ast_str_set(&appdata, 0, "%s", args->app);
-       if (!ast_strlen_zero(args->app_args)) {
-               ast_str_append(&appdata, 0, ",%s", args->app_args);
+       dialtech = ast_strdupa(args->endpoint);
+       if ((stuff = strchr(dialtech, '/'))) {
+               *stuff++ = '\0';
+               ast_copy_string(dialdevice, stuff, sizeof(dialdevice));
+       }
+
+       if (ast_strlen_zero(dialtech) || ast_strlen_zero(dialdevice)) {
+               stasis_http_response_error(response, 400, "Bad Request",
+                       "Invalid endpoint specified");
+               return;
        }
 
        if (args->timeout > 0) {
@@ -346,27 +353,6 @@ void stasis_http_originate(struct ast_variable *headers,
                timeout = -1;
        }
 
-       if (!ast_strlen_zero(args->endpoint)) {
-               char *tmp = ast_strdupa(args->endpoint);
-               char *stuff;
-
-               if ((stuff = strchr(tmp, '/'))) {
-                       *stuff++ = '\0';
-                       dialtech = tmp;
-                       ast_copy_string(dialdevice, stuff, sizeof(dialdevice));
-               }
-       } else if (!ast_strlen_zero(args->extension) && !ast_strlen_zero(args->context)) {
-               dialtech = "Local";
-               snprintf(dialdevice, sizeof(dialdevice), "%s@%s", args->extension, args->context);
-       }
-
-       if (ast_strlen_zero(dialtech) || ast_strlen_zero(dialdevice)) {
-               stasis_http_response_error(
-                       response, 500, "Internal server error",
-                       "Invalid endpoint or extension and context specified");
-               return;
-       }
-
        if (!ast_strlen_zero(args->caller_id)) {
                caller_id = ast_strdupa(args->caller_id);
                ast_callerid_parse(caller_id, &cid_name, &cid_num);
@@ -376,11 +362,35 @@ void stasis_http_originate(struct ast_variable *headers,
                }
        }
 
-       ast_debug(1, "Dialing %s/%s\n", dialtech, dialdevice);
+       if (!ast_strlen_zero(args->app)) {
+               const char *app = "Stasis";
 
-       /* originate a channel, putting it into an application */
-       if (ast_pbx_outgoing_app(dialtech, NULL, dialdevice, timeout, app, ast_str_buffer(appdata), NULL, 0, cid_num, cid_name, NULL, NULL, NULL)) {
-               stasis_http_response_alloc_failed(response);
+               RAII_VAR(struct ast_str *, appdata, ast_str_create(64), ast_free);
+
+               if (!appdata) {
+                       stasis_http_response_alloc_failed(response);
+                       return;
+               }
+
+               ast_str_set(&appdata, 0, "%s", args->app);
+               if (!ast_strlen_zero(args->app_args)) {
+                       ast_str_append(&appdata, 0, ",%s", args->app_args);
+               }
+
+               /* originate a channel, putting it into an application */
+               if (ast_pbx_outgoing_app(dialtech, NULL, dialdevice, timeout, app, ast_str_buffer(appdata), NULL, 0, cid_num, cid_name, NULL, NULL, NULL)) {
+                       stasis_http_response_alloc_failed(response);
+                       return;
+               }
+       } else if (!ast_strlen_zero(args->extension)) {
+               /* originate a channel, sending it to an extension */
+               if (ast_pbx_outgoing_exten(dialtech, NULL, dialdevice, timeout, S_OR(args->context, "default"), args->extension, args->priority ? args->priority : 1, NULL, 0, cid_num, cid_name, NULL, NULL, NULL, 0)) {
+                       stasis_http_response_alloc_failed(response);
+                       return;
+               }
+       } else {
+               stasis_http_response_error(response, 400, "Bad Request",
+                       "Application or extension must be specified");
                return;
        }
 
index 1cb408b4ac04f4abfaec1b2ecabfbdf1de9e886d..ddc5f326b10f3973665a2bc2d363f9bd32ca3cf0 100644 (file)
@@ -52,20 +52,22 @@ struct ast_get_channels_args {
 void stasis_http_get_channels(struct ast_variable *headers, struct ast_get_channels_args *args, struct stasis_http_response *response);
 /*! \brief Argument struct for stasis_http_originate() */
 struct ast_originate_args {
-       /*! \brief Endpoint to call. If not specified, originate is routed via dialplan */
+       /*! \brief Endpoint to call. */
        const char *endpoint;
-       /*! \brief When routing via dialplan, the extension to dial */
+       /*! \brief The extension to dial after the endpoint answers */
        const char *extension;
-       /*! \brief When routing via dialplan, the context to use. If omitted, uses 'default' */
+       /*! \brief The context to dial after the endpoint answers. If omitted, uses 'default' */
        const char *context;
+       /*! \brief The priority to dial after the endpoint answers. If omitted, uses 1 */
+       long priority;
+       /*! \brief The application name to pass to the Stasis application. */
+       const char *app;
+       /*! \brief The application arguments to pass to the Stasis application. */
+       const char *app_args;
        /*! \brief CallerID to use when dialing the endpoint or extension. */
        const char *caller_id;
        /*! \brief Timeout (in seconds) before giving up dialing, or -1 for no timeout. */
        int timeout;
-       /*! \brief Application name to pass to the Stasis application. */
-       const char *app;
-       /*! \brief Application arguments to pass to the Stasis application. */
-       const char *app_args;
 };
 /*!
  * \brief Create a new channel (originate).
index d097267e7d5c6e42a32ac54270a63a65afabe47c..15e76e4f8b124b599d00100b44bfcbb146bce04e 100644 (file)
                                        "parameters": [
                                                {
                                                        "name": "endpoint",
-                                                       "description": "Endpoint to call. If not specified, originate is routed via dialplan",
+                                                       "description": "Endpoint to call.",
                                                        "paramType": "query",
-                                                       "required": false,
+                                                       "required": true,
                                                        "allowMultiple": false,
                                                        "dataType": "string"
                                                },
                                                {
                                                        "name": "extension",
-                                                       "description": "When routing via dialplan, the extension to dial",
+                                                       "description": "The extension to dial after the endpoint answers",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
                                                },
                                                {
                                                        "name": "context",
-                                                       "description": "When routing via dialplan, the context to use. If omitted, uses 'default'",
+                                                       "description": "The context to dial after the endpoint answers. If omitted, uses 'default'",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
                                                        "dataType": "string"
                                                },
                                                {
-                                                       "name": "callerId",
-                                                       "description": "CallerID to use when dialing the endpoint or extension.",
+                                                       "name": "priority",
+                                                       "description": "The priority to dial after the endpoint answers. If omitted, uses 1",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
-                                                       "dataType": "string"
+                                                       "dataType": "long"
                                                },
                                                {
-                                                       "name": "timeout",
-                                                       "description": "Timeout (in seconds) before giving up dialing, or -1 for no timeout.",
+                                                       "name": "app",
+                                                       "description": "The application name to pass to the Stasis application.",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
-                                                       "dataType": "int",
-                                                       "defaultValue": 30
+                                                       "dataType": "string"
                                                },
                                                {
-                                                       "name": "app",
-                                                       "description": "Application name to pass to the Stasis application.",
+                                                       "name": "appArgs",
+                                                       "description": "The application arguments to pass to the Stasis application.",
                                                        "paramType": "query",
-                                                       "required": true,
+                                                       "required": false,
                                                        "allowMultiple": false,
                                                        "dataType": "string"
                                                },
                                                {
-                                                       "name": "appArgs",
-                                                       "description": "Application arguments to pass to the Stasis application.",
+                                                       "name": "callerId",
+                                                       "description": "CallerID to use when dialing the endpoint or extension.",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
                                                        "dataType": "string"
+                                               },
+                                               {
+                                                       "name": "timeout",
+                                                       "description": "Timeout (in seconds) before giving up dialing, or -1 for no timeout.",
+                                                       "paramType": "query",
+                                                       "required": false,
+                                                       "allowMultiple": false,
+                                                       "dataType": "int",
+                                                       "defaultValue": 30
                                                }
                                        ]
                                }