From 1d394774b2affad5252f6b76a0d69087699ff444 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Thu, 24 Sep 2015 13:27:44 -0500 Subject: app_dial.c: Make 'A' option pass COLP updates. While the 'A' option is playing the announcement file allow the caller and peer to exchange COLP update frames. ASTERISK-25423 Reported by: John Hardin Change-Id: Iac6cf89b56d26452c6bb88e9363622bbf23895f9 --- apps/app_dial.c | 50 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 17 deletions(-) (limited to 'apps/app_dial.c') diff --git a/apps/app_dial.c b/apps/app_dial.c index 6461c4003..945e01e27 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -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); } -- cgit v1.2.3