Try immediately logged in agents first, then callbacklogin ones
[asterisk/asterisk.git] / channels / chan_agent.c
index ed644de..466181c 100755 (executable)
@@ -237,6 +237,7 @@ static struct ast_frame  *agent_read(struct ast_channel *ast)
                        if (strlen(p->loginchan))
                                ast_hangup(p->chan);
                        p->chan = NULL;
+                       p->acknowledged = 0;
                }
        }
        if (f && (f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_ANSWER)) {
@@ -585,7 +586,7 @@ static int read_agent_config(void)
        group = 0;
        autologoff = 0;
        wrapuptime = 0;
-       ackcall = 0;
+       ackcall = 1;
        cfg = ast_load(config);
        if (!cfg) {
                ast_log(LOG_NOTICE, "No agent configuration found -- agent support disabled\n");
@@ -725,12 +726,14 @@ static struct ast_channel *agent_request(char *type, int format, void *data)
        } else {
                groupmatch = 0;
        }
+
+       /* Check actual logged in agents first */
        ast_pthread_mutex_lock(&agentlock);
        p = agents;
        while(p) {
                ast_pthread_mutex_lock(&p->lock);
                if (!p->pending && ((groupmatch && (p->group & groupmatch)) || !strcmp(data, p->agent)) &&
-                               !p->lastdisc.tv_sec) {
+                               !p->lastdisc.tv_sec && !strlen(p->loginchan)) {
                        /* Agent must be registered, but not have any active call, and not be in a waiting state */
                        if (!p->owner && p->chan) {
                                /* Fixed agent */
@@ -749,6 +752,32 @@ static struct ast_channel *agent_request(char *type, int format, void *data)
                ast_pthread_mutex_unlock(&p->lock);
                p = p->next;
        }
+       if (!p) {
+               p = agents;
+               while(p) {
+                       ast_pthread_mutex_lock(&p->lock);
+                       if (!p->pending && ((groupmatch && (p->group & groupmatch)) || !strcmp(data, p->agent)) &&
+                                       !p->lastdisc.tv_sec) {
+                               /* Agent must be registered, but not have any active call, and not be in a waiting state */
+                               if (!p->owner && p->chan) {
+                                       /* Fixed agent */
+                                       chan = agent_new(p, AST_STATE_DOWN);
+                               } else if (!p->owner && strlen(p->loginchan)) {
+                                       /* Adjustable agent */
+                                       p->chan = ast_request("Local", format, p->loginchan);
+                                       if (p->chan)
+                                               chan = agent_new(p, AST_STATE_DOWN);
+                               }
+                               if (chan) {
+                                       ast_pthread_mutex_unlock(&p->lock);
+                                       break;
+                               }
+                       }
+                       ast_pthread_mutex_unlock(&p->lock);
+                       p = p->next;
+               }
+       }
+
        if (!chan && waitforagent) {
                /* No agent available -- but we're requesting to wait for one.
                   Allocate a place holder */