diff options
author | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-05-12 22:15:45 +0000 |
---|---|---|
committer | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-05-12 22:15:45 +0000 |
commit | 1e736b5a51a7513044a957bf403d10cdec8834ca (patch) | |
tree | eb89eb9f9bdab5ca6bfaea9608a667ded013b492 /apps/app_queue.c | |
parent | 919b7978d6e45988221f47a153eb2c6c64ea7348 (diff) |
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: http://svn.digium.com/svn/asterisk/branches/1.4@194028 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_queue.c')
-rw-r--r-- | apps/app_queue.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c index 867bfb6c0..366057326 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -1963,6 +1963,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 */ @@ -2967,6 +2982,20 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce } if (option_debug && res == -1) ast_log(LOG_DEBUG, "%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 @@ -3036,6 +3065,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; @@ -3052,6 +3082,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; @@ -4002,6 +4033,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); @@ -4020,6 +4052,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); @@ -4033,6 +4066,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); @@ -4051,6 +4085,7 @@ check_turns: ast_verbose(VERBOSE_PREFIX_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; @@ -4059,6 +4094,7 @@ check_turns: /* leave the queue if no agents, if enabled */ if (qe.parent->leavewhenempty && (stat == QUEUE_NO_MEMBERS)) { 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; @@ -4068,6 +4104,7 @@ check_turns: /* leave the queue if no reachable agents, if enabled */ if ((qe.parent->leavewhenempty == QUEUE_EMPTY_STRICT) && (stat == QUEUE_NO_REACHABLE_MEMBERS)) { record_abandoned(&qe); + ast_cdr_noanswer(qe.chan->cdr); reason = QUEUE_LEAVEUNAVAIL; ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITEMPTY", "%d|%d|%ld", qe.pos, qe.opos, (long)(time(NULL) - qe.start)); res = 0; @@ -4077,6 +4114,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); @@ -4108,6 +4146,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); |