]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
add option to avoid calling members whose channels are 'in use' (issue #6315, plus...
authorKevin P. Fleming <kpfleming@digium.com>
Wed, 15 Feb 2006 02:52:19 +0000 (02:52 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Wed, 15 Feb 2006 02:52:19 +0000 (02:52 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@10163 65c4cc65-6c06-0410-ace0-fbb531ad65f3

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

index 6692fe2fd454f9273350bafb64c34c2fcf1c4806..9d15486173035572d8f79386a03543fa6ea95bec 100644 (file)
@@ -326,6 +326,7 @@ struct ast_call_queue {
        unsigned int joinempty:2;
        unsigned int eventwhencalled:1;
        unsigned int leavewhenempty:2;
+       unsigned int ringinuse:1;
        unsigned int reportholdtime:1;
        unsigned int wrapped:1;
        unsigned int timeoutrestart:1;
@@ -575,6 +576,7 @@ static void init_queue(struct ast_call_queue *q)
        q->announceholdtime = 0;
        q->roundingseconds = 0; /* Default - don't announce seconds */
        q->servicelevel = 0;
+       q->ringinuse = 1;
        q->moh[0] = '\0';
        q->announce[0] = '\0';
        q->context[0] = '\0';
@@ -626,6 +628,8 @@ static void queue_set_param(struct ast_call_queue *q, const char *param, const c
                q->timeout = atoi(val);
                if (q->timeout < 0)
                        q->timeout = DEFAULT_TIMEOUT;
+       } else if (!strcasecmp(param, "ringinuse")) {
+               q->ringinuse = ast_true(val);
        } else if (!strcasecmp(param, "monitor-join")) {
                q->monjoin = ast_true(val);
        } else if (!strcasecmp(param, "monitor-format")) {
@@ -1378,7 +1382,16 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
                (*busies)++;
                return 0;
        }
-       
+
+       if (!qe->parent->ringinuse && (tmp->member->status == AST_DEVICE_INUSE)) {
+               if (option_debug)
+                       ast_log(LOG_DEBUG, "%s in use, can't receive call\n", tmp->interface);
+               if (qe->chan->cdr)
+                       ast_cdr_busy(qe->chan->cdr);
+               tmp->stillgoing = 0;
+               return 0;
+       }
+
        if (tmp->member->paused) {
                if (option_debug)
                        ast_log(LOG_DEBUG, "%s paused, can't receive call\n", tmp->interface);
index 119db98117d236e14b2c31fe626de6ab37de82c2..c2286997065a578bea896ce0ba7f4b064643cfab 100644 (file)
@@ -174,6 +174,12 @@ persistentmembers = yes
 ;
 ; reportholdtime = no
 ;
+; If you want the queue to avoid sending calls to members whose devices are
+; known to be 'in use' (via the channel driver supporting that device state)
+; uncomment this option. (Note: only the SIP channel driver currently is able
+; to report 'in use'.)
+;
+; ringinuse = no
 ;
 ; If you wish to have a delay before the member is connected to the caller (or
 ; before the member hears any announcement messages), set this to the number of