From 4a567cee3aac73102bcfa93f21c29b633746db46 Mon Sep 17 00:00:00 2001
From: Alexei Gradinari <alex2grad@gmail.com>
Date: Wed, 26 Sep 2018 16:05:59 -0400
Subject: [PATCH] app_dial/queue/followme: 'I' options to block initial updates
 in both directions

The 'I' option currently blocks initial CONNECTEDLINE or REDIRECTING updates
from the called parties to the caller.

This patch also blocks updates in the other direction before call is
answered.

ASTERISK-27980

Change-Id: I6ce9e151a2220ce9e95aa66666933cfb9e2a4a01
---
 apps/app_dial.c     |  8 ++++++++
 apps/app_followme.c | 10 +++++-----
 apps/app_queue.c    |  8 ++++++++
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/apps/app_dial.c b/apps/app_dial.c
index e4689e1108..21d37ebacc 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1733,12 +1733,20 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
 						ast_indicate(o->chan, f->subclass.integer);
 						break;
 					case AST_CONTROL_CONNECTED_LINE:
+						if (ast_test_flag64(o, OPT_IGNORE_CONNECTEDLINE)) {
+							ast_verb(3, "Connected line update to %s prevented.\n", ast_channel_name(o->chan));
+							break;
+						}
 						if (ast_channel_connected_line_sub(in, o->chan, f, 1) &&
 							ast_channel_connected_line_macro(in, o->chan, f, 0, 1)) {
 							ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
 						}
 						break;
 					case AST_CONTROL_REDIRECTING:
+						if (ast_test_flag64(o, OPT_IGNORE_CONNECTEDLINE)) {
+							ast_verb(3, "Redirecting update to %s prevented.\n", ast_channel_name(o->chan));
+							break;
+						}
 						if (ast_channel_redirecting_sub(in, o->chan, f, 1) &&
 							ast_channel_redirecting_macro(in, o->chan, f, 0, 1)) {
 							ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
diff --git a/apps/app_followme.c b/apps/app_followme.c
index dbb11ee26e..9aef039b10 100644
--- a/apps/app_followme.c
+++ b/apps/app_followme.c
@@ -915,6 +915,11 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
 						/* Ignore going off hook and flash */
 						break;
 					case AST_CONTROL_CONNECTED_LINE:
+						if (ast_test_flag(&tpargs->followmeflags, FOLLOWMEFLAG_IGNORE_CONNECTEDLINE)) {
+							ast_verb(3, "Connected line update from %s prevented.\n",
+								ast_channel_name(winner));
+							break;
+						}
 						if (!tmpuser) {
 							/*
 							 * Hold connected line update from caller until we have a
@@ -930,11 +935,6 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
 								tpargs->pending_in_connected_update = 1;
 							}
 							ast_party_connected_line_free(&connected);
-							break;
-						}
-						if (ast_test_flag(&tpargs->followmeflags, FOLLOWMEFLAG_IGNORE_CONNECTEDLINE)) {
-							ast_verb(3, "Connected line update from %s prevented.\n",
-								ast_channel_name(winner));
 						} else {
 							ast_verb(3,
 								"%s connected line has changed. Saving it until answer.\n",
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 1ddf79f707..80c253f224 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -5429,12 +5429,20 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
 				case AST_FRAME_CONTROL:
 					switch (f->subclass.integer) {
 					case AST_CONTROL_CONNECTED_LINE:
+						if (o->block_connected_update) {
+							ast_verb(3, "Connected line update to %s prevented.\n", ast_channel_name(o->chan));
+							break;
+						}
 						if (ast_channel_connected_line_sub(in, o->chan, f, 1) &&
 							ast_channel_connected_line_macro(in, o->chan, f, 0, 1)) {
 							ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
 						}
 						break;
 					case AST_CONTROL_REDIRECTING:
+						if (o->block_connected_update) {
+							ast_verb(3, "Redirecting update to %s prevented.\n", ast_channel_name(o->chan));
+							break;
+						}
 						if (ast_channel_redirecting_sub(in, o->chan, f, 1) &&
 							ast_channel_redirecting_macro(in, o->chan, f, 0, 1)) {
 							ast_indicate_data(o->chan, f->subclass.integer, f->data.ptr, f->datalen);
-- 
GitLab