mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	(closes issue #12982)
Reported by: bcnit Tested by: murf I discovered that also, in the previous bug fixes and changes, the cdr.conf 'unanswered' option is not being obeyed, so I fixed this. And, yes, there are two 'answer' times involved in this scenario, and I would agree with you, that the first answer time is the time that should appear in the CDR. (the second 'answer' time is the time that the bridge was begun). I made the necessary adjustments, recording the first answer time into the peer cdr, and then using that to override the bridge cdr's value. To get the 'unanswered' CDRs to appear, I purposely output them, using the dial cmd to mark them as DIALED (with a new flag), and outputting them if they bear that flag, and you are in the right mode. I also corrected one small mention of the Zap device to equally consider the dahdi device. I heavily tested 10-sec-wait macros in dial, and without the macro call; I tested hangups while the macro was running vs. letting the macro complete and the bridge form. Looks OK. Removed all the instrumentation and debug. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@135799 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -1475,8 +1475,19 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast | ||||
| 				ast_cdr_start(bridge_cdr); | ||||
| 			} | ||||
| 		} | ||||
| 		ast_cdr_answer(bridge_cdr); | ||||
| 		ast_cdr_answer(chan->cdr); /* for the sake of cli status checks */ | ||||
| 		/* peer->cdr->answer will be set when a macro runs on the peer; | ||||
| 		   in that case, the bridge answer will be delayed while the | ||||
| 		   macro plays on the peer channel. The peer answered the call | ||||
| 		   before the macro started playing. To the phone system, | ||||
| 		   this is billable time for the call, even tho the caller | ||||
| 		   hears nothing but ringing while the macro does its thing. */ | ||||
| 		if (peer->cdr && !ast_tvzero(peer->cdr->answer)) { | ||||
| 			bridge_cdr->answer = peer->cdr->answer; | ||||
| 			chan->cdr->answer = peer->cdr->answer; | ||||
| 		} else { | ||||
| 			ast_cdr_answer(bridge_cdr); | ||||
| 			ast_cdr_answer(chan->cdr); /* for the sake of cli status checks */ | ||||
| 		} | ||||
| 		ast_set_flag(chan->cdr, AST_CDR_FLAG_BRIDGED); | ||||
| 		if (peer->cdr) { | ||||
| 			ast_set_flag(peer->cdr, AST_CDR_FLAG_BRIDGED); | ||||
| @@ -1550,7 +1561,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast | ||||
| 		if (res < 0) { | ||||
| 			if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_test_flag(peer, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan) && !ast_check_hangup(peer)) | ||||
| 				ast_log(LOG_WARNING, "Bridge failed on channels %s and %s\n", chan->name, peer->name); | ||||
| 			return -1; | ||||
| 			goto before_you_go; | ||||
| 		} | ||||
| 		 | ||||
| 		if (!f || (f->frametype == AST_FRAME_CONTROL && | ||||
| @@ -1647,6 +1658,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast | ||||
| 			ast_frfree(f); | ||||
|  | ||||
| 	} | ||||
|    before_you_go: | ||||
| 	/* obey the NoCDR() wishes. */ | ||||
| 	if (!chan->cdr || (chan->cdr && !ast_test_flag(chan->cdr, AST_CDR_FLAG_POST_DISABLED))) { | ||||
| 		 | ||||
| @@ -1659,12 +1671,22 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast | ||||
| 			ast_cdr_specialized_reset(chan->cdr,0); | ||||
| 		} | ||||
| 		if (peer->cdr) { | ||||
| 			if (orig_peer_cdr && peer->cdr != orig_peer_cdr) { | ||||
| 				/* this can only happen if there was a transfer, methinks */ | ||||
| 				ast_cdr_specialized_reset(orig_peer_cdr,0); | ||||
| 			} else { | ||||
| 				ast_cdr_specialized_reset(peer->cdr,0); | ||||
| 			/* before resetting the peer cdr, throw a copy of it to the | ||||
| 			   backend, just in case the cdr.conf file is calling for | ||||
| 			   unanswered CDR's. */ | ||||
| 			 | ||||
| 			/* When peer->cdr isn't the same addr as orig_peer_cdr, | ||||
| 			   this can only happen if there was a transfer, methinks; | ||||
| 			   at any rate, only pay attention to the original*/ | ||||
| 			if (ast_cdr_isset_unanswered()) { | ||||
| 				struct ast_cdr *dupd = ast_cdr_dup(orig_peer_cdr); | ||||
| 				if (dupd) { | ||||
| 					if (ast_tvzero(dupd->end) && ast_cdr_isset_unanswered()) | ||||
| 						ast_cdr_end(dupd); | ||||
| 					ast_cdr_detach(dupd); | ||||
| 				} | ||||
| 			} | ||||
| 			ast_cdr_specialized_reset(orig_peer_cdr,0); | ||||
| 		} | ||||
| 	} | ||||
| 	return res; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user