Merged revisions 194028 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r194028 | mnicholson | 2009-05-12 17:15:45 -0500 (Tue, 12 May 2009) | 16 lines
  
  This change modifies app_queue to properly generate CDR records in failure
  situations.
  
  This involves setting a proper cdr disposition coresponding to the given
  failure condition and ensuring the proper information is stored in the cdr
  record.
  
  (closes issue #13691)
  Reported by: dferrer
  Tested by: mnicholson
  
  (closes issue #13637)
  Reported by: atis
  Tested by: atis
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@194057 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Matthew Nicholson 2009-05-12 22:32:13 +00:00
parent 84a4d2484d
commit 69976640f5
1 changed files with 38 additions and 0 deletions

View File

@ -2566,6 +2566,22 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
ast_copy_string(tmp->chan->exten, macroexten, sizeof(tmp->chan->exten));
else
ast_copy_string(tmp->chan->exten, qe->chan->exten, sizeof(tmp->chan->exten));
if (ast_cdr_isset_unanswered()) {
/* they want to see the unanswered dial attempts! */
/* set up the CDR fields on all the CDRs to give sensical information */
ast_cdr_setdestchan(tmp->chan->cdr, tmp->chan->name);
strcpy(tmp->chan->cdr->clid, qe->chan->cdr->clid);
strcpy(tmp->chan->cdr->channel, qe->chan->cdr->channel);
strcpy(tmp->chan->cdr->src, qe->chan->cdr->src);
strcpy(tmp->chan->cdr->dst, qe->chan->exten);
strcpy(tmp->chan->cdr->dcontext, qe->chan->context);
strcpy(tmp->chan->cdr->lastapp, qe->chan->cdr->lastapp);
strcpy(tmp->chan->cdr->lastdata, qe->chan->cdr->lastdata);
tmp->chan->cdr->amaflags = qe->chan->cdr->amaflags;
strcpy(tmp->chan->cdr->accountcode, qe->chan->cdr->accountcode);
strcpy(tmp->chan->cdr->userfield, qe->chan->cdr->userfield);
}
ast_channel_unlock(qe->chan);
/* Place the call, but don't wait on the answer */
if ((res = ast_call(tmp->chan, location, 0))) {
@ -3913,6 +3929,20 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
}
if (res == -1)
ast_debug(1, "%s: Nobody answered.\n", qe->chan->name);
if (ast_cdr_isset_unanswered()) {
/* channel contains the name of one of the outgoing channels
in its CDR; zero out this CDR to avoid a dual-posting */
struct callattempt *o;
for (o = outgoing; o; o = o->q_next) {
if (!o->chan) {
continue;
}
if (strcmp(o->chan->cdr->dstchannel, qe->chan->cdr->dstchannel) == 0) {
ast_set_flag(o->chan->cdr, AST_CDR_FLAG_POST_DISABLED);
break;
}
}
}
} else { /* peer is valid */
/* Ah ha! Someone answered within the desired timeframe. Of course after this
we will always return with -1 so that it is hung up properly after the
@ -3988,6 +4018,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_log(LOG_NOTICE, "Caller was about to talk to agent on %s but the caller hungup.\n", peer->name);
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "ABANDON", "%d|%d|%ld", qe->pos, qe->opos, (long) time(NULL) - qe->start);
record_abandoned(qe);
ast_cdr_noanswer(qe->chan->cdr);
ast_hangup(peer);
ao2_ref(member, -1);
return -1;
@ -4007,6 +4038,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "SYSCOMPAT", "%s", "");
ast_log(LOG_WARNING, "Had to drop call because I couldn't make %s compatible with %s\n", qe->chan->name, peer->name);
record_abandoned(qe);
ast_cdr_failed(qe->chan->cdr);
ast_hangup(peer);
ao2_ref(member, -1);
return -1;
@ -5213,6 +5245,7 @@ check_turns:
/* Leave if we have exceeded our queuetimeout */
if (qe.expire && (time(NULL) >= qe.expire)) {
record_abandoned(&qe);
ast_cdr_noanswer(qe.chan->cdr);
reason = QUEUE_TIMEOUT;
res = 0;
ast_queue_log(args.queuename, chan->uniqueid,"NONE", "EXITWITHTIMEOUT", "%d|%d|%ld",
@ -5236,6 +5269,7 @@ check_turns:
/* Leave if we have exceeded our queuetimeout */
if (qe.expire && (time(NULL) >= qe.expire)) {
record_abandoned(&qe);
ast_cdr_noanswer(qe.chan->cdr);
reason = QUEUE_TIMEOUT;
res = 0;
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
@ -5257,6 +5291,7 @@ check_turns:
int status = 0;
if ((status = get_member_status(qe.parent, qe.max_penalty, qe.min_penalty, qe.parent->leavewhenempty))) {
record_abandoned(&qe);
ast_cdr_noanswer(qe.chan->cdr);
reason = QUEUE_LEAVEEMPTY;
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITEMPTY", "%d|%d|%ld", qe.pos, qe.opos, (long)(time(NULL) - qe.start));
res = 0;
@ -5269,6 +5304,7 @@ check_turns:
ast_verb(3, "Exiting on time-out cycle\n");
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
record_abandoned(&qe);
ast_cdr_noanswer(qe.chan->cdr);
reason = QUEUE_TIMEOUT;
res = 0;
break;
@ -5278,6 +5314,7 @@ check_turns:
/* Leave if we have exceeded our queuetimeout */
if (qe.expire && (time(NULL) >= qe.expire)) {
record_abandoned(&qe);
ast_cdr_noanswer(qe.chan->cdr);
reason = QUEUE_TIMEOUT;
res = 0;
ast_queue_log(qe.parent->name, qe.chan->uniqueid,"NONE", "EXITWITHTIMEOUT", "%d|%d|%ld", qe.pos, qe.opos, (long) time(NULL) - qe.start);
@ -5306,6 +5343,7 @@ stop:
if (res < 0) {
if (!qe.handled) {
record_abandoned(&qe);
ast_cdr_noanswer(qe.chan->cdr);
ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON",
"%d|%d|%ld", qe.pos, qe.opos,
(long) time(NULL) - qe.start);