Add timeoutrestart option (bug #3656)
authorMark Spencer <markster@digium.com>
Fri, 4 Mar 2005 00:59:58 +0000 (00:59 +0000)
committerMark Spencer <markster@digium.com>
Fri, 4 Mar 2005 00:59:58 +0000 (00:59 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5135 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c
configs/queues.conf.sample

index e3f2026..60c5b2a 100755 (executable)
@@ -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_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_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_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
    use it not only for keeping track of what is in use but
 
 /* We define a custom "local user" structure because we
    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_hangup(o->chan);
                                                        o->chan = NULL;
                                                                ast_cdr_busy(in->cdr);
                                                        ast_hangup(o->chan);
                                                        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++;
                                                        break;
                                                case AST_CONTROL_CONGESTION:
                                                        numbusies++;
                                                        break;
                                                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_hangup(o->chan);
                                                        o->chan = NULL;
                                                                ast_cdr_busy(in->cdr);
                                                        ast_hangup(o->chan);
                                                        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++;
                                                        break;
                                                case AST_CONTROL_RINGING:
                                                        numbusies++;
                                                        break;
                                                case AST_CONTROL_RINGING:
@@ -1203,8 +1210,11 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
                                        o->stillgoing = 0;
                                        ast_hangup(o->chan);
                                        o->chan = NULL;
                                        o->stillgoing = 0;
                                        ast_hangup(o->chan);
                                        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);
                                                if (q->weight)
                                                        use_weight++;
                                                q->weight = atoi(var->value);
                                                if (q->weight)
                                                        use_weight++;
+                                       } else if (!strcasecmp(var->name, "timeoutrestart")) {
+                                               ast_set2_flag(q, ast_true(var->value), QUEUE_FLAG_TIMEOUTRESTART);
                                        } else {
                                                ast_log(LOG_WARNING, "Unknown keyword in queue '%s': %s at line %d of queue.conf\n", cat, var->name, var->lineno);
                                        }
                                        } else {
                                                ast_log(LOG_WARNING, "Unknown keyword in queue '%s': %s at line %d of queue.conf\n", cat, var->name, var->lineno);
                                        }
index 0f0f37e..0c3447f 100755 (executable)
@@ -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
 ; the form technology/dialstring.  "member" means a normal member of a
 ; queue.  An optional penalty may be specified after a comma, such that
 ; Each member of this call queue is listed on a separate line in
 ; the form technology/dialstring.  "member" means a normal member of a
 ; queue.  An optional penalty may be specified after a comma, such that