diff options
author | twilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-01-20 19:31:56 +0000 |
---|---|---|
committer | twilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-01-20 19:31:56 +0000 |
commit | 911a9874fed1aab5e94910ca1b13ec3f70cfca4f (patch) | |
tree | 8da1742b411cfc31243985a04dbc9a5a0335a6fb | |
parent | 2f6ee42dfe5371d81e948c50a674d671d458f321 (diff) |
Merged revisions 169510 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r169510 | twilson | 2009-01-20 13:22:24 -0600 (Tue, 20 Jan 2009) | 7 lines
Make a proper builtin attended transfer to parking work
This is an ugly hack from 1.4 that allows the timeout callback from a parked
call to use the right channel name for the callback when the park is done with
a builtin attended transfer (that isn't completed early). This hasn't ever
worked in trunk and no one has complained yet, so eh.
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@169554 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | main/features.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/main/features.c b/main/features.c index f45ec4754..17d114f3d 100644 --- a/main/features.c +++ b/main/features.c @@ -580,8 +580,30 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer if (args->extout) *(args->extout) = x; - if (peer) - ast_copy_string(pu->peername, S_OR(args->orig_chan_name, peer->name), sizeof(pu->peername)); + if (peer) { + /* This is so ugly that it hurts, but implementing get_base_channel() on local channels + could have ugly side effects. We could have transferer<->local,1<->local,2<->parking + and we need the callback name to be that of transferer. Since local,1/2 have the same + name we can be tricky and just grab the bridged channel from the other side of the local + */ + if (!strcasecmp(peer->tech->type, "Local")) { + struct ast_channel *tmpchan, *base_peer; + char other_side[AST_CHANNEL_NAME]; + char *c; + ast_copy_string(other_side, S_OR(args->orig_chan_name, peer->name), sizeof(other_side)); + if ((c = strrchr(other_side, ';'))) { + *++c = '1'; + } + if ((tmpchan = ast_get_channel_by_name_locked(other_side))) { + if ((base_peer = ast_bridged_channel(tmpchan))) { + ast_copy_string(pu->peername, base_peer->name, sizeof(pu->peername)); + } + ast_channel_unlock(tmpchan); + } + } else { + ast_copy_string(pu->peername, S_OR(args->orig_chan_name, peer->name), sizeof(pu->peername)); + } + } /* Remember what had been dialed, so that if the parking expires, we try to come back to the same place */ |