[asterisk-commits] mmichelson: branch 13 r430337 - in /branches/13: ./ res/ res/ari/ rest-api/ r...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Jan 7 12:53:22 CST 2015
Author: mmichelson
Date: Wed Jan 7 12:53:16 2015
New Revision: 430337
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=430337
Log:
Add the ability to continue and originate using priority labels.
With this patch, the following two ARI commands
POST /channels
POST /channels/{id}/continue
Accept a new parameter, label, that can be used to continue to or originate
to a priority label in the dialplan.
Because this is adding a new parameter to ARI commands, the API version of
ARI has been bumped from 1.6.0 to 1.7.0.
This patch comes courtesy of Nir Simionovich from Greenfield Tech. Thanks!
ASTERISK-24412 #close
Reported by Nir Simionovich
Review: https://reviewboard.asterisk.org/r/4285
Modified:
branches/13/CHANGES
branches/13/res/ari/resource_channels.c
branches/13/res/ari/resource_channels.h
branches/13/res/res_ari_channels.c
branches/13/rest-api/api-docs/channels.json
branches/13/rest-api/resources.json
Modified: branches/13/CHANGES
URL: http://svnview.digium.com/svn/asterisk/branches/13/CHANGES?view=diff&rev=430337&r1=430336&r2=430337
==============================================================================
--- branches/13/CHANGES (original)
+++ branches/13/CHANGES Wed Jan 7 12:53:16 2015
@@ -48,6 +48,11 @@
* "language" (the default spoken language for the channel) is now included in
the standard channel state output for suitable events.
+
+ * The POST channels/{id} operation and the POST channels/{id}/continue operation
+ now have a new "label" parameter. This allows for origination or continuation
+ to a labeled priority in the dialplan instead of requiring a specific priority
+ number. The ARI version has been bumped to 1.7.0 as a result.
AMI
------------------
Modified: branches/13/res/ari/resource_channels.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/res/ari/resource_channels.c?view=diff&rev=430337&r1=430336&r2=430337
==============================================================================
--- branches/13/res/ari/resource_channels.c (original)
+++ branches/13/res/ari/resource_channels.c Wed Jan 7 12:53:16 2015
@@ -91,6 +91,10 @@
struct ast_ari_response *response)
{
RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
+ int ipri;
+ const char *context;
+ const char *exten;
ast_assert(response != NULL);
@@ -99,7 +103,52 @@
return;
}
- if (stasis_app_control_continue(control, args->context, args->extension, args->priority)) {
+ snapshot = stasis_app_control_get_snapshot(control);
+ if (!snapshot) {
+ return;
+ }
+
+ if (ast_strlen_zero(args->context)) {
+ context = snapshot->context;
+ exten = S_OR(args->extension, snapshot->exten);
+ } else {
+ context = args->context;
+ exten = S_OR(args->extension, "s");
+ }
+
+ if (!ast_strlen_zero(args->label)) {
+ /* A label was provided in the request, use that */
+
+ if (sscanf(args->label, "%30d", &ipri) != 1) {
+ ipri = ast_findlabel_extension(NULL, context, exten, args->label, NULL);
+ if (ipri == -1) {
+ ast_log(AST_LOG_ERROR, "Requested label: %s can not be found in context: %s\n", args->label, context);
+ ast_ari_response_error(response, 404, "Not Found", "Requested label can not be found");
+ return;
+ }
+ } else {
+ ast_debug(3, "Numeric value provided for label, jumping to that priority\n");
+ }
+
+ if (ipri == 0) {
+ ast_log(AST_LOG_ERROR, "Invalid priority label '%s' specified for extension %s in context: %s\n",
+ args->label, exten, context);
+ ast_ari_response_error(response, 400, "Bad Request", "Requested priority is illegal");
+ return;
+ }
+
+ } else if (args->priority) {
+ /* No label provided, use provided priority */
+ ipri = args->priority;
+ } else if (ast_strlen_zero(args->context) && ast_strlen_zero(args->extension)) {
+ /* Special case. No exten, context, or priority provided, then move on to the next priority */
+ ipri = snapshot->priority + 1;
+ } else {
+ ipri = 1;
+ }
+
+
+ if (stasis_app_control_continue(control, context, exten, ipri)) {
ast_ari_response_alloc_failed(response);
return;
}
@@ -791,6 +840,7 @@
const char *args_extension,
const char *args_context,
long args_priority,
+ const char *args_label,
const char *args_app,
const char *args_app_args,
const char *args_caller_id,
@@ -811,7 +861,7 @@
ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT), ao2_cleanup);
char *stuff;
struct ast_channel *other = NULL;
- struct ast_channel *chan;
+ struct ast_channel *chan = NULL;
RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
struct ast_assigned_ids assignedids = {
.uniqueid = args_channel_id,
@@ -880,7 +930,36 @@
ast_copy_string(origination->context, S_OR(args_context, "default"), sizeof(origination->context));
ast_copy_string(origination->exten, args_extension, sizeof(origination->exten));
- origination->priority = args_priority ? args_priority : 1;
+
+ if (!ast_strlen_zero(args_label)) {
+ /* A label was provided in the request, use that */
+ int ipri = 1;
+ if (sscanf(args_label, "%30d", &ipri) != 1) {
+ ipri = ast_findlabel_extension(chan, origination->context, origination->exten, args_label, args_caller_id);
+
+ if (ipri == -1) {
+ ast_log(AST_LOG_ERROR, "Requested label: %s can not be found in context: %s\n", args_label, args_context);
+ ast_ari_response_error(response, 404, "Not Found", "Requested label can not be found");
+ return;
+ }
+ } else {
+ ast_debug(3, "Numeric value provided for label, jumping to that priority\n");
+ }
+
+ if (ipri == 0) {
+ ast_log(AST_LOG_ERROR, "Invalid priority label '%s' specified for extension %s in context: %s\n",
+ args_label, args_extension, args_context);
+ ast_ari_response_error(response, 400, "Bad Request", "Requested priority is illegal");
+ return;
+ }
+
+ /* Our priority was provided by a label */
+ origination->priority = ipri;
+ } else {
+ /* No label provided, use provided priority */
+ origination->priority = args_priority ? args_priority : 1;
+ }
+
origination->appdata[0] = '\0';
} else {
ast_ari_response_error(response, 400, "Bad Request",
@@ -1042,6 +1121,7 @@
args->extension,
args->context,
args->priority,
+ args->label,
args->app,
args->app_args,
args->caller_id,
@@ -1079,6 +1159,7 @@
args->extension,
args->context,
args->priority,
+ args->label,
args->app,
args->app_args,
args->caller_id,
Modified: branches/13/res/ari/resource_channels.h
URL: http://svnview.digium.com/svn/asterisk/branches/13/res/ari/resource_channels.h?view=diff&rev=430337&r1=430336&r2=430337
==============================================================================
--- branches/13/res/ari/resource_channels.h (original)
+++ branches/13/res/ari/resource_channels.h Wed Jan 7 12:53:16 2015
@@ -60,6 +60,8 @@
const char *context;
/*! The priority to dial after the endpoint answers. If omitted, uses 1 */
long priority;
+ /*! The label to dial after the endpoint answers. Will supersede 'priority' if provided. */
+ const char *label;
/*! The application that is subscribed to the originated channel, and passed to the Stasis application. */
const char *app;
/*! The application arguments to pass to the Stasis application. */
@@ -123,6 +125,8 @@
const char *context;
/*! The priority to dial after the endpoint answers. If omitted, uses 1 */
long priority;
+ /*! The label to dial after the endpoint answers. Will supersede priority, if provided */
+ const char *label;
/*! The application that is subscribed to the originated channel, and passed to the Stasis application. */
const char *app;
/*! The application arguments to pass to the Stasis application. */
@@ -195,6 +199,8 @@
const char *extension;
/*! The priority to continue to. */
int priority;
+ /*! The label to continue to - will supersede 'priority' if both are provided. */
+ const char *label;
};
/*!
* \brief Body parsing function for /channels/{channelId}/continue.
Modified: branches/13/res/res_ari_channels.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/res/res_ari_channels.c?view=diff&rev=430337&r1=430336&r2=430337
==============================================================================
--- branches/13/res/res_ari_channels.c (original)
+++ branches/13/res/res_ari_channels.c Wed Jan 7 12:53:16 2015
@@ -124,6 +124,10 @@
if (field) {
args->priority = ast_json_integer_get(field);
}
+ field = ast_json_object_get(body, "label");
+ if (field) {
+ args->label = ast_json_string_get(field);
+ }
field = ast_json_object_get(body, "app");
if (field) {
args->app = ast_json_string_get(field);
@@ -187,6 +191,9 @@
} else
if (strcmp(i->name, "priority") == 0) {
args.priority = atol(i->value);
+ } else
+ if (strcmp(i->name, "label") == 0) {
+ args.label = (i->value);
} else
if (strcmp(i->name, "app") == 0) {
args.app = (i->value);
@@ -341,6 +348,10 @@
if (field) {
args->priority = ast_json_integer_get(field);
}
+ field = ast_json_object_get(body, "label");
+ if (field) {
+ args->label = ast_json_string_get(field);
+ }
field = ast_json_object_get(body, "app");
if (field) {
args->app = ast_json_string_get(field);
@@ -400,6 +411,9 @@
} else
if (strcmp(i->name, "priority") == 0) {
args.priority = atol(i->value);
+ } else
+ if (strcmp(i->name, "label") == 0) {
+ args.label = (i->value);
} else
if (strcmp(i->name, "app") == 0) {
args.app = (i->value);
@@ -592,6 +606,10 @@
if (field) {
args->priority = ast_json_integer_get(field);
}
+ field = ast_json_object_get(body, "label");
+ if (field) {
+ args->label = ast_json_string_get(field);
+ }
return 0;
}
@@ -624,6 +642,9 @@
} else
if (strcmp(i->name, "priority") == 0) {
args.priority = atoi(i->value);
+ } else
+ if (strcmp(i->name, "label") == 0) {
+ args.label = (i->value);
} else
{}
}
Modified: branches/13/rest-api/api-docs/channels.json
URL: http://svnview.digium.com/svn/asterisk/branches/13/rest-api/api-docs/channels.json?view=diff&rev=430337&r1=430336&r2=430337
==============================================================================
--- branches/13/rest-api/api-docs/channels.json (original)
+++ branches/13/rest-api/api-docs/channels.json Wed Jan 7 12:53:16 2015
@@ -57,6 +57,14 @@
"dataType": "long"
},
{
+ "name": "label",
+ "description": "The label to dial after the endpoint answers. Will supersede 'priority' if provided.",
+ "paramType": "query",
+ "required": false,
+ "allowMultiple": false,
+ "dataType": "string"
+ },
+ {
"name": "app",
"description": "The application that is subscribed to the originated channel, and passed to the Stasis application.",
"paramType": "query",
@@ -203,6 +211,14 @@
"required": false,
"allowMultiple": false,
"dataType": "long"
+ },
+ {
+ "name": "label",
+ "description": "The label to dial after the endpoint answers. Will supersede priority, if provided",
+ "paramType": "query",
+ "required": false,
+ "allowMultiple": false,
+ "dataType": "string"
},
{
"name": "app",
@@ -356,6 +372,14 @@
"required": false,
"allowMultiple": false,
"dataType": "int"
+ },
+ {
+ "name": "label",
+ "description": "The label to continue to - will supersede 'priority' if both are provided.",
+ "paramType": "query",
+ "required": false,
+ "allowMultiple": false,
+ "dataType": "string"
}
],
"errorResponses": [
Modified: branches/13/rest-api/resources.json
URL: http://svnview.digium.com/svn/asterisk/branches/13/rest-api/resources.json?view=diff&rev=430337&r1=430336&r2=430337
==============================================================================
--- branches/13/rest-api/resources.json (original)
+++ branches/13/rest-api/resources.json Wed Jan 7 12:53:16 2015
@@ -2,7 +2,7 @@
"_copyright": "Copyright (C) 2012 - 2013, Digium, Inc.",
"_author": "David M. Lee, II <dlee at digium.com>",
"_svn_revision": "$Revision$",
- "apiVersion": "1.6.0",
+ "apiVersion": "1.7.0",
"swaggerVersion": "1.1",
"basePath": "http://localhost:8088/ari",
"apis": [
More information about the asterisk-commits
mailing list