diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c index 81556b820c2b2bc7a9932b7083829b23c57583b0..4190b9fd529ccb6019268f3e1857c87425edafd1 100644 --- a/apps/app_confbridge.c +++ b/apps/app_confbridge.c @@ -2224,9 +2224,31 @@ static char *handle_cli_confbridge_kick(struct ast_cli_entry *e, int cmd, struct return CLI_SUCCESS; } -static void handle_cli_confbridge_list_item(struct ast_cli_args *a, struct conference_bridge_user *participant) +static void handle_cli_confbridge_list_item(struct ast_cli_args *a, struct conference_bridge_user *participant, int waiting) { + char flag_str[5 + 1];/* Max flags + terminator */ + int pos = 0; + + /* Build flags column string. */ + if (ast_test_flag(&participant->u_profile, USER_OPT_ADMIN)) { + flag_str[pos++] = 'A'; + } + if (ast_test_flag(&participant->u_profile, USER_OPT_MARKEDUSER)) { + flag_str[pos++] = 'M'; + } + if (ast_test_flag(&participant->u_profile, USER_OPT_WAITMARKED)) { + flag_str[pos++] = 'W'; + } + if (ast_test_flag(&participant->u_profile, USER_OPT_ENDMARKED)) { + flag_str[pos++] = 'E'; + } + if (waiting) { + flag_str[pos++] = 'w'; + } + flag_str[pos] = '\0'; + ast_cli(a->fd, "%-29s ", ast_channel_name(participant->chan)); + ast_cli(a->fd, "%-5s ", flag_str); ast_cli(a->fd, "%-17s", participant->u_profile.name); ast_cli(a->fd, "%-17s", participant->b_profile.name); ast_cli(a->fd, "%-17s", participant->menu_name); @@ -2243,7 +2265,17 @@ static char *handle_cli_confbridge_list(struct ast_cli_entry *e, int cmd, struct e->command = "confbridge list"; e->usage = "Usage: confbridge list [<name>]\n" - " Lists all currently active conference bridges.\n"; + " Lists all currently active conference bridges or a specific conference bridge.\n" + "\n" + " When a conference bridge name is provided, flags may be shown for users. Below\n" + " are the flags and what they represent.\n" + "\n" + " Flags:\n" + " A - The user is an admin\n" + " M - The user is a marked user\n" + " W - The user must wait for a marked user to join\n" + " E - The user will be kicked after the last marked user leaves the conference\n" + " w - The user is waiting for a marked user to join\n"; return NULL; case CLI_GENERATE: if (a->pos == 2) { @@ -2276,14 +2308,14 @@ static char *handle_cli_confbridge_list(struct ast_cli_entry *e, int cmd, struct ast_cli(a->fd, "No conference bridge named '%s' found!\n", a->argv[2]); return CLI_SUCCESS; } - ast_cli(a->fd, "Channel User Profile Bridge Profile Menu CallerID\n"); - ast_cli(a->fd, "============================= ================ ================ ================ ================\n"); + ast_cli(a->fd, "Channel Flags User Profile Bridge Profile Menu CallerID\n"); + ast_cli(a->fd, "============================= ===== ================ ================ ================ ================\n"); ao2_lock(bridge); AST_LIST_TRAVERSE(&bridge->active_list, participant, list) { - handle_cli_confbridge_list_item(a, participant); + handle_cli_confbridge_list_item(a, participant, 0); } AST_LIST_TRAVERSE(&bridge->waiting_list, participant, list) { - handle_cli_confbridge_list_item(a, participant); + handle_cli_confbridge_list_item(a, participant, 1); } ao2_unlock(bridge); ao2_ref(bridge, -1); @@ -2582,7 +2614,7 @@ static struct ast_custom_function confbridge_info_function = { .read = func_confbridge_info, }; -static void action_confbridgelist_item(struct mansession *s, const char *id_text, struct conference_bridge *bridge, struct conference_bridge_user *participant) +static void action_confbridgelist_item(struct mansession *s, const char *id_text, struct conference_bridge *bridge, struct conference_bridge_user *participant, int waiting) { astman_append(s, "Event: ConfbridgeList\r\n" @@ -2593,6 +2625,9 @@ static void action_confbridgelist_item(struct mansession *s, const char *id_text "Channel: %s\r\n" "Admin: %s\r\n" "MarkedUser: %s\r\n" + "WaitMarked: %s\r\n" + "EndMarked: %s\r\n" + "Waiting: %s\r\n" "\r\n", id_text, bridge->name, @@ -2600,19 +2635,23 @@ static void action_confbridgelist_item(struct mansession *s, const char *id_text S_COR(ast_channel_caller(participant->chan)->id.name.valid, ast_channel_caller(participant->chan)->id.name.str, "<no name>"), ast_channel_name(participant->chan), ast_test_flag(&participant->u_profile, USER_OPT_ADMIN) ? "Yes" : "No", - ast_test_flag(&participant->u_profile, USER_OPT_MARKEDUSER) ? "Yes" : "No"); + ast_test_flag(&participant->u_profile, USER_OPT_MARKEDUSER) ? "Yes" : "No", + ast_test_flag(&participant->u_profile, USER_OPT_WAITMARKED) ? "Yes" : "No", + ast_test_flag(&participant->u_profile, USER_OPT_ENDMARKED) ? "Yes" : "No", + waiting ? "Yes" : "No"); } static int action_confbridgelist(struct mansession *s, const struct message *m) { const char *actionid = astman_get_header(m, "ActionID"); const char *conference = astman_get_header(m, "Conference"); - struct conference_bridge_user *participant = NULL; - struct conference_bridge *bridge = NULL; + struct conference_bridge_user *participant; + struct conference_bridge *bridge; struct conference_bridge tmp; - char id_text[80] = ""; + char id_text[80]; int total = 0; + id_text[0] = '\0'; if (!ast_strlen_zero(actionid)) { snprintf(id_text, sizeof(id_text), "ActionID: %s\r\n", actionid); } @@ -2636,11 +2675,11 @@ static int action_confbridgelist(struct mansession *s, const struct message *m) ao2_lock(bridge); AST_LIST_TRAVERSE(&bridge->active_list, participant, list) { total++; - action_confbridgelist_item(s, id_text, bridge, participant); + action_confbridgelist_item(s, id_text, bridge, participant, 0); } AST_LIST_TRAVERSE(&bridge->waiting_list, participant, list) { total++; - action_confbridgelist_item(s, id_text, bridge, participant); + action_confbridgelist_item(s, id_text, bridge, participant, 1); } ao2_unlock(bridge); ao2_ref(bridge, -1);