Index: apps/app_queue.c =================================================================== --- apps/app_queue.c (revision 120565) +++ apps/app_queue.c (working copy) @@ -4828,6 +4828,107 @@ return NULL; } +static int handle_queue_pause_member(int fd, int argc, char *argv[]) +{ + char *queuename = NULL; + char *membername = NULL; + + if ((argc != 4) && (argc != 6)) { + return RESULT_SHOWUSAGE; + } else if (argc == 6 && strcmp(argv[4], "in")) { + return RESULT_SHOWUSAGE; + } + + if (argc == 6) { + queuename = argv[5]; + } + membername = argv[3]; + + if (!set_member_paused(queuename, membername, 1)) { + if (ast_strlen_zero(queuename)) + ast_cli(fd, "Pausing Queue Member %s in all queues.\n", membername); + else + ast_cli(fd, "Pausing Queue Member %s in queue %s.\n", membername, queuename); + return RESULT_SUCCESS; + } else { + if (ast_strlen_zero(queuename)) + ast_cli(fd, "Failed to pause Queue Member %s in all queues!\n", membername); + else + ast_cli(fd, "Failed to pause Queue Member %s in queue %s!\n", membername, queuename); + return RESULT_FAILURE; + } +} + +static int handle_queue_unpause_member(int fd, int argc, char *argv[]) +{ + char *queuename = NULL; + char *membername = NULL; + + if ((argc != 4) && (argc != 6)) { + return RESULT_SHOWUSAGE; + } else if (argc == 6 && strcmp(argv[4], "in")) { + return RESULT_SHOWUSAGE; + } + + if (argc == 6) { + queuename = argv[5]; + } + membername = argv[3]; + + if (!set_member_paused(queuename, membername, 0)) { + if (ast_strlen_zero(queuename)) + ast_cli(fd, "UnPausing Queue Member %s in all queues.\n", membername); + else + ast_cli(fd, "UnPausing Queue Member %s in queue %s.\n", membername, queuename); + return RESULT_SUCCESS; + } else { + if (ast_strlen_zero(queuename)) + ast_cli(fd, "Failed to unpause Queue Member %s in all queues!\n", membername); + else + ast_cli(fd, "Failed to unpause Queue Member %s in queue %s!\n", membername, queuename); + return RESULT_FAILURE; + } +} + + +static char *complete_queue_pause_unpause_member(const char *line, const char *word, int pos, int state) +{ + int which = 0; + struct call_queue *q; + struct member *m; + struct ao2_iterator mem_iter; + + /* 0 - queue; 1 - pause/unpause; 2 - member; 3 - ; 4 - in; 5 - */ + if (pos > 5 || pos < 3) + return NULL; + if (pos == 4) /* only one possible match, 'in' */ + return state == 0 ? ast_strdup("in") : NULL; + + if (pos == 5) /* No need to duplicate code */ + return complete_queue(line, word, pos, state); + + /* here is the case for 3, */ + if (!AST_LIST_EMPTY(&queues)) { /* XXX unnecessary ? the traverse does that for us */ + AST_LIST_TRAVERSE(&queues, q, list) { + ast_mutex_lock(&q->lock); + mem_iter = ao2_iterator_init(q->members, 0); + while ((m = ao2_iterator_next(&mem_iter))) { + if (++which > state) { + char *tmp; + ast_mutex_unlock(&q->lock); + tmp = m->membername; + ao2_ref(m, -1); + return ast_strdup(tmp); + } + ao2_ref(m, -1); + } + ast_mutex_unlock(&q->lock); + } + } + + return NULL; +} + static char queue_show_usage[] = "Usage: queue show\n" " Provides summary information on a specified queue.\n"; @@ -4838,6 +4939,12 @@ static char qrm_cmd_usage[] = "Usage: queue remove member from \n"; +static char qpm_cmd_usage[] = +"Usage: queue pause member [in ]\n"; + +static char qupm_cmd_usage[] = +"Usage: queue unpause member [in ]\n"; + static struct ast_cli_entry cli_show_queue_deprecated = { { "show", "queue", NULL }, queue_show, NULL, @@ -4870,6 +4977,15 @@ { { "queue", "remove", "member", NULL }, handle_queue_remove_member, "Removes a channel from a specified queue", qrm_cmd_usage, complete_queue_remove_member, &cli_remove_queue_member_deprecated }, + + { { "queue", "pause", "member", NULL }, + handle_queue_pause_member, "Pause member in a specified queue", + qpm_cmd_usage, complete_queue_pause_unpause_member, NULL }, + + { { "queue", "unpause", "member", NULL }, + handle_queue_unpause_member, "UnPause member in a specified queue", + qupm_cmd_usage, complete_queue_pause_unpause_member, NULL }, + }; static int unload_module(void)