diff --git a/CHANGES b/CHANGES index 8fc2c6c99d..5cdcf8e46b 100644 --- a/CHANGES +++ b/CHANGES @@ -227,6 +227,8 @@ Queue changes * Added member option ignorebusy this when set and ringinuse is not will allow per member control of multiple calls as ringinuse does for the Queue. + * Added queue options autopausebusy and autopauseunavail for automatically + pausing a queue member when their device reports busy or congestion. Applications ------------ diff --git a/apps/app_queue.c b/apps/app_queue.c index 7930ca3010..f1bcb8b48d 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -1158,6 +1158,8 @@ struct call_queue { unsigned int realtime:1; unsigned int found:1; unsigned int relativeperiodicannounce:1; + unsigned int autopausebusy:1; + unsigned int autopauseunavail:1; enum empty_conditions joinempty; enum empty_conditions leavewhenempty; int announcepositionlimit; /*!< How many positions we announce? */ @@ -2040,6 +2042,10 @@ static void queue_set_param(struct call_queue *q, const char *param, const char q->autopause = autopause2int(val); } else if (!strcasecmp(param, "autopausedelay")) { q->autopausedelay = atoi(val); + } else if (!strcasecmp(param, "autopausebusy")) { + q->autopausebusy = ast_true(val); + } else if (!strcasecmp(param, "autopauseunavail")) { + q->autopauseunavail = ast_true(val); } else if (!strcasecmp(param, "maxlen")) { q->maxlen = atoi(val); if (q->maxlen < 0) @@ -3782,7 +3788,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte do_hang(o); endtime = (long) time(NULL); endtime -= starttime; - rna(endtime * 1000, qe, on, membername, 0); + rna(endtime * 1000, qe, on, membername, qe->parent->autopausebusy); if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) *to = orig; @@ -3800,7 +3806,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte ast_cdr_busy(in->cdr); endtime = (long) time(NULL); endtime -= starttime; - rna(endtime * 1000, qe, on, membername, 0); + rna(endtime * 1000, qe, on, membername, qe->parent->autopauseunavail); do_hang(o); if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample index 386e89518c..a74c25afcf 100644 --- a/configs/queues.conf.sample +++ b/configs/queues.conf.sample @@ -210,6 +210,16 @@ monitor-type = MixMonitor ; last call if a member has not taken a call the delay has no effect. ;autopausedelay=60 ; +; Autopausebusy controls whether or not a queue member is set as paused +; automatically upon the member device reporting busy. The autopausedelay +; option applies. Defaults to 'no'. +;autopausebusy=no +; +; Autopauseunavail controls whether or not a queue member is set as paused +; automatically upon the member device reporting congestion. The autopausedely +; option applies. Defaults to 'no'. +;autopauseunavail=no +; ; Maximum number of people waiting in the queue (0 for unlimited) ; ;maxlen = 0