Frames from the inbound channel should go to all outbound channels in app_dial.c.

In app_dial.c:wait_for_answer() frames from the inbound channel should be
sent to all outbound channels instead of only if there is just one
outbound channel.

Control frames like AST_CONTROL_CONNECTED_LINE need to be passed to all of
the the outbound channels.  This can happen if a blond transfer is done by
a remote switch on the inbound channel.

JIRA AST-443
JIRA SWP-2730


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@313369 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/1.8.6
Richard Mudgett 14 years ago
parent 6dc376082d
commit dde33a1e01

@ -1418,19 +1418,26 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
} }
} }
if (single) { /* Send the frame from the in channel to all outgoing channels. */
for (o = outgoing; o; o = o->next) {
if (!o->chan || !ast_test_flag64(o, DIAL_STILLGOING)) {
/* This outgoing channel has died so don't send the frame to it. */
continue;
}
switch (f->frametype) { switch (f->frametype) {
case AST_FRAME_HTML: case AST_FRAME_HTML:
/* Forward HTML stuff */ /* Forward HTML stuff */
if (!ast_test_flag64(outgoing, DIAL_NOFORWARDHTML) if (!ast_test_flag64(o, DIAL_NOFORWARDHTML)
&& ast_channel_sendhtml(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen) == -1) { && ast_channel_sendhtml(o->chan, f->subclass.integer, f->data.ptr, f->datalen) == -1) {
ast_log(LOG_WARNING, "Unable to send URL\n"); ast_log(LOG_WARNING, "Unable to send URL\n");
} }
break; break;
case AST_FRAME_VOICE: case AST_FRAME_VOICE:
case AST_FRAME_IMAGE:
case AST_FRAME_TEXT:
case AST_FRAME_DTMF_BEGIN: case AST_FRAME_DTMF_BEGIN:
case AST_FRAME_DTMF_END: case AST_FRAME_DTMF_END:
if (ast_write(outgoing->chan, f)) { if (ast_write(o->chan, f)) {
ast_log(LOG_WARNING, "Unable to forward frametype: %d\n", ast_log(LOG_WARNING, "Unable to forward frametype: %d\n",
f->frametype); f->frametype);
} }
@ -1441,17 +1448,18 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
case AST_CONTROL_UNHOLD: case AST_CONTROL_UNHOLD:
case AST_CONTROL_VIDUPDATE: case AST_CONTROL_VIDUPDATE:
case AST_CONTROL_SRCUPDATE: case AST_CONTROL_SRCUPDATE:
ast_verb(3, "%s requested special control %d, passing it to %s\n", in->name, f->subclass.integer, outgoing->chan->name); ast_verb(3, "%s requested special control %d, passing it to %s\n",
ast_indicate_data(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen); in->name, f->subclass.integer, o->chan->name);
ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
break; break;
case AST_CONTROL_CONNECTED_LINE: case AST_CONTROL_CONNECTED_LINE:
if (ast_channel_connected_line_macro(in, outgoing->chan, f, 0, 1)) { if (ast_channel_connected_line_macro(in, o->chan, f, 0, 1)) {
ast_indicate_data(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen); ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
} }
break; break;
case AST_CONTROL_REDIRECTING: case AST_CONTROL_REDIRECTING:
if (ast_channel_redirecting_macro(in, outgoing->chan, f, 0, 1)) { if (ast_channel_redirecting_macro(in, o->chan, f, 0, 1)) {
ast_indicate_data(outgoing->chan, f->subclass.integer, f->data.ptr, f->datalen); ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
} }
break; break;
default: default:

Loading…
Cancel
Save