diff options
author | murf <murf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-07-03 00:16:25 +0000 |
---|---|---|
committer | murf <murf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-07-03 00:16:25 +0000 |
commit | 61b6de4e16736df453e61eead1ac1c574305e0f5 (patch) | |
tree | f2c79c5941fdf5b648ecb85706407379e93a3dd4 /channels | |
parent | 213226fe9aec511d36531d2677b36785057144c6 (diff) |
The CDRfix4/5/6 omnibus cdr fixes.
(closes issue #10927)
Reported by: murf
Tested by: murf, deeperror
(closes issue #12907)
Reported by: falves11
Tested by: murf, falves11
(closes issue #11849)
Reported by: greyvoip
As to 11849, I think these changes fix the core problems
brought up in that bug, but perhaps not the more global
problems created by the limitations of CDR's themselves
not being oriented around transfers.
Reopen if necc, but bug reports are not the best
medium for enhancement discussions. We need to start
a second-generation CDR standardization effort to cover
transfers.
(closes issue #11093)
Reported by: rossbeer
Tested by: greyvoip, murf
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@127663 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_dahdi.c | 45 | ||||
-rw-r--r-- | channels/chan_sip.c | 13 |
2 files changed, 21 insertions, 37 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 4e3871f8a..aab01c511 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -3514,18 +3514,6 @@ static int attempt_transfer(struct dahdi_pvt *p) if (p->subs[SUB_THREEWAY].owner->_state == AST_STATE_RING) { tone_zone_play_tone(p->subs[SUB_THREEWAY].dfd, DAHDI_TONE_RINGTONE); } - if (p->subs[SUB_REAL].owner->cdr) { - /* Move CDR from second channel to current one */ - p->subs[SUB_THREEWAY].owner->cdr = - ast_cdr_append(p->subs[SUB_THREEWAY].owner->cdr, p->subs[SUB_REAL].owner->cdr); - p->subs[SUB_REAL].owner->cdr = NULL; - } - if (ast_bridged_channel(p->subs[SUB_REAL].owner)->cdr) { - /* Move CDR from second channel's bridge to current one */ - p->subs[SUB_THREEWAY].owner->cdr = - ast_cdr_append(p->subs[SUB_THREEWAY].owner->cdr, ast_bridged_channel(p->subs[SUB_REAL].owner)->cdr); - ast_bridged_channel(p->subs[SUB_REAL].owner)->cdr = NULL; - } if (ast_channel_masquerade(p->subs[SUB_THREEWAY].owner, ast_bridged_channel(p->subs[SUB_REAL].owner))) { ast_log(LOG_WARNING, "Unable to masquerade %s as %s\n", ast_bridged_channel(p->subs[SUB_REAL].owner)->name, p->subs[SUB_THREEWAY].owner->name); @@ -3542,18 +3530,6 @@ static int attempt_transfer(struct dahdi_pvt *p) if (p->subs[SUB_REAL].owner->_state == AST_STATE_RING) { tone_zone_play_tone(p->subs[SUB_REAL].dfd, DAHDI_TONE_RINGTONE); } - if (p->subs[SUB_THREEWAY].owner->cdr) { - /* Move CDR from second channel to current one */ - p->subs[SUB_REAL].owner->cdr = - ast_cdr_append(p->subs[SUB_REAL].owner->cdr, p->subs[SUB_THREEWAY].owner->cdr); - p->subs[SUB_THREEWAY].owner->cdr = NULL; - } - if (ast_bridged_channel(p->subs[SUB_THREEWAY].owner)->cdr) { - /* Move CDR from second channel's bridge to current one */ - p->subs[SUB_REAL].owner->cdr = - ast_cdr_append(p->subs[SUB_REAL].owner->cdr, ast_bridged_channel(p->subs[SUB_THREEWAY].owner)->cdr); - ast_bridged_channel(p->subs[SUB_THREEWAY].owner)->cdr = NULL; - } if (ast_channel_masquerade(p->subs[SUB_REAL].owner, ast_bridged_channel(p->subs[SUB_THREEWAY].owner))) { ast_log(LOG_WARNING, "Unable to masquerade %s as %s\n", ast_bridged_channel(p->subs[SUB_THREEWAY].owner)->name, p->subs[SUB_REAL].owner->name); @@ -4305,6 +4281,17 @@ static struct ast_frame *dahdi_handle_event(struct ast_channel *ast) dahdi_enable_ec(p); ast_hangup(chan); } else { + struct ast_channel *other = ast_bridged_channel(p->subs[SUB_THREEWAY].owner); + int way3bridge = 0, cdr3way = 0; + + if (!other) { + other = ast_bridged_channel(p->subs[SUB_REAL].owner); + } else + way3bridge = 1; + + if (p->subs[SUB_THREEWAY].owner->cdr) + cdr3way = 1; + if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Started three way call on channel %d\n", p->channel); /* Start music on hold if appropriate */ @@ -4340,6 +4327,16 @@ static struct ast_frame *dahdi_handle_event(struct ast_channel *ast) if (((ast->pbx) || (ast->_state == AST_STATE_UP)) && (p->transfertobusy || (ast->_state != AST_STATE_BUSY))) { int otherindex = SUB_THREEWAY; + struct ast_channel *other = ast_bridged_channel(p->subs[SUB_THREEWAY].owner); + int way3bridge = 0, cdr3way = 0; + + if (!other) { + other = ast_bridged_channel(p->subs[SUB_REAL].owner); + } else + way3bridge = 1; + + if (p->subs[SUB_THREEWAY].owner->cdr) + cdr3way = 1; if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Building conference on call on %s and %s\n", p->subs[SUB_THREEWAY].owner->name, p->subs[SUB_REAL].owner->name); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 3451ffbe5..0cafa796b 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -13402,19 +13402,6 @@ static int attempt_transfer(struct sip_dual *transferer, struct sip_dual *target if (peerd) ast_quiet_chan(peerd); - /* Fix CDRs so they're attached to the remaining channel */ - if (peera->cdr && peerb->cdr) - peerb->cdr = ast_cdr_append(peerb->cdr, peera->cdr); - else if (peera->cdr) - peerb->cdr = peera->cdr; - peera->cdr = NULL; - - if (peerb->cdr && peerc->cdr) - peerb->cdr = ast_cdr_append(peerb->cdr, peerc->cdr); - else if (peerc->cdr) - peerb->cdr = peerc->cdr; - peerc->cdr = NULL; - if (option_debug > 3) ast_log(LOG_DEBUG, "SIP transfer: trying to masquerade %s into %s\n", peerc->name, peerb->name); if (ast_channel_masquerade(peerb, peerc)) { |