From 0a5d21e6c7c92b70cf042bb08a6b497ec75c6f87 Mon Sep 17 00:00:00 2001 From: David Vossel Date: Wed, 23 Dec 2009 19:14:05 +0000 Subject: QUEUE_MEMBER(..., ready) counts only ready agents, not free agents wrapping up The QUEUE_MEMBER dialplan function can return total members, logged-in members and "free" members count. A member is counted as "free" immediately after his call ends, even though its wrap-up time, if specified in queues.conf, has not yet expired, and the queue will not actually route a call to it. This Patch introduces a new "ready" option that only counts free agents no longer in the wrap up time period. (closes issue #16240) Reported by: kkm Patches: appqueue-memberfun-readyoption-trunk.diff uploaded by kkm (license 888) Tested by: kkm, dvossel git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@236308 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_queue.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'apps/app_queue.c') diff --git a/apps/app_queue.c b/apps/app_queue.c index a36713630..29fc040db 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -437,7 +437,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") Returns the number of logged-in members for the specified queue. - Returns the number of logged-in members for the specified queue available to take a call. + Returns the number of logged-in members for the specified queue that either can take calls or are currently wrapping up after a previous call. + + + Returns the number of logged-in members for the specified queue that are immediately available to answer a call. Returns the total number of members for the specified queue. @@ -5793,8 +5796,8 @@ static int queue_function_var(struct ast_channel *chan, const char *cmd, char *d } /*! - * \brief Get number either busy / free or total members of a specific queue - * \retval number of members (busy / free / total) + * \brief Get number either busy / free / ready or total members of a specific queue + * \retval number of members (busy / free / ready / total) * \retval -1 on error */ static int queue_function_qac(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) @@ -5836,6 +5839,19 @@ static int queue_function_qac(struct ast_channel *chan, const char *cmd, char *d ao2_ref(m, -1); } ao2_iterator_destroy(&mem_iter); + } else if (!strcasecmp(option, "ready")) { + time_t now; + time(&now); + mem_iter = ao2_iterator_init(q->members, 0); + while ((m = ao2_iterator_next(&mem_iter))) { + /* Count the agents who are logged in, not paused and not wrapping up */ + if ((m->status == AST_DEVICE_NOT_INUSE) && (!m->paused) && + !(m->lastcall && q->wrapuptime && ((now - q->wrapuptime) < m->lastcall))) { + count++; + } + ao2_ref(m, -1); + } + ao2_iterator_destroy(&mem_iter); } else /* must be "count" */ count = q->membercount; ao2_unlock(q); -- cgit v1.2.3