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
This commit is contained in:
parent
da5944fc56
commit
f1fb120f5d
1 changed files with 37 additions and 22 deletions
|
@ -1652,6 +1652,39 @@ static int update_status(struct call_queue *q, struct member *m, const int statu
|
||||||
return 0;
|
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*/
|
/*! \brief set a member's status based on device state of that member's interface*/
|
||||||
static int handle_statechange(void *datap)
|
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 */
|
/* check every member until we find one NOT_INUSE */
|
||||||
if (!avail && (m->status == AST_DEVICE_NOT_INUSE) && !m->paused) {
|
if (!avail) {
|
||||||
avail = 1;
|
avail = is_member_available(m);
|
||||||
}
|
}
|
||||||
if (avail && found_member) {
|
if (avail && found_member) {
|
||||||
/* early exit as we've found an available member and the member of interest */
|
/* 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);
|
mem_iter = ao2_iterator_init(q->members, 0);
|
||||||
while ((mem = ao2_iterator_next(&mem_iter))) {
|
while ((mem = ao2_iterator_next(&mem_iter))) {
|
||||||
switch (mem->status) {
|
|
||||||
case AST_DEVICE_INVALID:
|
avl += is_member_available(mem);
|
||||||
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;
|
|
||||||
}
|
|
||||||
ao2_ref(mem, -1);
|
ao2_ref(mem, -1);
|
||||||
|
|
||||||
/* If autofill is not enabled or if the queue's strategy is ringall, then
|
/* If autofill is not enabled or if the queue's strategy is ringall, then
|
||||||
|
|
Loading…
Reference in a new issue