diff options
author | Jason Parker <jparker@digium.com> | 2013-06-26 19:29:57 +0000 |
---|---|---|
committer | Jason Parker <jparker@digium.com> | 2013-06-26 19:29:57 +0000 |
commit | 609c42c854c8880548571241b893604c02d513d4 (patch) | |
tree | 8e133c58a4a5040c67b61cafb03332c66cddf2a6 /res | |
parent | 5e27e13e284402d44d8e90051aba230ecf3c7547 (diff) |
ARI: Add support for continuing to a different location in dialplan.
This allows going elsewhere in the dialplan, so that the location can be
specified after exiting the Stasis application.
(closes issue ASTERISK-21870)
Review: https://reviewboard.asterisk.org/r/2644/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@392987 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r-- | res/res_stasis_http_channels.c | 12 | ||||
-rw-r--r-- | res/stasis/control.c | 31 | ||||
-rw-r--r-- | res/stasis_http/resource_channels.c | 6 | ||||
-rw-r--r-- | res/stasis_http/resource_channels.h | 6 |
4 files changed, 52 insertions, 3 deletions
diff --git a/res/res_stasis_http_channels.c b/res/res_stasis_http_channels.c index 87f663d94..2776b167e 100644 --- a/res/res_stasis_http_channels.c +++ b/res/res_stasis_http_channels.c @@ -191,6 +191,18 @@ static void stasis_http_continue_in_dialplan_cb( struct ast_continue_in_dialplan_args args = {}; struct ast_variable *i; + for (i = get_params; i; i = i->next) { + if (strcmp(i->name, "context") == 0) { + args.context = (i->value); + } else + if (strcmp(i->name, "extension") == 0) { + args.extension = (i->value); + } else + if (strcmp(i->name, "priority") == 0) { + args.priority = atoi(i->value); + } else + {} + } for (i = path_vars; i; i = i->next) { if (strcmp(i->name, "channelId") == 0) { args.channel_id = (i->value); diff --git a/res/stasis/control.c b/res/stasis/control.c index 06f36728f..310b66cbc 100644 --- a/res/stasis/control.c +++ b/res/stasis/control.c @@ -33,6 +33,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "control.h" #include "asterisk/bridging.h" #include "asterisk/bridging_features.h" +#include "asterisk/pbx.h" struct stasis_app_control { /*! Queue of commands to dispatch on the channel */ @@ -91,17 +92,43 @@ int control_is_done(struct stasis_app_control *control) return control->is_done; } +struct stasis_app_control_continue_data { + char context[AST_MAX_CONTEXT]; + char extension[AST_MAX_EXTENSION]; + int priority; +}; + static void *app_control_continue(struct stasis_app_control *control, struct ast_channel *chan, void *data) { + RAII_VAR(struct stasis_app_control_continue_data *, continue_data, data, ast_free); + /* Called from stasis_app_exec thread; no lock needed */ + ast_explicit_goto(control->channel, continue_data->context, continue_data->extension, continue_data->priority); + control->is_done = 1; + return NULL; } -void stasis_app_control_continue(struct stasis_app_control *control) +int stasis_app_control_continue(struct stasis_app_control *control, const char *context, const char *extension, int priority) { - stasis_app_send_command_async(control, app_control_continue, NULL); + struct stasis_app_control_continue_data *continue_data; + + if (!(continue_data = ast_calloc(1, sizeof(*continue_data)))) { + return -1; + } + ast_copy_string(continue_data->context, S_OR(context, ""), sizeof(continue_data->context)); + ast_copy_string(continue_data->extension, S_OR(extension, ""), sizeof(continue_data->extension)); + if (priority > 0) { + continue_data->priority = priority; + } else { + continue_data->priority = -1; + } + + stasis_app_send_command_async(control, app_control_continue, continue_data); + + return 0; } struct ast_channel_snapshot *stasis_app_control_get_snapshot( diff --git a/res/stasis_http/resource_channels.c b/res/stasis_http/resource_channels.c index c51696a28..4d2ebdfbd 100644 --- a/res/stasis_http/resource_channels.c +++ b/res/stasis_http/resource_channels.c @@ -97,7 +97,11 @@ void stasis_http_continue_in_dialplan( return; } - stasis_app_control_continue(control); + if (stasis_app_control_continue(control, args->context, args->extension, args->priority)) { + stasis_http_response_alloc_failed(response); + return; + } + stasis_http_response_no_content(response); } diff --git a/res/stasis_http/resource_channels.h b/res/stasis_http/resource_channels.h index 4616611e6..1cb408b4a 100644 --- a/res/stasis_http/resource_channels.h +++ b/res/stasis_http/resource_channels.h @@ -124,6 +124,12 @@ void stasis_http_dial(struct ast_variable *headers, struct ast_dial_args *args, struct ast_continue_in_dialplan_args { /*! \brief Channel's id */ const char *channel_id; + /*! \brief The context to continue to. */ + const char *context; + /*! \brief The extension to continue to. */ + const char *extension; + /*! \brief The priority to continue to. */ + int priority; }; /*! * \brief Exit application; continue execution in the dialplan. |