diff options
Diffstat (limited to 'res/ari/resource_bridges.c')
-rw-r--r-- | res/ari/resource_bridges.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/res/ari/resource_bridges.c b/res/ari/resource_bridges.c index e09bea6b5..c07471816 100644 --- a/res/ari/resource_bridges.c +++ b/res/ari/resource_bridges.c @@ -172,6 +172,22 @@ static struct control_list *control_list_create(struct ast_ari_response *respons return list; } +static int check_add_remove_channel(struct ast_ari_response *response, + struct stasis_app_control *control, + enum stasis_app_control_channel_result result) +{ + switch (result) { + case STASIS_APP_CHANNEL_RECORDING : + ast_ari_response_error( + response, 409, "Conflict", "Channel %s currently recording", + stasis_app_control_get_channel_id(control)); + return -1; + case STASIS_APP_CHANNEL_OKAY: + return 0; + } + return 0; +} + void ast_ari_bridges_add_channel(struct ast_variable *headers, struct ast_ari_bridges_add_channel_args *args, struct ast_ari_response *response) @@ -179,6 +195,7 @@ void ast_ari_bridges_add_channel(struct ast_variable *headers, RAII_VAR(struct ast_bridge *, bridge, find_bridge(response, args->bridge_id), ao2_cleanup); RAII_VAR(struct control_list *, list, NULL, ao2_cleanup); size_t i; + int has_error = 0; if (!bridge) { /* Response filled in by find_bridge() */ @@ -202,10 +219,16 @@ void ast_ari_bridges_add_channel(struct ast_variable *headers, } for (i = 0; i < list->count; ++i) { - stasis_app_control_add_channel_to_bridge(list->controls[i], bridge); + if ((has_error = check_add_remove_channel(response, list->controls[i], + stasis_app_control_add_channel_to_bridge( + list->controls[i], bridge)))) { + break; + } } - ast_ari_response_no_content(response); + if (!has_error) { + ast_ari_response_no_content(response); + } } void ast_ari_bridges_remove_channel(struct ast_variable *headers, |