From 60b40fff10126343b3c7a2d7e639eb320bc2ecee Mon Sep 17 00:00:00 2001 From: Matthew Nicholson Date: Tue, 12 May 2009 22:48:14 +0000 Subject: [PATCH] Merged revisions 194057 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r194057 | mnicholson | 2009-05-12 17:32:13 -0500 (Tue, 12 May 2009) | 22 lines 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/branches/1.6.2@194059 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_queue.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/apps/app_queue.c b/apps/app_queue.c index 3150cb90e9..cae05a74fe 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -2523,6 +2523,21 @@ 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 */ @@ -3776,6 +3791,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 @@ -3851,6 +3880,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; @@ -3870,6 +3900,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; @@ -5066,6 +5097,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", @@ -5089,6 +5121,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); @@ -5110,6 +5143,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; @@ -5122,6 +5156,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; @@ -5131,6 +5166,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); @@ -5159,6 +5195,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);