summaryrefslogtreecommitdiff
path: root/apps/app_dial.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2015-09-24 13:27:44 -0500
committerRichard Mudgett <rmudgett@digium.com>2015-09-25 12:40:31 -0500
commit1d394774b2affad5252f6b76a0d69087699ff444 (patch)
tree1bb23dbfa21650bb300ec19ae8179a8be98d0b34 /apps/app_dial.c
parent680b76eb2541229f6bd2261c55960e7174314ed3 (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.c50
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);
}