]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[mod_conference] Add APIs to set/get conference variables
authorJakub Karolczyk <jakub.karolczyk@signalwire.com>
Tue, 16 Nov 2021 00:37:27 +0000 (00:37 +0000)
committerAndrey Volk <andywolk@gmail.com>
Tue, 23 Nov 2021 17:22:43 +0000 (20:22 +0300)
src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_conference/mod_conference.h

index fd51d294cb6f9c8135ec835902ef5159c29d8691..bd24484928c4ab4f6a5f85f74821d88c4f4de19e 100644 (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;
index 71fd17532cac743fdde44118297145476456abe2..4ed7a595c300afe9785a21213e014b8349b2d6ba 100644 (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);
-       switch_mutex_unlock(conference->flag_mutex);
-
-       if (val) {
-               return switch_core_strdup(conference->pool, val);
+       if ((val = switch_event_get_header(conference->variables, var))) {
+               rval = switch_core_strdup(conference->pool, val);
        }
+       switch_mutex_unlock(conference->flag_mutex);
 
-       return NULL;
+       return rval;
 }
 
 /* create a new conferene with a specific profile */
index 2131df99c3b97929c4724114db9f00586f35b1c8..f6f932fc076577b7547f52e4c60db58961340fbf 100644 (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: