mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-22 20:56:39 +00:00
Merge "ari/resource_channels: Add 'formats' to channel create/originate" into 13
This commit is contained in:
@@ -912,6 +912,7 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint,
|
||||
const char *args_channel_id,
|
||||
const char *args_other_channel_id,
|
||||
const char *args_originator,
|
||||
const char *args_formats,
|
||||
struct ast_ari_response *response)
|
||||
{
|
||||
char *dialtech;
|
||||
@@ -930,6 +931,7 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint,
|
||||
};
|
||||
struct ari_origination *origination;
|
||||
pthread_t thread;
|
||||
struct ast_format_cap *format_cap = NULL;
|
||||
|
||||
if ((assignedids.uniqueid && AST_MAX_PUBLIC_UNIQUEID < strlen(assignedids.uniqueid))
|
||||
|| (assignedids.uniqueid2 && AST_MAX_PUBLIC_UNIQUEID < strlen(assignedids.uniqueid2))) {
|
||||
@@ -944,6 +946,12 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ast_strlen_zero(args_originator) && !ast_strlen_zero(args_formats)) {
|
||||
ast_ari_response_error(response, 400, "Bad Request",
|
||||
"Originator and formats can't both be specified");
|
||||
return;
|
||||
}
|
||||
|
||||
dialtech = ast_strdupa(args_endpoint);
|
||||
if ((stuff = strchr(dialtech, '/'))) {
|
||||
*stuff++ = '\0';
|
||||
@@ -1066,7 +1074,41 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint,
|
||||
}
|
||||
}
|
||||
|
||||
if (ast_dial_prerun(dial, other, NULL)) {
|
||||
if (!ast_strlen_zero(args_formats)) {
|
||||
char *format_name;
|
||||
char *formats_copy = ast_strdupa(args_formats);
|
||||
|
||||
if (!(format_cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
|
||||
ast_ari_response_alloc_failed(response);
|
||||
ast_dial_destroy(dial);
|
||||
ast_free(origination);
|
||||
ast_channel_cleanup(other);
|
||||
return;
|
||||
}
|
||||
|
||||
while ((format_name = ast_strip(strsep(&formats_copy, ",")))) {
|
||||
struct ast_format *fmt = ast_format_cache_get(format_name);
|
||||
|
||||
if (!fmt || ast_format_cap_append(format_cap, fmt, 0)) {
|
||||
if (!fmt) {
|
||||
ast_ari_response_error(
|
||||
response, 400, "Bad Request",
|
||||
"Provided format (%s) was not found", format_name);
|
||||
} else {
|
||||
ast_ari_response_alloc_failed(response);
|
||||
}
|
||||
ast_dial_destroy(dial);
|
||||
ast_free(origination);
|
||||
ast_channel_cleanup(other);
|
||||
ao2_ref(format_cap, -1);
|
||||
ao2_cleanup(fmt);
|
||||
return;
|
||||
}
|
||||
ao2_ref(fmt, -1);
|
||||
}
|
||||
}
|
||||
|
||||
if (ast_dial_prerun(dial, other, format_cap)) {
|
||||
ast_ari_response_alloc_failed(response);
|
||||
ast_dial_destroy(dial);
|
||||
ast_free(origination);
|
||||
@@ -1075,6 +1117,7 @@ static void ari_channels_handle_originate_with_id(const char *args_endpoint,
|
||||
}
|
||||
|
||||
ast_channel_cleanup(other);
|
||||
ao2_cleanup(format_cap);
|
||||
|
||||
chan = ast_dial_get_channel(dial, 0);
|
||||
if (!chan) {
|
||||
@@ -1215,6 +1258,7 @@ void ast_ari_channels_originate_with_id(struct ast_variable *headers,
|
||||
args->channel_id,
|
||||
args->other_channel_id,
|
||||
args->originator,
|
||||
args->formats,
|
||||
response);
|
||||
ast_variables_destroy(variables);
|
||||
}
|
||||
@@ -1251,6 +1295,7 @@ void ast_ari_channels_originate(struct ast_variable *headers,
|
||||
args->channel_id,
|
||||
args->other_channel_id,
|
||||
args->originator,
|
||||
args->formats,
|
||||
response);
|
||||
ast_variables_destroy(variables);
|
||||
}
|
||||
|
@@ -78,6 +78,8 @@ struct ast_ari_channels_originate_args {
|
||||
const char *other_channel_id;
|
||||
/*! The unique id of the channel which is originating this one. */
|
||||
const char *originator;
|
||||
/*! The format name capability list to use if originator is not specified. Ex. "ulaw,slin16". Format names an be found with "core show codecs". */
|
||||
const char *formats;
|
||||
};
|
||||
/*!
|
||||
* \brief Body parsing function for /channels.
|
||||
@@ -141,6 +143,8 @@ struct ast_ari_channels_originate_with_id_args {
|
||||
const char *other_channel_id;
|
||||
/*! The unique id of the channel which is originating this one. */
|
||||
const char *originator;
|
||||
/*! The format name capability list to use if originator is not specified. Ex. "ulaw,slin16". Format names an be found with "core show codecs". */
|
||||
const char *formats;
|
||||
};
|
||||
/*!
|
||||
* \brief Body parsing function for /channels/{channelId}.
|
||||
|
@@ -157,6 +157,10 @@ int ast_ari_channels_originate_parse_body(
|
||||
if (field) {
|
||||
args->originator = ast_json_string_get(field);
|
||||
}
|
||||
field = ast_json_object_get(body, "formats");
|
||||
if (field) {
|
||||
args->formats = ast_json_string_get(field);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -217,6 +221,9 @@ static void ast_ari_channels_originate_cb(
|
||||
if (strcmp(i->name, "originator") == 0) {
|
||||
args.originator = (i->value);
|
||||
} else
|
||||
if (strcmp(i->name, "formats") == 0) {
|
||||
args.formats = (i->value);
|
||||
} else
|
||||
{}
|
||||
}
|
||||
/* Look for a JSON request entity */
|
||||
@@ -377,6 +384,10 @@ int ast_ari_channels_originate_with_id_parse_body(
|
||||
if (field) {
|
||||
args->originator = ast_json_string_get(field);
|
||||
}
|
||||
field = ast_json_object_get(body, "formats");
|
||||
if (field) {
|
||||
args->formats = ast_json_string_get(field);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -434,6 +445,9 @@ static void ast_ari_channels_originate_with_id_cb(
|
||||
if (strcmp(i->name, "originator") == 0) {
|
||||
args.originator = (i->value);
|
||||
} else
|
||||
if (strcmp(i->name, "formats") == 0) {
|
||||
args.formats = (i->value);
|
||||
} else
|
||||
{}
|
||||
}
|
||||
for (i = path_vars; i; i = i->next) {
|
||||
|
Reference in New Issue
Block a user