[mod_conference] Add APIs to set/get conference variables

This commit is contained in:
Jakub Karolczyk 2021-11-16 00:37:27 +00:00 committed by Andrey Volk
parent 4fbca5c782
commit 4c781e2b5f
3 changed files with 42 additions and 10 deletions

View File

@ -89,6 +89,8 @@ api_command_t conference_api_sub_commands[] = {
{"undeaf", (void_fn_t) & conference_api_sub_undeaf, CONF_API_SUB_MEMBER_TARGET, "undeaf", "<[member_id|all]|last|non_moderator>"},
{"vid-filter", (void_fn_t) & conference_api_sub_video_filter, CONF_API_SUB_MEMBER_TARGET, "vid-filter", "<[member_id|all]|last|non_moderator> <string>"},
{"relate", (void_fn_t) & conference_api_sub_relate, CONF_API_SUB_ARGS_SPLIT, "relate", "<member_id>[,<member_id>] <other_member_id>[,<other_member_id>] [nospeak|nohear|clear]"},
{"getvar", (void_fn_t) & conference_api_sub_getvar, CONF_API_SUB_ARGS_SPLIT, "getvar", "<varname>"},
{"setvar", (void_fn_t) & conference_api_sub_setvar, CONF_API_SUB_ARGS_SPLIT, "setvar", "<varname> <value>"},
{"lock", (void_fn_t) & conference_api_sub_lock, CONF_API_SUB_ARGS_SPLIT, "lock", ""},
{"unlock", (void_fn_t) & conference_api_sub_unlock, CONF_API_SUB_ARGS_SPLIT, "unlock", ""},
{"dial", (void_fn_t) & conference_api_sub_dial, CONF_API_SUB_ARGS_SPLIT, "dial", "<endpoint_module_name>/<destination> <callerid number> <callerid name>"},
@ -3433,6 +3435,30 @@ switch_status_t conference_api_sub_relate(conference_obj_t *conference, switch_s
return SWITCH_STATUS_SUCCESS;
}
switch_status_t conference_api_sub_getvar(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
{
const char *val = NULL;
const char *var = argv[2];
if (var) val = conference_get_variable(conference, var);
stream_write(stream, "%s", switch_str_nil(val));
return SWITCH_STATUS_SUCCESS;
}
switch_status_t conference_api_sub_setvar(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
{
const char *val = argv[3];
const char *var = argv[2];
if (var) conference_set_variable(conference, var, val);
stream_write(stream, "+OK\n", VA_NONE);
return SWITCH_STATUS_SUCCESS;
}
switch_status_t conference_api_sub_lock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
{
switch_event_t *event;

View File

@ -2656,24 +2656,28 @@ conference_obj_t *conference_find(char *name, char *domain)
void conference_set_variable(conference_obj_t *conference, const char *var, const char *val)
{
switch_assert(var);
switch_mutex_lock(conference->flag_mutex);
switch_event_add_header_string(conference->variables, SWITCH_STACK_BOTTOM, var, val);
if (!val) {
switch_event_del_header(conference->variables, var);
} else {
switch_event_add_header_string(conference->variables, SWITCH_STACK_BOTTOM, var, val);
}
switch_mutex_unlock(conference->flag_mutex);
}
const char *conference_get_variable(conference_obj_t *conference, const char *var)
{
const char *val;
const char *val = NULL, *rval = NULL;
switch_mutex_lock(conference->flag_mutex);
val = switch_event_get_header(conference->variables, var);
if ((val = switch_event_get_header(conference->variables, var))) {
rval = switch_core_strdup(conference->pool, val);
}
switch_mutex_unlock(conference->flag_mutex);
if (val) {
return switch_core_strdup(conference->pool, val);
}
return NULL;
return rval;
}
/* create a new conferene with a specific profile */

View File

@ -1218,6 +1218,8 @@ switch_status_t conference_api_sub_hold(conference_member_t *member, switch_stre
switch_status_t conference_api_sub_unhold(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_pauserec(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_volume_out(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_getvar(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_setvar(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_lock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_unlock(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_relate(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
@ -1311,8 +1313,8 @@ const char *conference_get_variable(conference_obj_t *conference, const char *va
/* Entries in this list should be kept in sync with the enum above */
extern api_command_t conference_api_sub_commands[];
extern struct _mapping control_mappings[];
#define stream_write(__stream, __fmt, ...) if (__stream)__stream->write_function(__stream, __fmt, __VA_ARGS__)
#define VA_NONE "%s", ""
#endif /* MOD_CONFERENCE_H */
/* For Emacs: