]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
A unique situation of timeouts brought forth a failure situation for
authorMark Michelson <mmichelson@digium.com>
Mon, 9 Jun 2008 15:02:37 +0000 (15:02 +0000)
committerMark Michelson <mmichelson@digium.com>
Mon, 9 Jun 2008 15:02:37 +0000 (15:02 +0000)
autologoff in chan_agent. If using AgentCallbackLogin-style agents,
then if the timeout specified by the Dial() to reach the agent's phone
was shorter than the timeout specified in queues.conf, then autologoff
would only work if the caller hung up while the agent's phone was ringing.
This patch allows autologoff to work in this situation when the call in
queue transfers to the next available agent (as it would have if the timeout
in queues.conf were less than the timeout in the Dial()).

(closes issue #12754)
Reported by: Rodrigo
Patches:
      12754.patch uploaded by putnopvut (license 60)
Tested by: Rodrigo

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@121229 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_agent.c

index fe030261fbd961ef77e62f90a732734639ccd8de..f216030cf36d0874bffc28ede1170cb7ef08d7ae 100644 (file)
@@ -462,7 +462,17 @@ static struct ast_frame *agent_read(struct ast_channel *ast)
                        if (!ast_strlen_zero(p->loginchan)) {
                                if (p->chan)
                                        ast_log(LOG_DEBUG, "Bridge on '%s' being cleared (2)\n", p->chan->name);
-
+                               if (p->owner->_state != AST_STATE_UP) {
+                                       int howlong = time(NULL) - p->start;
+                                       if (p->autologoff && howlong > p->autologoff) {
+                                               long logintime = time(NULL) - p->loginstart;
+                                               p->loginstart = 0;
+                                                       ast_log(LOG_NOTICE, "Agent '%s' didn't answer/confirm within %d seconds (waited %d)\n", p->name, p->autologoff, howlong);
+                                               agent_logoff_maintenance(p, p->loginchan, logintime, ast->uniqueid, "Autologoff");
+                                               if (persistent_agents)
+                                                       dump_agents();
+                                       }
+                               }
                                status = pbx_builtin_getvar_helper(p->chan, "CHANLOCALSTATUS");
                                if (autologoffunavail && status && !strcasecmp(status, "CHANUNAVAIL")) {
                                        long logintime = time(NULL) - p->loginstart;