|
|
|
@ -2748,34 +2748,50 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
|
|
|
|
|
|
|
|
|
|
active_chan = ast_waitfor_n(chans, 2, &ms);
|
|
|
|
|
if (active_chan) {
|
|
|
|
|
struct ast_channel *other_chan;
|
|
|
|
|
struct ast_frame *fr = ast_read(active_chan);
|
|
|
|
|
|
|
|
|
|
if (!fr) {
|
|
|
|
|
ast_autoservice_chan_hangup_peer(chan, peer);
|
|
|
|
|
res = -1;
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
switch(fr->frametype) {
|
|
|
|
|
case AST_FRAME_DTMF_END:
|
|
|
|
|
digit = fr->subclass.integer;
|
|
|
|
|
if (active_chan == peer && strchr(AST_DIGIT_ANY, res)) {
|
|
|
|
|
ast_stopstream(peer);
|
|
|
|
|
res = ast_senddigit(chan, digit, 0);
|
|
|
|
|
switch (fr->frametype) {
|
|
|
|
|
case AST_FRAME_DTMF_END:
|
|
|
|
|
digit = fr->subclass.integer;
|
|
|
|
|
if (active_chan == peer && strchr(AST_DIGIT_ANY, res)) {
|
|
|
|
|
ast_stopstream(peer);
|
|
|
|
|
res = ast_senddigit(chan, digit, 0);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case AST_FRAME_CONTROL:
|
|
|
|
|
switch (fr->subclass.integer) {
|
|
|
|
|
case AST_CONTROL_HANGUP:
|
|
|
|
|
ast_frfree(fr);
|
|
|
|
|
ast_autoservice_chan_hangup_peer(chan, peer);
|
|
|
|
|
res = -1;
|
|
|
|
|
goto done;
|
|
|
|
|
case AST_CONTROL_CONNECTED_LINE:
|
|
|
|
|
/* Pass COLP update to the other channel. */
|
|
|
|
|
if (active_chan == chan) {
|
|
|
|
|
other_chan = peer;
|
|
|
|
|
} else {
|
|
|
|
|
other_chan = chan;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case AST_FRAME_CONTROL:
|
|
|
|
|
switch (fr->subclass.integer) {
|
|
|
|
|
case AST_CONTROL_HANGUP:
|
|
|
|
|
ast_frfree(fr);
|
|
|
|
|
ast_autoservice_chan_hangup_peer(chan, peer);
|
|
|
|
|
res = -1;
|
|
|
|
|
goto done;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
if (ast_channel_connected_line_sub(active_chan, other_chan, fr, 1)
|
|
|
|
|
&& ast_channel_connected_line_macro(active_chan,
|
|
|
|
|
other_chan, fr, other_chan == chan, 1)) {
|
|
|
|
|
ast_indicate_data(other_chan, fr->subclass.integer,
|
|
|
|
|
fr->data.ptr, fr->datalen);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
/* Ignore all others */
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
/* Ignore all others */
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
ast_frfree(fr);
|
|
|
|
|
}
|
|
|
|
|