mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	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:
		| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user