@ -687,37 +687,30 @@ void ast_ari_channels_list(struct ast_variable *headers,
ast_ari_response_ok ( response , ast_json_ref ( json ) ) ;
ast_ari_response_ok ( response , ast_json_ref ( json ) ) ;
}
}
static int ari_channels_set_channel_var ( struct ast_channel * chan ,
static int json_to_ast_variables ( struct ast_json * json_variables , struct ast_variable * * variables )
const char * variable , const char * value , struct ast_ari_response * response )
{
{
if ( pbx_builtin_setvar_helper ( chan , variable , value ) ) {
struct ast_variable * current = NULL ;
ast_ari_response_error (
struct ast_json_iter * it_json_var ;
response , 400 , " Bad Request " ,
" Unable to set channel variable %s=%s " , variable , value ) ;
for ( it_json_var = ast_json_object_iter ( json_variables ) ; it_json_var ;
return - 1 ;
it_json_var = ast_json_object_iter_next ( json_variables , it_json_var ) ) {
}
struct ast_variable * new_var ;
return 0 ;
new_var = ast_variable_new ( ast_json_object_iter_key ( it_json_var ) ,
}
ast_json_string_get ( ast_json_object_iter_value ( it_json_var ) ) ,
" " ) ;
static int ari_channels_set_channel_vars ( struct ast_channel * chan ,
if ( ! new_var ) {
struct ast_json * variables , struct ast_ari_response * response )
ast_variables_destroy ( * variables ) ;
{
* variables = NULL ;
struct ast_json_iter * i ;
return 1 ;
}
if ( ! variables ) {
/* nothing to do */
return 0 ;
}
for ( i = ast_json_object_iter ( variables ) ; i ;
if ( ! current ) {
i = ast_json_object_iter_next ( variables , i ) ) {
* variables = new_var ;
if ( ari_channels_set_channel_var (
current = * variables ;
chan , ast_json_object_iter_key ( i ) ,
} else {
ast_json_string_get ( ast_json_object_iter_value ( i ) ) ,
current - > next = new_var ;
response ) ) {
current = new_var ;
/* response filled in by called function */
return - 1 ;
}
}
}
}
@ -737,11 +730,10 @@ void ast_ari_channels_originate(struct ast_variable *headers,
RAII_VAR ( struct ast_format_cap * , cap ,
RAII_VAR ( struct ast_format_cap * , cap ,
ast_format_cap_alloc ( AST_FORMAT_CAP_FLAG_NOLOCK ) , ast_format_cap_destroy ) ;
ast_format_cap_alloc ( AST_FORMAT_CAP_FLAG_NOLOCK ) , ast_format_cap_destroy ) ;
struct ast_format tmp_fmt ;
struct ast_format tmp_fmt ;
RAII_VAR ( struct ast_variable * , variables , NULL , ast_variables_destroy ) ;
char * stuff ;
char * stuff ;
struct ast_channel * chan ;
struct ast_channel * chan ;
RAII_VAR ( struct ast_channel_snapshot * , snapshot , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_channel_snapshot * , snapshot , NULL , ao2_cleanup ) ;
struct ast_json * variable_list = NULL ;
if ( ! cap ) {
if ( ! cap ) {
ast_ari_response_alloc_failed ( response ) ;
ast_ari_response_alloc_failed ( response ) ;
@ -751,8 +743,17 @@ void ast_ari_channels_originate(struct ast_variable *headers,
/* Parse any query parameters out of the body parameter */
/* Parse any query parameters out of the body parameter */
if ( args - > variables ) {
if ( args - > variables ) {
struct ast_json * json_variables ;
ast_ari_channels_originate_parse_body ( args - > variables , args ) ;
ast_ari_channels_originate_parse_body ( args - > variables , args ) ;
variable_list = ast_json_object_get ( args - > variables , " variables " ) ;
json_variables = ast_json_object_get ( args - > variables , " variables " ) ;
if ( json_variables ) {
if ( json_to_ast_variables ( json_variables , & variables ) ) {
ast_log ( AST_LOG_ERROR , " Unable to convert 'variables' in JSON body to channel variables \n " ) ;
ast_ari_response_alloc_failed ( response ) ;
return ;
}
}
}
}
if ( ast_strlen_zero ( args - > endpoint ) ) {
if ( ast_strlen_zero ( args - > endpoint ) ) {
@ -804,13 +805,13 @@ void ast_ari_channels_originate(struct ast_variable *headers,
}
}
/* originate a channel, putting it into an application */
/* originate a channel, putting it into an application */
if ( ast_pbx_outgoing_app ( dialtech , cap , dialdevice , timeout , app , ast_str_buffer ( appdata ) , NULL , 0 , cid_num , cid_name , NULL , NULL , & chan ) ) {
if ( ast_pbx_outgoing_app ( dialtech , cap , dialdevice , timeout , app , ast_str_buffer ( appdata ) , NULL , 0 , cid_num , cid_name , variables , NULL , & chan ) ) {
ast_ari_response_alloc_failed ( response ) ;
ast_ari_response_alloc_failed ( response ) ;
return ;
return ;
}
}
} else if ( ! ast_strlen_zero ( args - > extension ) ) {
} else if ( ! ast_strlen_zero ( args - > extension ) ) {
/* originate a channel, sending it to an extension */
/* originate a channel, sending it to an extension */
if ( ast_pbx_outgoing_exten ( dialtech , cap , dialdevice , timeout , S_OR ( args - > context , " default " ) , args - > extension , args - > priority ? args - > priority : 1 , NULL , 0 , cid_num , cid_name , NULL , NULL , & chan , 0 ) ) {
if ( ast_pbx_outgoing_exten ( dialtech , cap , dialdevice , timeout , S_OR ( args - > context , " default " ) , args - > extension , args - > priority ? args - > priority : 1 , NULL , 0 , cid_num , cid_name , variables , NULL , & chan , 0 ) ) {
ast_ari_response_alloc_failed ( response ) ;
ast_ari_response_alloc_failed ( response ) ;
return ;
return ;
}
}
@ -820,11 +821,6 @@ void ast_ari_channels_originate(struct ast_variable *headers,
return ;
return ;
}
}
if ( ari_channels_set_channel_vars ( chan , variable_list , response ) ) {
/* response filled in by called function */
return ;
}
snapshot = ast_channel_snapshot_create ( chan ) ;
snapshot = ast_channel_snapshot_create ( chan ) ;
ast_channel_unlock ( chan ) ;
ast_channel_unlock ( chan ) ;