mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-14 16:15:04 +00:00
FS-9736 #resolve add conference json_list
This commit is contained in:
parent
d2ea7dcc5e
commit
49d730e7f9
@ -45,6 +45,7 @@
|
||||
api_command_t conference_api_sub_commands[] = {
|
||||
{"list", (void_fn_t) & conference_api_sub_list, CONF_API_SUB_ARGS_SPLIT, "list", "[delim <string>]|[count]"},
|
||||
{"xml_list", (void_fn_t) & conference_api_sub_xml_list, CONF_API_SUB_ARGS_SPLIT, "xml_list", ""},
|
||||
{"json_list", (void_fn_t) & conference_api_sub_json_list, CONF_API_SUB_ARGS_SPLIT, "json_list", "[compact]"},
|
||||
{"energy", (void_fn_t) & conference_api_sub_energy, CONF_API_SUB_MEMBER_TARGET, "energy", "<member_id|all|last|non_moderator> [<newval>]"},
|
||||
{"vid-canvas", (void_fn_t) & conference_api_sub_canvas, CONF_API_SUB_MEMBER_TARGET, "vid-canvas", "<member_id|all|last|non_moderator> [<newval>]"},
|
||||
{"vid-watching-canvas", (void_fn_t) & conference_api_sub_watching_canvas, CONF_API_SUB_MEMBER_TARGET, "vid-watching-canvas", "<member_id|all|last|non_moderator> [<newval>]"},
|
||||
@ -214,6 +215,8 @@ switch_status_t conference_api_main_real(const char *cmd, switch_core_session_t
|
||||
conference_api_sub_list(NULL, stream, argc, argv);
|
||||
} else if (strcasecmp(argv[0], "xml_list") == 0) {
|
||||
conference_api_sub_xml_list(NULL, stream, argc, argv);
|
||||
} else if (strcasecmp(argv[0], "json_list") == 0) {
|
||||
conference_api_sub_json_list(NULL, stream, argc, argv);
|
||||
} else if (strcasecmp(argv[0], "help") == 0 || strcasecmp(argv[0], "commands") == 0) {
|
||||
stream->write_function(stream, "%s\n", api_syntax);
|
||||
} else if (argv[1] && strcasecmp(argv[1], "dial") == 0) {
|
||||
@ -2878,8 +2881,37 @@ switch_status_t conference_api_sub_xml_list(conference_obj_t *conference, switch
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_status_t conference_api_sub_json_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
|
||||
{
|
||||
switch_hash_index_t *hi;
|
||||
void *val;
|
||||
char *ebuf;
|
||||
cJSON *conferences = cJSON_CreateArray();
|
||||
switch_bool_t compact = SWITCH_FALSE;
|
||||
|
||||
switch_assert(conferences);
|
||||
|
||||
if (conference == NULL) {
|
||||
switch_mutex_lock(conference_globals.hash_mutex);
|
||||
for (hi = switch_core_hash_first(conference_globals.conference_hash); hi; hi = switch_core_hash_next(&hi)) {
|
||||
switch_core_hash_this(hi, NULL, NULL, &val);
|
||||
conference = (conference_obj_t *) val;
|
||||
conference_jlist(conference, conferences);
|
||||
}
|
||||
switch_mutex_unlock(conference_globals.hash_mutex);
|
||||
compact = (argc == 2 && !strcmp(argv[1], "compact"));
|
||||
} else {
|
||||
conference_jlist(conference, conferences);
|
||||
compact = (argc == 3 && !strcmp(argv[2], "compact"));
|
||||
}
|
||||
|
||||
ebuf = compact ? cJSON_PrintUnformatted(conferences) : cJSON_Print(conferences);
|
||||
switch_assert(ebuf);
|
||||
stream->write_function(stream, "%s", ebuf);
|
||||
free(ebuf);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_status_t conference_api_dispatch(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv, const char *cmdline, int argn)
|
||||
{
|
||||
|
@ -1333,6 +1333,104 @@ void conference_xlist(conference_obj_t *conference, switch_xml_t x_conference, i
|
||||
switch_mutex_unlock(conference->member_mutex);
|
||||
}
|
||||
|
||||
void conference_jlist(conference_obj_t *conference, cJSON *json_conferences)
|
||||
{
|
||||
conference_member_t *member = NULL;
|
||||
static cJSON *json_conference, *json_conference_members, *json_conference_member, *json_conference_member_flags;
|
||||
|
||||
switch_assert(conference != NULL);
|
||||
json_conference = cJSON_CreateObject();
|
||||
switch_assert(json_conference);
|
||||
|
||||
cJSON_AddItemToObject(json_conferences, "conference", json_conference);
|
||||
cJSON_AddStringToObject(json_conference, "conference_name", conference->name);
|
||||
cJSON_AddNumberToObject(json_conference,"member_count", conference->count);
|
||||
cJSON_AddNumberToObject(json_conference,"ghost_count", conference->count_ghosts);
|
||||
cJSON_AddNumberToObject(json_conference,"rate", conference->rate);
|
||||
cJSON_AddNumberToObject(json_conference,"run_time", switch_epoch_time_now(NULL) - conference->run_time);
|
||||
cJSON_AddStringToObject(json_conference, "conference_uuid", conference->uuid_str);
|
||||
cJSON_AddNumberToObject(json_conference, "canvas_count", conference->canvas_count);
|
||||
cJSON_AddNumberToObject(json_conference, "max_bw_in", conference->max_bw_in);
|
||||
cJSON_AddNumberToObject(json_conference, "force_bw_in", conference->force_bw_in);
|
||||
cJSON_AddNumberToObject(json_conference, "video_floor_packets", conference->video_floor_packets);
|
||||
|
||||
#define ADDBOOL(obj, name, b) cJSON_AddItemToObject(obj, name, (b) ? cJSON_CreateTrue() : cJSON_CreateFalse())
|
||||
|
||||
ADDBOOL(json_conference, "locked", conference_utils_test_flag(conference, CFLAG_LOCKED));
|
||||
ADDBOOL(json_conference, "destruct", conference_utils_test_flag(conference, CFLAG_DESTRUCT));
|
||||
ADDBOOL(json_conference, "wait_mod", conference_utils_test_flag(conference, CFLAG_WAIT_MOD));
|
||||
ADDBOOL(json_conference, "audio_always", conference_utils_test_flag(conference, CFLAG_AUDIO_ALWAYS));
|
||||
ADDBOOL(json_conference, "running", conference_utils_test_flag(conference, CFLAG_RUNNING));
|
||||
ADDBOOL(json_conference, "answered", conference_utils_test_flag(conference, CFLAG_ANSWERED));
|
||||
ADDBOOL(json_conference, "enforce_min", conference_utils_test_flag(conference, CFLAG_ENFORCE_MIN));
|
||||
ADDBOOL(json_conference, "bridge_to", conference_utils_test_flag(conference, CFLAG_BRIDGE_TO));
|
||||
ADDBOOL(json_conference, "dynamic", conference_utils_test_flag(conference, CFLAG_DYNAMIC));
|
||||
ADDBOOL(json_conference, "exit_sound", conference_utils_test_flag(conference, CFLAG_EXIT_SOUND));
|
||||
ADDBOOL(json_conference, "enter_sound", conference_utils_test_flag(conference, CFLAG_ENTER_SOUND));
|
||||
ADDBOOL(json_conference, "recording", conference->record_count > 0);
|
||||
ADDBOOL(json_conference, "video_bridge", conference_utils_test_flag(conference, CFLAG_VIDEO_BRIDGE_FIRST_TWO));
|
||||
ADDBOOL(json_conference, "video_floor_only", conference_utils_test_flag(conference, CFLAG_VID_FLOOR));
|
||||
ADDBOOL(json_conference, "video_rfc4579", conference_utils_test_flag(conference, CFLAG_RFC4579));
|
||||
|
||||
if (conference->max_members > 0) {
|
||||
cJSON_AddNumberToObject(json_conference, "max_members", conference->max_members);
|
||||
}
|
||||
|
||||
if (conference->agc_level) {
|
||||
cJSON_AddNumberToObject(json_conference, "agc", conference->agc_level);
|
||||
}
|
||||
|
||||
cJSON_AddItemToObject(json_conference, "members", json_conference_members = cJSON_CreateArray());
|
||||
switch_mutex_lock(conference->member_mutex);
|
||||
for (member = conference->members; member; member = member->next) {
|
||||
switch_channel_t *channel;
|
||||
switch_caller_profile_t *profile;
|
||||
char *uuid;
|
||||
cJSON_AddItemToObject(json_conference_members, "member", json_conference_member = cJSON_CreateObject());
|
||||
|
||||
if (conference_utils_member_test_flag(member, MFLAG_NOCHANNEL)) {
|
||||
if (member->rec_path) {
|
||||
cJSON_AddStringToObject(json_conference_member, "type", "recording_node");
|
||||
cJSON_AddStringToObject(json_conference_member, "record_path", member->rec_path);
|
||||
if (conference_utils_member_test_flag(member, MFLAG_PAUSE_RECORDING)) {
|
||||
cJSON_AddStringToObject(json_conference_member, "status", "paused");
|
||||
}
|
||||
cJSON_AddNumberToObject(json_conference_member, "join_time", member->rec_time);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
uuid = switch_core_session_get_uuid(member->session);
|
||||
channel = switch_core_session_get_channel(member->session);
|
||||
profile = switch_channel_get_caller_profile(channel);
|
||||
|
||||
cJSON_AddStringToObject(json_conference_member, "type", "caller");
|
||||
cJSON_AddNumberToObject(json_conference_member, "id", member->id);
|
||||
cJSON_AddItemToObject(json_conference_member, "flags", json_conference_member_flags = cJSON_CreateObject());
|
||||
cJSON_AddStringToObject(json_conference_member, "uuid", uuid);
|
||||
cJSON_AddStringToObject(json_conference_member, "caller_id_name", profile->caller_id_name);
|
||||
cJSON_AddStringToObject(json_conference_member,"caller_id_number", profile->caller_id_number);
|
||||
cJSON_AddNumberToObject(json_conference_member, "join_time", switch_epoch_time_now(NULL) - member->join_time);
|
||||
cJSON_AddNumberToObject(json_conference_member, "last_talking", member->last_talking ? switch_epoch_time_now(NULL) - member->last_talking : 0);
|
||||
cJSON_AddNumberToObject(json_conference_member, "energy", member->energy_level);
|
||||
cJSON_AddNumberToObject(json_conference_member, "volume_in", member->volume_in_level);
|
||||
cJSON_AddNumberToObject(json_conference_member, "volume_out", member->volume_out_level);
|
||||
cJSON_AddNumberToObject(json_conference_member, "output-volume", member->volume_out_level);
|
||||
cJSON_AddNumberToObject(json_conference_member, "input-volume", member->agc_volume_in_level ? member->agc_volume_in_level : member->volume_in_level);
|
||||
cJSON_AddNumberToObject(json_conference_member, "auto-adjusted-input-volume", member->agc_volume_in_level);
|
||||
ADDBOOL(json_conference_member_flags, "can_hear", conference_utils_member_test_flag(member, MFLAG_CAN_HEAR));
|
||||
ADDBOOL(json_conference_member_flags, "can_speak", conference_utils_member_test_flag(member, MFLAG_CAN_SPEAK));
|
||||
ADDBOOL(json_conference_member_flags, "mute_detect", conference_utils_member_test_flag(member, MFLAG_MUTE_DETECT));
|
||||
ADDBOOL(json_conference_member_flags, "talking", conference_utils_member_test_flag(member, MFLAG_TALKING));
|
||||
ADDBOOL(json_conference_member_flags, "has_video", switch_channel_test_flag(switch_core_session_get_channel(member->session), CF_VIDEO));
|
||||
ADDBOOL(json_conference_member_flags, "video_bridge", conference_utils_member_test_flag(member, MFLAG_VIDEO_BRIDGE));
|
||||
ADDBOOL(json_conference_member_flags, "has_floor", member == member->conference->floor_holder);
|
||||
ADDBOOL(json_conference_member_flags, "is_moderator", conference_utils_member_test_flag(member, MFLAG_MOD));
|
||||
ADDBOOL(json_conference_member_flags, "end_conference", conference_utils_member_test_flag(member, MFLAG_ENDCONF));
|
||||
}
|
||||
switch_mutex_unlock(conference->member_mutex);
|
||||
}
|
||||
|
||||
void conference_fnode_toggle_pause(conference_file_node_t *fnode, switch_stream_handle_t *stream)
|
||||
{
|
||||
if (fnode) {
|
||||
|
@ -950,6 +950,7 @@ void conference_list_pretty(conference_obj_t *conference, switch_stream_handle_t
|
||||
switch_status_t conference_record_stop(conference_obj_t *conference, switch_stream_handle_t *stream, char *path);
|
||||
switch_status_t conference_record_action(conference_obj_t *conference, char *path, recording_action_type_t action);
|
||||
void conference_xlist(conference_obj_t *conference, switch_xml_t x_conference, int off);
|
||||
void conference_jlist(conference_obj_t *conference, cJSON *json_conferences);
|
||||
void conference_event_send_json(conference_obj_t *conference);
|
||||
void conference_event_send_rfc(conference_obj_t *conference);
|
||||
void conference_member_update_status_field(conference_member_t *member);
|
||||
@ -1122,6 +1123,7 @@ switch_status_t conference_api_sub_recording(conference_obj_t *conference, switc
|
||||
switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
|
||||
switch_status_t conference_api_sub_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
|
||||
switch_status_t conference_api_sub_xml_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
|
||||
switch_status_t conference_api_sub_json_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
|
||||
switch_status_t conference_api_sub_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_watching_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
switch_status_t conference_api_sub_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data);
|
||||
|
Loading…
x
Reference in New Issue
Block a user