diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index 96c2bc8bc4..0ca6b08de0 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -112,7 +112,7 @@ api_command_t conference_api_sub_commands[] = { {"vid-mute-img", (void_fn_t) & conference_api_sub_vid_mute_img, CONF_API_SUB_MEMBER_TARGET, "vid-mute-img", " [|clear]"}, {"vid-logo-img", (void_fn_t) & conference_api_sub_vid_logo_img, CONF_API_SUB_MEMBER_TARGET, "vid-logo-img", " [|clear]"}, {"vid-codec-group", (void_fn_t) & conference_api_sub_vid_codec_group, CONF_API_SUB_MEMBER_TARGET, "vid-codec-group", " [|clear]"}, - {"vid-res-id", (void_fn_t) & conference_api_sub_vid_res_id, CONF_API_SUB_MEMBER_TARGET, "vid-res-id", " |clear"}, + {"vid-res-id", (void_fn_t) & conference_api_sub_vid_res_id, CONF_API_SUB_ARGS_SPLIT, "vid-res-id", "|all |clear [force]"}, {"vid-role-id", (void_fn_t) & conference_api_sub_vid_role_id, CONF_API_SUB_MEMBER_TARGET, "vid-role-id", " |clear"}, {"get-uuid", (void_fn_t) & conference_api_sub_get_uuid, CONF_API_SUB_MEMBER_TARGET, "get-uuid", ""}, {"clear-vid-floor", (void_fn_t) & conference_api_sub_clear_vid_floor, CONF_API_SUB_ARGS_AS_ONE, "clear-vid-floor", ""}, @@ -2497,13 +2497,58 @@ static void clear_role_id(conference_obj_t *conference, conference_member_t *mem switch_mutex_unlock(conference->member_mutex); } -switch_status_t conference_api_sub_vid_res_id(conference_member_t *member, switch_stream_handle_t *stream, void *data) +switch_status_t conference_api_sub_vid_res_id(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) { - char *text = (char *) data; + uint8_t all = 0, clear = 0, force = 0; + uint32_t member_id; + char *res_id = NULL; + conference_member_t *member; - if (member == NULL) + if (argc < 3 || argc > 5) return SWITCH_STATUS_GENERR; + res_id = argv[3]; + + if (argc > 3) { + if (!strcasecmp(res_id, "clear")) { + clear = 1; + } + } else { + clear = 1; + } + + if (argc > 4) + force = strcasecmp(argv[4], "force") ? 0 : 1; + + if (!(member_id = atoi(argv[2]))) { + all = strcasecmp(argv[2], "all") ? 0 : 1; + } + + if (all && clear) { + switch_mutex_lock(conference->member_mutex); + for (member = conference->members; member; member = member->next) { + if (member->session && !conference_utils_member_test_flag(member, MFLAG_NOCHANNEL)) { + conference_api_sub_vid_res_id_member(member, stream, res_id, clear, force); + } + } + switch_mutex_unlock(conference->member_mutex); + } else if (member_id) { + if (!(member = conference_member_get(conference, member_id))) + return SWITCH_STATUS_GENERR; + conference_api_sub_vid_res_id_member(member, stream, res_id, clear, force); + switch_thread_rwlock_unlock(member->rwlock); + } else { + return SWITCH_STATUS_GENERR; + } + + return SWITCH_STATUS_SUCCESS; + +} + + +switch_status_t conference_api_sub_vid_res_id_member(conference_member_t *member, switch_stream_handle_t *stream, char *res_id, int clear, int force) +{ + if (!switch_channel_test_flag(member->channel, CF_VIDEO)) { return SWITCH_STATUS_FALSE; } @@ -2513,22 +2558,20 @@ switch_status_t conference_api_sub_vid_res_id(conference_member_t *member, switc return SWITCH_STATUS_SUCCESS; } - if (zstr(text) || !strcasecmp(text, "clear") || (member->video_reservation_id && !strcasecmp(text, member->video_reservation_id))) { + if (clear || (!force && member->video_reservation_id && !strcasecmp(res_id, member->video_reservation_id))) { member->video_reservation_id = NULL; stream->write_function(stream, "+OK reservation_id cleared\n"); conference_video_detach_video_layer(member); } else { - clear_res_id(member->conference, member, text); - if (!member->video_reservation_id || strcmp(member->video_reservation_id, text)) { - member->video_reservation_id = switch_core_strdup(member->pool, text); + clear_res_id(member->conference, member, res_id); + if (!member->video_reservation_id || strcmp(member->video_reservation_id, res_id)) { + member->video_reservation_id = switch_core_strdup(member->pool, res_id); } - stream->write_function(stream, "+OK reservation_id %s\n", text); + stream->write_function(stream, "+OK reservation_id %s\n", res_id); conference_video_detach_video_layer(member); conference_video_find_floor(member, SWITCH_FALSE); } - - return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index 60920410a2..a11015321e 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -1223,7 +1223,8 @@ switch_status_t conference_api_sub_exit_sound(conference_obj_t *conference, swit switch_status_t conference_api_sub_vid_banner(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_enter_sound(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_set(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); -switch_status_t conference_api_sub_vid_res_id(conference_member_t *member, switch_stream_handle_t *stream, void *data); +switch_status_t conference_api_sub_vid_res_id(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); +switch_status_t conference_api_sub_vid_res_id_member(conference_member_t *member, switch_stream_handle_t *stream, char *res_id, int clear, int force); switch_status_t conference_api_sub_vid_role_id(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_get_uuid(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_get(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);