summaryrefslogtreecommitdiff
path: root/apps/app_dial.c
diff options
context:
space:
mode:
authorMatt Jordan <mjordan@digium.com>2015-09-29 07:27:02 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-09-29 07:27:02 -0500
commite0d8b6a65dfaf3036684830b3d3fe5a6e92faf92 (patch)
treeb871cf1e5681807339a35efdb4bcf4fc733aabed /apps/app_dial.c
parent360d076dfc9d1e7d7424fa5f3d4cf9f18b01edd0 (diff)
parent1d394774b2affad5252f6b76a0d69087699ff444 (diff)
Merge "app_dial.c: Make 'A' option pass COLP updates."
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 f3f527669..55700e9b3 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);
}