summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJason Parker <jparker@digium.com>2013-06-26 19:29:57 +0000
committerJason Parker <jparker@digium.com>2013-06-26 19:29:57 +0000
commit609c42c854c8880548571241b893604c02d513d4 (patch)
tree8e133c58a4a5040c67b61cafb03332c66cddf2a6 /res
parent5e27e13e284402d44d8e90051aba230ecf3c7547 (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.c12
-rw-r--r--res/stasis/control.c31
-rw-r--r--res/stasis_http/resource_channels.c6
-rw-r--r--res/stasis_http/resource_channels.h6
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.