diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index fd51d294cb..bd24484928 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -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> "}, {"relate", (void_fn_t) & conference_api_sub_relate, CONF_API_SUB_ARGS_SPLIT, "relate", "[,] [,] [nospeak|nohear|clear]"}, + {"getvar", (void_fn_t) & conference_api_sub_getvar, CONF_API_SUB_ARGS_SPLIT, "getvar", ""}, + {"setvar", (void_fn_t) & conference_api_sub_setvar, CONF_API_SUB_ARGS_SPLIT, "setvar", " "}, {"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", "/ "}, @@ -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; diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 71fd17532c..4ed7a595c3 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -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 */ diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index 2131df99c3..f6f932fc07 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -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: