Add timeoutrestart option (bug #3656)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5135 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2005-03-04 00:59:58 +00:00
parent d0d47362e3
commit c564c601bd
2 changed files with 21 additions and 3 deletions

View File

@@ -196,6 +196,7 @@ static int use_weight = 0;
#define QUEUE_FLAG_LEAVEWHENEMPTY (1 << 11) /* If all agents leave the queue, remove callers from the queue */ #define QUEUE_FLAG_LEAVEWHENEMPTY (1 << 11) /* If all agents leave the queue, remove callers from the queue */
#define QUEUE_FLAG_REPORTHOLDTIME (1 << 12) /* Should we report caller hold time to answering member? */ #define QUEUE_FLAG_REPORTHOLDTIME (1 << 12) /* Should we report caller hold time to answering member? */
#define QUEUE_FLAG_WRAPPED (1 << 13) /* Round Robin - wrapped around? */ #define QUEUE_FLAG_WRAPPED (1 << 13) /* Round Robin - wrapped around? */
#define QUEUE_FLAG_TIMEOUTRESTART (1 << 14) /* Restart timer when member call */
/* We define a custom "local user" structure because we /* We define a custom "local user" structure because we
use it not only for keeping track of what is in use but use it not only for keeping track of what is in use but
@@ -1165,8 +1166,11 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
ast_cdr_busy(in->cdr); ast_cdr_busy(in->cdr);
ast_hangup(o->chan); ast_hangup(o->chan);
o->chan = NULL; o->chan = NULL;
if (qe->parent->strategy) if (qe->parent->strategy) {
if (ast_test_flag(qe->parent, QUEUE_FLAG_TIMEOUTRESTART))
*to = orig;
ring_one(qe, outgoing, &numbusies); ring_one(qe, outgoing, &numbusies);
}
numbusies++; numbusies++;
break; break;
case AST_CONTROL_CONGESTION: case AST_CONTROL_CONGESTION:
@@ -1177,8 +1181,11 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
ast_cdr_busy(in->cdr); ast_cdr_busy(in->cdr);
ast_hangup(o->chan); ast_hangup(o->chan);
o->chan = NULL; o->chan = NULL;
if (qe->parent->strategy) if (qe->parent->strategy) {
if (ast_test_flag(qe->parent, QUEUE_FLAG_TIMEOUTRESTART))
*to = orig;
ring_one(qe, outgoing, &numbusies); ring_one(qe, outgoing, &numbusies);
}
numbusies++; numbusies++;
break; break;
case AST_CONTROL_RINGING: case AST_CONTROL_RINGING:
@@ -1203,8 +1210,11 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
o->stillgoing = 0; o->stillgoing = 0;
ast_hangup(o->chan); ast_hangup(o->chan);
o->chan = NULL; o->chan = NULL;
if (qe->parent->strategy) if (qe->parent->strategy) {
if (ast_test_flag(qe->parent, QUEUE_FLAG_TIMEOUTRESTART))
*to = orig;
ring_one(qe, outgoing, &numbusies); ring_one(qe, outgoing, &numbusies);
}
} }
} }
o = o->next; o = o->next;
@@ -2598,6 +2608,8 @@ static void reload_queues(void)
q->weight = atoi(var->value); q->weight = atoi(var->value);
if (q->weight) if (q->weight)
use_weight++; use_weight++;
} else if (!strcasecmp(var->name, "timeoutrestart")) {
ast_set2_flag(q, ast_true(var->value), QUEUE_FLAG_TIMEOUTRESTART);
} else { } else {
ast_log(LOG_WARNING, "Unknown keyword in queue '%s': %s at line %d of queue.conf\n", cat, var->name, var->lineno); ast_log(LOG_WARNING, "Unknown keyword in queue '%s': %s at line %d of queue.conf\n", cat, var->name, var->lineno);
} }

View File

@@ -146,6 +146,12 @@ persistentmembers = yes
; ;
; memberdelay = 0 ; memberdelay = 0
; ;
; If timeoutrestart is set to yes, then the timeout for an agent to answer is
; reset if a BUSY or CONGESTION is received. This can be useful if agents
; are able to cancel a call with reject or similar.
;
; timeoutrestart = no
;
; Each member of this call queue is listed on a separate line in ; Each member of this call queue is listed on a separate line in
; the form technology/dialstring. "member" means a normal member of a ; the form technology/dialstring. "member" means a normal member of a
; queue. An optional penalty may be specified after a comma, such that ; queue. An optional penalty may be specified after a comma, such that