[asterisk-commits] dvossel: branch 1.6.1 r189206 - in /branches/1.6.1: ./ channels/chan_agent.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Apr 17 20:38:25 CDT 2009
Author: dvossel
Date: Fri Apr 17 20:38:21 2009
New Revision: 189206
URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=189206
Log:
Merged revisions 189204 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r189204 | dvossel | 2009-04-17 20:28:45 -0500 (Fri, 17 Apr 2009) | 18 lines
Merged revisions 189203 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r189203 | dvossel | 2009-04-17 20:27:19 -0500 (Fri, 17 Apr 2009) | 12 lines
Fixed autologoff in agents.conf not working when agent logs in via AgentLogin app
An agent logs in by calling an extension that calls the AgentLogin app. In agents.conf ackcall=always is set, so when they get a call they have the choice to either acknowledge it or ignore it. autologoff=10 is set as well, so if the agent ignores the call over 10sec one may assume that the agent should be logged out (and in this case hungup on as well), but this was not happening.
(closes issue #14091)
Reported by: evandro
Patches:
autologoff.diff uploaded by dvossel (license 671)
Review: http://reviewboard.digium.com/r/225/
........
................
Modified:
branches/1.6.1/ (props changed)
branches/1.6.1/channels/chan_agent.c
Propchange: branches/1.6.1/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.
Modified: branches/1.6.1/channels/chan_agent.c
URL: http://svn.digium.com/svn-view/asterisk/branches/1.6.1/channels/chan_agent.c?view=diff&rev=189206&r1=189205&r2=189206
==============================================================================
--- branches/1.6.1/channels/chan_agent.c (original)
+++ branches/1.6.1/channels/chan_agent.c Fri Apr 17 20:38:21 2009
@@ -246,6 +246,7 @@
static char *complete_agent_logoff_cmd(const char *line, const char *word, int pos, int state);
static struct ast_channel* agent_get_base_channel(struct ast_channel *chan);
static int agent_set_base_channel(struct ast_channel *chan, struct ast_channel *base);
+static int agent_logoff(const char *agent, int soft);
/*! \brief Channel interface description for PBX integration */
static const struct ast_channel_tech agent_tech = {
@@ -448,8 +449,12 @@
struct ast_frame *f = NULL;
static struct ast_frame answer_frame = { AST_FRAME_CONTROL, AST_CONTROL_ANSWER };
const char *status;
- ast_mutex_lock(&p->lock);
+ int cur_time = time(NULL);
+ ast_mutex_lock(&p->lock);
CHECK_FORMATS(ast, p);
+ if (!p->start) {
+ p->start = cur_time;
+ }
if (p->chan) {
ast_copy_flags(p->chan, ast, AST_FLAG_EXCEPTION);
p->chan->fdno = (ast->fdno == AST_AGENT_FD) ? AST_TIMING_FD : ast->fdno;
@@ -466,19 +471,16 @@
if (p->chan)
ast_debug(1, "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;
+ int howlong = cur_time - p->start;
+ if (p->autologoff && howlong >= p->autologoff) {
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();
+ agent_logoff_maintenance(p, p->loginchan, (cur_time = p->loginstart), ast->uniqueid, "Autologoff");
}
}
status = pbx_builtin_getvar_helper(p->chan, "CHANLOCALSTATUS");
if (autologoffunavail && status && !strcasecmp(status, "CHANUNAVAIL")) {
- long logintime = time(NULL) - p->loginstart;
+ long logintime = cur_time - p->loginstart;
p->loginstart = 0;
ast_log(LOG_NOTICE, "Agent read: '%s' is not available now, auto logoff\n", p->name);
agent_logoff_maintenance(p, p->loginchan, logintime, ast->uniqueid, "Chanunavail");
@@ -491,28 +493,38 @@
ast_devstate_changed(AST_DEVICE_UNAVAILABLE, "Agent/%s", p->agent);
p->acknowledged = 0;
}
- } else {
- /* if acknowledgement is not required, and the channel is up, we may have missed
- an AST_CONTROL_ANSWER (if there was one), so mark the call acknowledged anyway */
- if (!p->ackcall && !p->acknowledged && p->chan && (p->chan->_state == AST_STATE_UP))
- p->acknowledged = 1;
- switch (f->frametype) {
- case AST_FRAME_CONTROL:
- if (f->subclass == AST_CONTROL_ANSWER) {
- if (p->ackcall) {
- ast_verb(3, "%s answered, waiting for '%c' to acknowledge\n", p->chan->name, p->acceptdtmf);
- /* Don't pass answer along */
- ast_frfree(f);
- f = &ast_null_frame;
- } else {
- p->acknowledged = 1;
- /* Use the builtin answer frame for the
+ } else {
+ /* if acknowledgement is not required, and the channel is up, we may have missed
+ an AST_CONTROL_ANSWER (if there was one), so mark the call acknowledged anyway */
+ if (!p->ackcall && !p->acknowledged && p->chan && (p->chan->_state == AST_STATE_UP)) {
+ p->acknowledged = 1;
+ }
+
+ if (!p->acknowledged) {
+ int howlong = cur_time - p->start;
+ if (p->autologoff && (howlong >= p->autologoff)) {
+ 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, (cur_time - p->loginstart), ast->uniqueid, "Autologoff");
+ agent_logoff(p->agent, 0);
+ }
+ }
+ switch (f->frametype) {
+ case AST_FRAME_CONTROL:
+ if (f->subclass == AST_CONTROL_ANSWER) {
+ if (p->ackcall) {
+ ast_verb(3, "%s answered, waiting for '%c' to acknowledge\n", p->chan->name, p->acceptdtmf);
+ /* Don't pass answer along */
+ ast_frfree(f);
+ f = &ast_null_frame;
+ } else {
+ p->acknowledged = 1;
+ /* Use the builtin answer frame for the
recording start check below. */
- ast_frfree(f);
- f = &answer_frame;
- }
- }
- break;
+ ast_frfree(f);
+ f = &answer_frame;
+ }
+ }
+ break;
case AST_FRAME_DTMF_BEGIN:
/*ignore DTMF begin's as it can cause issues with queue announce files*/
if((!p->acknowledged && f->subclass == p->acceptdtmf) || (f->subclass == p->enddtmf && endcall)){
@@ -520,30 +532,30 @@
f = &ast_null_frame;
}
break;
- case AST_FRAME_DTMF_END:
- if (!p->acknowledged && (f->subclass == p->acceptdtmf)) {
- ast_verb(3, "%s acknowledged\n", p->chan->name);
- p->acknowledged = 1;
- ast_frfree(f);
- f = &answer_frame;
- } else if (f->subclass == p->enddtmf && endcall) {
- /* terminates call */
- ast_frfree(f);
- f = NULL;
- }
- break;
- case AST_FRAME_VOICE:
- case AST_FRAME_VIDEO:
- /* don't pass voice or video until the call is acknowledged */
- if (!p->acknowledged) {
- ast_frfree(f);
- f = &ast_null_frame;
- }
+ case AST_FRAME_DTMF_END:
+ if (!p->acknowledged && (f->subclass == p->acceptdtmf)) {
+ ast_verb(3, "%s acknowledged\n", p->chan->name);
+ p->acknowledged = 1;
+ ast_frfree(f);
+ f = &answer_frame;
+ } else if (f->subclass == p->enddtmf && endcall) {
+ /* terminates call */
+ ast_frfree(f);
+ f = NULL;
+ }
+ break;
+ case AST_FRAME_VOICE:
+ case AST_FRAME_VIDEO:
+ /* don't pass voice or video until the call is acknowledged */
+ if (!p->acknowledged) {
+ ast_frfree(f);
+ f = &ast_null_frame;
+ }
default:
/* pass everything else on through */
break;
- }
- }
+ }
+ }
CLEANUP(ast,p);
if (p->chan && !p->chan->_bridge) {
@@ -1558,7 +1570,7 @@
p->logincallerid[0] = '\0';
ast_devstate_changed(AST_DEVICE_UNAVAILABLE, "Agent/%s", p->agent);
if (persistent_agents)
- dump_agents();
+ dump_agents();
}
More information about the asterisk-commits
mailing list