summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2012-09-20 18:02:02 +0000
committerMatthew Jordan <mjordan@digium.com>2012-09-20 18:02:02 +0000
commitf1fb120f5d62933cac50dc47810418ebf535af7c (patch)
tree241d8f494abe7e12f9bf7d1b0e39fc7e4b0d6c22 /apps
parentda5944fc56482949ba04aad6ab33275b5031f75d (diff)
Support all ways a member can be available for 'agent available' hints
Alec's patch in r373188 added the ability to subscribe to a hint for when Queue members are available. This patch modifies the check that determines when a Queue member is available by refactoring the availability checks in num_available_members into a shared function is_member_available. This should now handle the ringinuse option, as well as device state values other than AST_DEVICE_NOT_INUSE. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@373222 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps')
-rw-r--r--apps/app_queue.c59
1 files changed, 37 insertions, 22 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 416a4aa06..69938e4f3 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -1652,6 +1652,39 @@ static int update_status(struct call_queue *q, struct member *m, const int statu
return 0;
}
+/*!
+ * \internal \brief Determine if a queue member is available
+ * \retval 1 if the member is available
+ * \retval 0 if the member is not available
+ */
+static int is_member_available(struct member *mem)
+{
+ int available = 0;
+
+ switch (mem->status) {
+ case AST_DEVICE_INVALID:
+ case AST_DEVICE_UNAVAILABLE:
+ break;
+ case AST_DEVICE_INUSE:
+ case AST_DEVICE_BUSY:
+ case AST_DEVICE_RINGING:
+ case AST_DEVICE_RINGINUSE:
+ case AST_DEVICE_ONHOLD:
+ if (!mem->ringinuse) {
+ break;
+ }
+ /* else fall through */
+ case AST_DEVICE_NOT_INUSE:
+ case AST_DEVICE_UNKNOWN:
+ if (!mem->paused) {
+ available = 1;
+ }
+ break;
+ }
+
+ return available;
+}
+
/*! \brief set a member's status based on device state of that member's interface*/
static int handle_statechange(void *datap)
{
@@ -1688,8 +1721,8 @@ static int handle_statechange(void *datap)
}
/* check every member until we find one NOT_INUSE */
- if (!avail && (m->status == AST_DEVICE_NOT_INUSE) && !m->paused) {
- avail = 1;
+ if (!avail) {
+ avail = is_member_available(m);
}
if (avail && found_member) {
/* early exit as we've found an available member and the member of interest */
@@ -3251,26 +3284,8 @@ static int num_available_members(struct call_queue *q)
mem_iter = ao2_iterator_init(q->members, 0);
while ((mem = ao2_iterator_next(&mem_iter))) {
- switch (mem->status) {
- case AST_DEVICE_INVALID:
- case AST_DEVICE_UNAVAILABLE:
- break;
- case AST_DEVICE_INUSE:
- case AST_DEVICE_BUSY:
- case AST_DEVICE_RINGING:
- case AST_DEVICE_RINGINUSE:
- case AST_DEVICE_ONHOLD:
- if (!mem->ringinuse) {
- break;
- }
- /* else fall through */
- case AST_DEVICE_NOT_INUSE:
- case AST_DEVICE_UNKNOWN:
- if (!mem->paused) {
- avl++;
- }
- break;
- }
+
+ avl += is_member_available(mem);
ao2_ref(mem, -1);
/* If autofill is not enabled or if the queue's strategy is ringall, then