Allow specifying a channel to dial an extension and context in an ARI dial operation.
authorJoshua Colp <jcolp@digium.com>
Wed, 2 Oct 2013 15:24:16 +0000 (15:24 +0000)
committerJoshua Colp <jcolp@digium.com>
Wed, 2 Oct 2013 15:24:16 +0000 (15:24 +0000)
(issue ASTERISK-22625)
Reported by: Scott Griepentrog
........

Merged revisions 400254 from http://svn.asterisk.org/svn/asterisk/branches/12

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

include/asterisk/stasis_app.h
res/ari/resource_channels.c
res/stasis/control.c

index 528c480..5dbb553 100644 (file)
@@ -166,12 +166,15 @@ const char *stasis_app_control_get_channel_id(
  *
  * \param control Control for \c res_stasis
  * \param endpoint The endpoint to dial.
+ * \param exten Extension to dial if no endpoint specified.
+ * \param context Context to use with extension.
  * \param timeout The amount of time to wait for answer, before giving up.
  *
  * \return 0 for success
  * \return -1 for error.
  */
-int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, int timeout);
+int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, const char *exten,
+                            const char *context, int timeout);
 
 /*!
  * \brief Apply a bridge role to a channel controlled by a stasis app control
index 29ceb77..4d52281 100644 (file)
@@ -90,7 +90,7 @@ void ast_ari_dial(struct ast_variable *headers, struct ast_dial_args *args, stru
                return;
        }
 
-       if (stasis_app_control_dial(control, args->endpoint, args->timeout)) {
+       if (stasis_app_control_dial(control, args->endpoint, args->extension, args->context, args->timeout)) {
                ast_ari_response_alloc_failed(response);
                return;
        }
index 2c3a109..26406bb 100644 (file)
@@ -135,6 +135,10 @@ struct stasis_app_control_dial_data {
        int timeout;
 };
 
+static void *app_control_add_channel_to_bridge(
+        struct stasis_app_control *control,
+        struct ast_channel *chan, void *data);
+
 static void *app_control_dial(struct stasis_app_control *control,
        struct ast_channel *chan, void *data)
 {
@@ -142,9 +146,8 @@ static void *app_control_dial(struct stasis_app_control *control,
        RAII_VAR(struct stasis_app_control_dial_data *, dial_data, data, ast_free);
        enum ast_dial_result res;
        char *tech, *resource;
-
        struct ast_channel *new_chan;
-       struct ast_bridge *bridge;
+       RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup);
 
        tech = dial_data->endpoint;
        if (!(resource = strchr(tech, '/'))) {
@@ -178,13 +181,14 @@ static void *app_control_dial(struct stasis_app_control *control,
                AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
                ast_hangup(new_chan);
        } else {
-               stasis_app_control_add_channel_to_bridge(control, bridge);
+               app_control_add_channel_to_bridge(control, chan, bridge);
        }
 
        return NULL;
 }
 
-int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, int timeout)
+int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, const char *exten, const char *context,
+                           int timeout)
 {
        struct stasis_app_control_dial_data *dial_data;
 
@@ -192,7 +196,13 @@ int stasis_app_control_dial(struct stasis_app_control *control, const char *endp
                return -1;
        }
 
-       ast_copy_string(dial_data->endpoint, endpoint, sizeof(dial_data->endpoint));
+       if (!ast_strlen_zero(endpoint)) {
+               ast_copy_string(dial_data->endpoint, endpoint, sizeof(dial_data->endpoint));
+       } else if (!ast_strlen_zero(exten) && !ast_strlen_zero(context)) {
+               snprintf(dial_data->endpoint, sizeof(dial_data->endpoint), "Local/%s@%s", exten, context);
+       } else {
+               return -1;
+       }
 
        if (timeout > 0) {
                dial_data->timeout = timeout * 1000;