summaryrefslogtreecommitdiff
path: root/apps/app_dial.c
diff options
context:
space:
mode:
authorMatt Jordan <mjordan@digium.com>2015-09-29 07:26:58 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-09-29 07:26:58 -0500
commit549d7260653bac4604d5dcf3dd4a9d6409a92210 (patch)
treeb44154de9645997341a3c8e58db460fee237bdb6 /apps/app_dial.c
parent5efb96520b973c445183dfd3edd358cbb5f78828 (diff)
parente36b5f1e8e1fd1e805184fca015bb0808b5e7fb8 (diff)
Merge "app_dial.c: Make 'A' option pass COLP updates." into 13
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 bd9f37e96..6c8501d6e 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);
}