mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-21 01:01:02 +00:00
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
This commit is contained in:
@@ -166,12 +166,15 @@ const char *stasis_app_control_get_channel_id(
|
|||||||
*
|
*
|
||||||
* \param control Control for \c res_stasis
|
* \param control Control for \c res_stasis
|
||||||
* \param endpoint The endpoint to dial.
|
* \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.
|
* \param timeout The amount of time to wait for answer, before giving up.
|
||||||
*
|
*
|
||||||
* \return 0 for success
|
* \return 0 for success
|
||||||
* \return -1 for error.
|
* \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
|
* \brief Apply a bridge role to a channel controlled by a stasis app control
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ void ast_ari_dial(struct ast_variable *headers, struct ast_dial_args *args, stru
|
|||||||
return;
|
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);
|
ast_ari_response_alloc_failed(response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,6 +135,10 @@ struct stasis_app_control_dial_data {
|
|||||||
int timeout;
|
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,
|
static void *app_control_dial(struct stasis_app_control *control,
|
||||||
struct ast_channel *chan, void *data)
|
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);
|
RAII_VAR(struct stasis_app_control_dial_data *, dial_data, data, ast_free);
|
||||||
enum ast_dial_result res;
|
enum ast_dial_result res;
|
||||||
char *tech, *resource;
|
char *tech, *resource;
|
||||||
|
|
||||||
struct ast_channel *new_chan;
|
struct ast_channel *new_chan;
|
||||||
struct ast_bridge *bridge;
|
RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup);
|
||||||
|
|
||||||
tech = dial_data->endpoint;
|
tech = dial_data->endpoint;
|
||||||
if (!(resource = strchr(tech, '/'))) {
|
if (!(resource = strchr(tech, '/'))) {
|
||||||
@@ -178,13 +181,14 @@ static void *app_control_dial(struct stasis_app_control *control,
|
|||||||
AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
|
AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
|
||||||
ast_hangup(new_chan);
|
ast_hangup(new_chan);
|
||||||
} else {
|
} else {
|
||||||
stasis_app_control_add_channel_to_bridge(control, bridge);
|
app_control_add_channel_to_bridge(control, chan, bridge);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
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;
|
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;
|
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) {
|
if (timeout > 0) {
|
||||||
dial_data->timeout = timeout * 1000;
|
dial_data->timeout = timeout * 1000;
|
||||||
|
|||||||
Reference in New Issue
Block a user