chan_agent: Fix wrapup time wait response.

* Made agent_cont_sleep() and agent_ack_sleep() stop waiting if the wrapup 
time expires.  agent_cont_sleep() had tried but returned the wrong value 
to stop waiting.  

* Made agent_ack_sleep() take a struct agent_pvt pointer instead of a void
pointer for better type safety.
........

Merged revisions 378486 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 378487 from http://svn.asterisk.org/svn/asterisk/branches/11


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@378488 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Richard Mudgett 2013-01-03 19:42:54 +00:00
parent ad582f9aef
commit 1d685bd28c
1 changed files with 26 additions and 22 deletions

View File

@ -1022,42 +1022,38 @@ static int agent_hangup(struct ast_channel *ast)
return 0;
}
static int agent_cont_sleep( void *data )
static int agent_cont_sleep(void *data)
{
struct agent_pvt *p;
int res;
p = (struct agent_pvt *)data;
p = (struct agent_pvt *) data;
ast_mutex_lock(&p->lock);
res = p->app_sleep_cond;
if (p->lastdisc.tv_sec) {
if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > 0)
res = 1;
if (res && p->lastdisc.tv_sec) {
if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > 0) {
res = 0;
}
}
ast_mutex_unlock(&p->lock);
if (!res)
ast_debug(5, "agent_cont_sleep() returning %d\n", res );
if (!res) {
ast_debug(5, "agent_cont_sleep() returning %d\n", res);
}
return res;
}
static int agent_ack_sleep(void *data)
static int agent_ack_sleep(struct agent_pvt *p)
{
struct agent_pvt *p;
int res=0;
int digit;
int to = 1000;
struct ast_frame *f;
struct timeval start = ast_tvnow();
int ms;
/* Wait a second and look for something */
p = (struct agent_pvt *) data;
if (!p->chan)
return -1;
while ((ms = ast_remaining_ms(start, to))) {
ms = ast_waitfor(p->chan, ms);
if (ms < 0) {
@ -1067,23 +1063,31 @@ static int agent_ack_sleep(void *data)
return 0;
}
f = ast_read(p->chan);
if (!f)
if (!f) {
return -1;
if (f->frametype == AST_FRAME_DTMF)
res = f->subclass.integer;
else
res = 0;
}
if (f->frametype == AST_FRAME_DTMF) {
digit = f->subclass.integer;
} else {
digit = 0;
}
ast_frfree(f);
ast_mutex_lock(&p->lock);
if (!p->app_sleep_cond) {
ast_mutex_unlock(&p->lock);
return 0;
} else if (res == p->acceptdtmf) {
}
if (digit == p->acceptdtmf) {
ast_mutex_unlock(&p->lock);
return 1;
}
if (p->lastdisc.tv_sec) {
if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > 0) {
ast_mutex_unlock(&p->lock);
return 0;
}
}
ast_mutex_unlock(&p->lock);
res = 0;
}
return 0;
}