diff --git a/CHANGES b/CHANGES index 066275c0a94ac099f19b450885a19fd8cc2cbc83..edec34511e22d4b1f292dc1b22048710b7fedb9f 100755 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,4 @@ + -- Add ability to purge callers from queue if no agents are logged in -- Fix inband PRI indication detection -- Fix for MGCP - always request digits if no RTP stream -- Fixed seg fault for ast_control_streamfile diff --git a/apps/app_queue.c b/apps/app_queue.c index 542ede24635158ce97876d04eca239bfa17fa7eb..aa54749b558c27d4cd8119a04634be9e0b26d5a2 100755 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -226,6 +226,7 @@ struct ast_call_queue { int wrapped; /* Round Robin - wrapped around? */ int joinempty; /* Do we care if the queue has no members? */ int eventwhencalled; /* Generate an event when the agent is called (before pickup) */ + int leavewhenempty; /* If all agents leave the queue, remove callers from the queue */ struct member *members; /* Member channels to be tried */ struct queue_ent *head; /* Start of the actual queue */ @@ -912,6 +913,12 @@ static int wait_our_turn(struct queue_ent *qe, int ringing) break; } + /* leave the queue if no agents, if enabled */ + if (!(qe->parent->members) && qe->parent->leavewhenempty) { + leave_queue(qe); + break; + } + /* Make a position announcement, if enabled */ if (qe->parent->announcefrequency && !ringing) say_position(qe); @@ -1626,7 +1633,7 @@ check_turns: /* This is the wait loop for the head caller*/ /* To exit, they may get their call answered; */ /* they may dial a digit from the queue context; */ - /* or, they may may timeout. */ + /* or, they may timeout. */ /* Leave if we have exceeded our queuetimeout */ if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) { @@ -1634,6 +1641,12 @@ check_turns: break; } + /* leave the queue if no agents, if enabled */ + if (!((qe.parent)->members) && (qe.parent)->leavewhenempty) { + leave_queue(&qe); + break; + } + /* Make a position announcement, if enabled */ if (qe.parent->announcefrequency && !ringing) say_position(&qe); @@ -1872,6 +1885,8 @@ static void reload_queues(void) } } else if (!strcasecmp(var->name, "joinempty")) { q->joinempty = ast_true(var->value); + } else if (!strcasecmp(var->name, "leavewhenempty")) { + q->leavewhenempty = ast_true(var->value); } else if (!strcasecmp(var->name, "eventwhencalled")) { q->eventwhencalled = ast_true(var->value); } else { diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample index 7ba488ad38d975c7e61fff32080304d0ee0c714d..32e2c7fd18041811f31c1092d2d9043a0d433dfc 100755 --- a/configs/queues.conf.sample +++ b/configs/queues.conf.sample @@ -113,6 +113,10 @@ ; ; joinempty = yes ; +; If you wish to remove callers from the queue if there are no agents present, set this to yes +; +; leavewhenempty = yes +; ; Asterisk can generate AgentCalled events when an agent is rung, if this is turned on ; (may generate a LOT of extra manager events) ;