* \retval 1 if the member is available
* \retval 0 if the member is not available
*/
-static int is_member_available(struct member *mem)
+static int is_member_available(struct call_queue *q, struct member *mem)
{
int available = 0;
break;
}
+ /* Let wrapuptimes override device state availability */
+ if (mem->lastcall && q->wrapuptime && (time(NULL) - q->wrapuptime < mem->lastcall)) {
+ available = 0;
+ }
return available;
}
/* check every member until we find one NOT_INUSE */
if (!avail) {
- avail = is_member_available(m);
+ avail = is_member_available(q, m);
}
if (avail && found_member) {
/* early exit as we've found an available member and the member of interest */
mem_iter = ao2_iterator_init(q->members, 0);
while ((mem = ao2_iterator_next(&mem_iter))) {
- avl += is_member_available(mem);
+ avl += is_member_available(q, mem);
ao2_ref(mem, -1);
/* If autofill is not enabled or if the queue's strategy is ringall, then
new_member->penalty, new_member->calls, (int) new_member->lastcall,
new_member->status, new_member->paused);
- if (is_member_available(new_member)) {
+ if (is_member_available(q, new_member)) {
ast_devstate_changed(AST_DEVICE_NOT_INUSE, AST_DEVSTATE_CACHABLE, "Queue:%s_avail", q->name);
}
dump_queue_members(q);
}
- if (is_member_available(mem)) {
+ if (is_member_available(q, mem)) {
ast_devstate_changed(AST_DEVICE_NOT_INUSE, AST_DEVSTATE_CACHABLE, "Queue:%s_avail", q->name);
} else if (!num_available_members(q)) {
ast_devstate_changed(AST_DEVICE_INUSE, AST_DEVSTATE_CACHABLE, "Queue:%s_avail", q->name);