diff options
author | Richard Mudgett <rmudgett@digium.com> | 2015-09-24 13:27:44 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2015-09-25 12:40:31 -0500 |
commit | 1d394774b2affad5252f6b76a0d69087699ff444 (patch) | |
tree | 1bb23dbfa21650bb300ec19ae8179a8be98d0b34 /apps/app_dial.c | |
parent | 680b76eb2541229f6bd2261c55960e7174314ed3 (diff) |
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
Diffstat (limited to 'apps/app_dial.c')
-rw-r--r-- | apps/app_dial.c | 50 |
1 files changed, 33 insertions, 17 deletions
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); } |