diff options
author | Joshua Colp <jcolp@digium.com> | 2013-10-02 15:24:16 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2013-10-02 15:24:16 +0000 |
commit | 83d55f85ec017073802817d11bd337f74a0d2db8 (patch) | |
tree | 3827e7daa7701b3c9a3e5bd40fe846364864fc30 | |
parent | c33aac75e4cc3bb0a689f5162213b9a91c134068 (diff) |
Allow specifying a channel to dial an extension and context in an ARI dial operation.
(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
-rw-r--r-- | include/asterisk/stasis_app.h | 5 | ||||
-rw-r--r-- | res/ari/resource_channels.c | 2 | ||||
-rw-r--r-- | res/stasis/control.c | 20 |
3 files changed, 20 insertions, 7 deletions
diff --git a/include/asterisk/stasis_app.h b/include/asterisk/stasis_app.h index 528c48030..5dbb55397 100644 --- a/include/asterisk/stasis_app.h +++ b/include/asterisk/stasis_app.h @@ -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 diff --git a/res/ari/resource_channels.c b/res/ari/resource_channels.c index 29ceb778f..4d5228168 100644 --- a/res/ari/resource_channels.c +++ b/res/ari/resource_channels.c @@ -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; } diff --git a/res/stasis/control.c b/res/stasis/control.c index 2c3a10980..26406bb07 100644 --- a/res/stasis/control.c +++ b/res/stasis/control.c @@ -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; |