[mod_conference] Members are searchable by var in more APIs

This commit is contained in:
Chris Rienzo 2020-05-13 17:36:11 -04:00 committed by Andrey Volk
parent ec7ec190b0
commit 6a2661b608
3 changed files with 52 additions and 28 deletions

View File

@ -138,17 +138,17 @@ switch_status_t conference_api_sub_pause_play(conference_obj_t *conference, swit
} }
if (argc == 3) { if (argc == 3) {
uint32_t id = atoi(argv[2]); const char * id = argv[2];
conference_member_t *member; conference_member_t *member;
if ((member = conference_member_get(conference, id))) { if ((member = conference_member_get_by_str(conference, id))) {
switch_mutex_lock(member->fnode_mutex); switch_mutex_lock(member->fnode_mutex);
conference_fnode_toggle_pause(member->fnode, stream); conference_fnode_toggle_pause(member->fnode, stream);
switch_mutex_unlock(member->fnode_mutex); switch_mutex_unlock(member->fnode_mutex);
switch_thread_rwlock_unlock(member->rwlock); switch_thread_rwlock_unlock(member->rwlock);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} else { } else {
stream->write_function(stream, "-ERR Member: %u not found.\n", id); stream->write_function(stream, "-ERR Member: %s not found.\n", id);
} }
} }
@ -166,17 +166,17 @@ switch_status_t conference_api_sub_play_status(conference_obj_t *conference, swi
} }
if (argc == 3) { if (argc == 3) {
uint32_t id = atoi(argv[2]); const char *id = argv[2];
conference_member_t *member; conference_member_t *member;
if ((member = conference_member_get(conference, id))) { if ((member = conference_member_get_by_str(conference, id))) {
switch_mutex_lock(member->fnode_mutex); switch_mutex_lock(member->fnode_mutex);
conference_fnode_check_status(member->fnode, stream); conference_fnode_check_status(member->fnode, stream);
switch_mutex_unlock(member->fnode_mutex); switch_mutex_unlock(member->fnode_mutex);
switch_thread_rwlock_unlock(member->rwlock); switch_thread_rwlock_unlock(member->rwlock);
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} else { } else {
stream->write_function(stream, "-ERR Member: %u not found.\n", id); stream->write_function(stream, "-ERR Member: %s not found.\n", id);
} }
} }
@ -2518,7 +2518,6 @@ static void clear_role_id(conference_obj_t *conference, conference_member_t *mem
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(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
{ {
uint8_t all = 0, clear = 0, force = 0; uint8_t all = 0, clear = 0, force = 0;
uint32_t member_id;
char *res_id = NULL; char *res_id = NULL;
conference_member_t *member; conference_member_t *member;
@ -2538,7 +2537,7 @@ switch_status_t conference_api_sub_vid_res_id(conference_obj_t *conference, swit
if (argc > 4) if (argc > 4)
force = strcasecmp(argv[4], "force") ? 0 : 1; force = strcasecmp(argv[4], "force") ? 0 : 1;
if (!(member_id = atoi(argv[2]))) { if (!atoi(argv[2])) {
all = strcasecmp(argv[2], "all") ? 0 : 1; all = strcasecmp(argv[2], "all") ? 0 : 1;
} }
@ -2550,13 +2549,11 @@ switch_status_t conference_api_sub_vid_res_id(conference_obj_t *conference, swit
} }
} }
switch_mutex_unlock(conference->member_mutex); switch_mutex_unlock(conference->member_mutex);
} else if (member_id) { } else {
if (!(member = conference_member_get(conference, member_id))) if (!(member = conference_member_get_by_str(conference, argv[2])))
return SWITCH_STATUS_GENERR; return SWITCH_STATUS_GENERR;
conference_api_sub_vid_res_id_member(member, stream, res_id, clear, force); conference_api_sub_vid_res_id_member(member, stream, res_id, clear, force);
switch_thread_rwlock_unlock(member->rwlock); switch_thread_rwlock_unlock(member->rwlock);
} else {
return SWITCH_STATUS_GENERR;
} }
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
@ -2735,10 +2732,10 @@ switch_status_t conference_api_sub_file_seek(conference_obj_t *conference, switc
} }
if (argc == 4) { if (argc == 4) {
uint32_t id = atoi(argv[3]); const char *id = argv[3];
conference_member_t *member = conference_member_get(conference, id); conference_member_t *member = conference_member_get_by_str(conference, id);
if (member == NULL) { if (member == NULL) {
stream->write_function(stream, "-ERR Member: %u not found.\n", id); stream->write_function(stream, "-ERR Member: %s not found.\n", id);
return SWITCH_STATUS_GENERR; return SWITCH_STATUS_GENERR;
} }
@ -2833,7 +2830,7 @@ switch_status_t conference_api_sub_play(conference_obj_t *conference, switch_str
} }
ret_status = SWITCH_STATUS_SUCCESS; ret_status = SWITCH_STATUS_SUCCESS;
} else if (argc >= 4) { } else if (argc >= 4) {
uint32_t id = atoi(argv[3]); const char *id = argv[3];
conference_member_t *member; conference_member_t *member;
switch_bool_t mux = SWITCH_TRUE; switch_bool_t mux = SWITCH_TRUE;
@ -2841,9 +2838,9 @@ switch_status_t conference_api_sub_play(conference_obj_t *conference, switch_str
mux = SWITCH_FALSE; mux = SWITCH_FALSE;
} }
if ((member = conference_member_get(conference, id))) { if ((member = conference_member_get_by_str(conference, id))) {
if (conference_member_play_file(member, argv[2], 0, mux) == SWITCH_STATUS_SUCCESS) { if (conference_member_play_file(member, argv[2], 0, mux) == SWITCH_STATUS_SUCCESS) {
stream->write_function(stream, "+OK (play) Playing file %s to member %u\n", argv[2], id); stream->write_function(stream, "+OK (play) Playing file %s to member %u\n", argv[2], member->id);
if (test_eflag(conference, EFLAG_PLAY_FILE_MEMBER) && if (test_eflag(conference, EFLAG_PLAY_FILE_MEMBER) &&
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_member_add_event_data(member, event); conference_member_add_event_data(member, event);
@ -2899,7 +2896,7 @@ switch_status_t conference_api_sub_saymember(conference_obj_t *conference, switc
char *expanded = NULL; char *expanded = NULL;
char *start_text = NULL; char *start_text = NULL;
char *workspace = NULL; char *workspace = NULL;
uint32_t id = 0; const char *id = NULL;
conference_member_t *member = NULL; conference_member_t *member = NULL;
switch_event_t *event; switch_event_t *event;
@ -2918,15 +2915,15 @@ switch_status_t conference_api_sub_saymember(conference_obj_t *conference, switc
text = start_text; text = start_text;
} }
id = atoi(workspace); id = workspace;
if (!id || zstr(text)) { if (!id || zstr(text)) {
stream->write_function(stream, "-ERR (saymember) No Text!\n"); stream->write_function(stream, "-ERR (saymember) No Text!\n");
goto done; goto done;
} }
if (!(member = conference_member_get(conference, id))) { if (!(member = conference_member_get_by_str(conference, id))) {
stream->write_function(stream, "-ERR (saymember) Unknown Member %u!\n", id); stream->write_function(stream, "-ERR (saymember) Unknown Member %s!\n", id);
goto done; goto done;
} }
@ -3236,15 +3233,15 @@ switch_status_t conference_api_sub_stop(conference_obj_t *conference, switch_str
return SWITCH_STATUS_GENERR; return SWITCH_STATUS_GENERR;
if (argc == 4) { if (argc == 4) {
uint32_t id = atoi(argv[3]); const char *id = argv[3];
conference_member_t *member; conference_member_t *member;
if ((member = conference_member_get(conference, id))) { if ((member = conference_member_get_by_str(conference, id))) {
uint32_t stopped = conference_member_stop_file(member, async ? FILE_STOP_ASYNC : current ? FILE_STOP_CURRENT : FILE_STOP_ALL); uint32_t stopped = conference_member_stop_file(member, async ? FILE_STOP_ASYNC : current ? FILE_STOP_CURRENT : FILE_STOP_ALL);
stream->write_function(stream, "+OK Stopped %u files.\n", stopped); stream->write_function(stream, "+OK Stopped %u files.\n", stopped);
switch_thread_rwlock_unlock(member->rwlock); switch_thread_rwlock_unlock(member->rwlock);
} else { } else {
stream->write_function(stream, "-ERR Member: %u not found.\n", id); stream->write_function(stream, "-ERR Member: %s not found.\n", id);
} }
} else { } else {
uint32_t stopped = conference_file_stop(conference, async ? FILE_STOP_ASYNC : current ? FILE_STOP_CURRENT : FILE_STOP_ALL); uint32_t stopped = conference_file_stop(conference, async ? FILE_STOP_ASYNC : current ? FILE_STOP_CURRENT : FILE_STOP_ALL);
@ -3659,13 +3656,13 @@ switch_status_t conference_api_sub_transfer(conference_obj_t *conference, switch
for (x = 3; x < argc; x++) { for (x = 3; x < argc; x++) {
conference_member_t *member = NULL; conference_member_t *member = NULL;
uint32_t id = atoi(argv[x]); const char *id = argv[x];
switch_channel_t *channel; switch_channel_t *channel;
switch_event_t *event; switch_event_t *event;
char *xdest = NULL; char *xdest = NULL;
if (!id || !(member = conference_member_get(conference, id))) { if (!id || !(member = conference_member_get_by_str(conference, id))) {
stream->write_function(stream, "-ERR No Member %u in conference %s.\n", id, conference->name); stream->write_function(stream, "-ERR No Member %s in conference %s.\n", id, conference->name);
continue; continue;
} }

View File

@ -442,6 +442,32 @@ conference_member_t *conference_member_get_by_var(conference_obj_t *conference,
return member; return member;
} }
/* traverse the conference member list for the specified member id or variable and return its pointer */
conference_member_t *conference_member_get_by_str(conference_obj_t *conference, const char *id_str)
{
conference_member_t *member = NULL;
switch_assert(conference != NULL);
if (!id_str) {
return NULL;
}
if (strchr(id_str, '=')) {
char *var, *val;
var = strdup(id_str);
switch_assert(var);
if ((val = strchr(var, '='))) {
*val++ = '\0';
}
member = conference_member_get_by_var(conference, var, val);
free(var);
} else {
member = conference_member_get(conference, atoi(id_str));
}
return member;
}
/* traverse the conference member list for the specified member with role and return it's pointer */ /* traverse the conference member list for the specified member with role and return it's pointer */
conference_member_t *conference_member_get_by_role(conference_obj_t *conference, const char *role_id) conference_member_t *conference_member_get_by_role(conference_obj_t *conference, const char *role_id)

View File

@ -1099,6 +1099,7 @@ void conference_member_set_score_iir(conference_member_t *member, uint32_t score
conference_relationship_t *conference_member_add_relationship(conference_member_t *member, uint32_t id); conference_relationship_t *conference_member_add_relationship(conference_member_t *member, uint32_t id);
conference_member_t *conference_member_get(conference_obj_t *conference, uint32_t id); conference_member_t *conference_member_get(conference_obj_t *conference, uint32_t id);
conference_member_t *conference_member_get_by_str(conference_obj_t *conference, const char *id_str);
conference_member_t *conference_member_get_by_var(conference_obj_t *conference, const char *var, const char *val); conference_member_t *conference_member_get_by_var(conference_obj_t *conference, const char *var, const char *val);
conference_member_t *conference_member_get_by_role(conference_obj_t *conference, const char *role_id); conference_member_t *conference_member_get_by_role(conference_obj_t *conference, const char *role_id);
switch_status_t conference_member_del_relationship(conference_member_t *member, uint32_t id); switch_status_t conference_member_del_relationship(conference_member_t *member, uint32_t id);