aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authormurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-05 23:13:20 +0000
committermurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-05 23:13:20 +0000
commit5482dbc0430efc94e35c5ab9d7a58c0743efadf9 (patch)
tree28765ae88a2eb03202410c78cc1a40c281a9aa98 /res
parent0343c9913dc4dfc64567d5ec89e07a3602a767d6 (diff)
(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: http://svn.digium.com/svn/asterisk/branches/1.4@135799 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_features.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/res/res_features.c b/res/res_features.c
index e326a8960..75e1ccbd9 100644
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -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;