FS-10554: Refactor conference vid-res-id command, add 'force' option

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]
This commit is contained in:
Chad Phillips 2017-09-29 06:15:12 -04:00
parent 78aec0fe81
commit cc084c9fb4
2 changed files with 56 additions and 12 deletions

View 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,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;
}

View 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);