app_queue: Made pass connected line updates from the caller to ringing queue members.

Party A calls Party B
Party B puts Party A on hold.
Party B calls a queue.
Ringing queue member D sees Party B identification.
Party B transfers Party A to the queue.
Queue member D does not get a connected line update for Party A.
Queue member D answers the call and still sees Party B information.

However, if Party A later transfers the call to Party C then queue member
D gets a connected line update for Party C.

* Made pass connected line updates from the caller to queue members while
the queue members are ringing.

(closes issue AST-1017)
Reported by: Thomas Arimont

(closes issue ABE-2886)
Reported by: Thomas Arimont
Tested by: rmudgett

........

Merged revisions 374801 from https://origsvn.digium.com/svn/asterisk/be/branches/C.3-bier
........

Merged revisions 374802 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 374803 from http://svn.asterisk.org/svn/asterisk/branches/10
........

Merged revisions 374804 from http://svn.asterisk.org/svn/asterisk/branches/11


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@374805 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Richard Mudgett
2012-10-10 21:05:51 +00:00
parent 357b733b66
commit 516c9ec665

View File

@@ -4405,13 +4405,6 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
return NULL;
}
/*!
* \todo
* XXX Queue like Dial really should send any connected line
* updates (AST_CONTROL_CONNECTED_LINE) from the caller to each
* ringing queue member.
*/
if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer);
*to = 0;
@@ -4425,6 +4418,40 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
ast_frfree(f);
return NULL;
}
/* Send the frame from the in channel to all outgoing channels. */
for (o = start; o; o = o->call_next) {
if (!o->stillgoing || !o->chan) {
/* This outgoing channel has died so don't send the frame to it. */
continue;
}
switch (f->frametype) {
case AST_FRAME_CONTROL:
switch (f->subclass.integer) {
case AST_CONTROL_CONNECTED_LINE:
if (ast_channel_connected_line_sub(in, o->chan, f, 1) &&
ast_channel_connected_line_macro(in, o->chan, f, 0, 1)) {
ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
}
break;
case AST_CONTROL_REDIRECTING:
if (ast_channel_redirecting_sub(in, o->chan, f, 1) &&
ast_channel_redirecting_macro(in, o->chan, f, 0, 1)) {
ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
}
break;
default:
/* We are not going to do anything with this frame. */
goto skip_frame;
}
break;
default:
/* We are not going to do anything with this frame. */
goto skip_frame;
}
}
skip_frame:;
ast_frfree(f);
}
if (!*to) {