diff options
author | Mark Spencer <markster@digium.com> | 2003-08-06 04:00:37 +0000 |
---|---|---|
committer | Mark Spencer <markster@digium.com> | 2003-08-06 04:00:37 +0000 |
commit | e0369d78c90040dbbdc5edd86bba02cb6efd5566 (patch) | |
tree | 09f96b5da0d0ff4fb724edd6a8bdd124e850c573 /channels/chan_agent.c | |
parent | 826fe52a8ae68f17b29e233a3cae747cc2b73ff4 (diff) |
Try immediately logged in agents first, then callbacklogin ones
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1266 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_agent.c')
-rwxr-xr-x | channels/chan_agent.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c index e2832d370..466181cb6 100755 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -726,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 */ @@ -750,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 */ |