diff options
Diffstat (limited to 'res/ari/resource_channels.c')
-rw-r--r-- | res/ari/resource_channels.c | 87 |
1 files changed, 84 insertions, 3 deletions
diff --git a/res/ari/resource_channels.c b/res/ari/resource_channels.c index e3ef9eb16..d1d54a2f0 100644 --- a/res/ari/resource_channels.c +++ b/res/ari/resource_channels.c @@ -91,6 +91,10 @@ void ast_ari_channels_continue_in_dialplan( 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 @@ void ast_ari_channels_continue_in_dialplan( 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 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint, 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 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint, 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 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint, 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 @@ void ast_ari_channels_originate_with_id(struct ast_variable *headers, args->extension, args->context, args->priority, + args->label, args->app, args->app_args, args->caller_id, @@ -1079,6 +1159,7 @@ void ast_ari_channels_originate(struct ast_variable *headers, args->extension, args->context, args->priority, + args->label, args->app, args->app_args, args->caller_id, |