]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10554: Refactor conference vid-res-id command, add 'force' option
authorChad Phillips <chad@apartmentlines.com>
Fri, 29 Sep 2017 10:15:12 +0000 (06:15 -0400)
committerChad Phillips <chad@apartmentlines.com>
Wed, 25 Jul 2018 19:24:30 +0000 (14:24 -0500)
The 'conference vid-res-id' sub command previously used the CONF_API_SUB_MEMBER_TARGET
command parsing strategy. The standard options exposed by that strategy didn't make
sense for this sub command, so it's now been switched to use the CONF_API_SUB_ARGS_SPLIT
command parsing strategy.

A third, optional 'force' argument has also been added. The default behavior of the
command is to toggle the user in and out of a reservation slot, use the force argument
to ensure the user is placed into the reservation slot provided.

The new signature of the sub command is:

  vid-res-id <member_id> <val>|clear [force]

src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/mod_conference.h

index 96c2bc8bc41734aad92ffcd8b8fb2a6feec9852a..0ca6b08de0ba6e44bee56a4c951e8c5cac7b80e4 100644 (file)
@@ -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", "<member_id|last> [<path>|clear]"},
        {"vid-logo-img", (void_fn_t) & conference_api_sub_vid_logo_img, CONF_API_SUB_MEMBER_TARGET, "vid-logo-img", "<member_id|last> [<path>|clear]"},
        {"vid-codec-group", (void_fn_t) & conference_api_sub_vid_codec_group, CONF_API_SUB_MEMBER_TARGET, "vid-codec-group", "<member_id|last> [<group>|clear]"},
-       {"vid-res-id", (void_fn_t) & conference_api_sub_vid_res_id, CONF_API_SUB_MEMBER_TARGET, "vid-res-id", "<member_id|last> <val>|clear"},
+       {"vid-res-id", (void_fn_t) & conference_api_sub_vid_res_id, CONF_API_SUB_ARGS_SPLIT, "vid-res-id", "<member_id>|all <val>|clear [force]"},
        {"vid-role-id", (void_fn_t) & conference_api_sub_vid_role_id, CONF_API_SUB_MEMBER_TARGET, "vid-role-id", "<member_id|last> <val>|clear"},
        {"get-uuid", (void_fn_t) & conference_api_sub_get_uuid, CONF_API_SUB_MEMBER_TARGET, "get-uuid", "<member_id|last>"},
        {"clear-vid-floor", (void_fn_t) & conference_api_sub_clear_vid_floor, CONF_API_SUB_ARGS_AS_ONE, "clear-vid-floor", ""},
@@ -2497,12 +2497,57 @@ 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;
 
 }
index 60920410a2ca13b8b037089501bfd4ea8b482617..a11015321e44bb7ec8b3b757c50b962c9f5a8b14 100644 (file)
@@ -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);