[Asterisk-code-review] AMI: Add AMI event to expose hook flash events (asterisk[16])

Joshua Colp asteriskteam at digium.com
Wed May 19 08:02:48 CDT 2021


Joshua Colp has submitted this change. ( https://gerrit.asterisk.org/c/asterisk/+/15901 )

Change subject: AMI: Add AMI event to expose hook flash events
......................................................................

AMI: Add AMI event to expose hook flash events

Although Asterisk can receive and propogate flash events, it currently
provides no mechanism for doing anything with them itself.

This AMI event allows flash events to be processed by Asterisk.
Additionally, AST_CONTROL_FLASH is included in a switch statement
in channel.c to avoid throwing a warning when we shouldn't.

ASTERISK-29380

Change-Id: Ie17ffe65086e0282c88542e38eed6a461ec79e81
---
M configs/samples/stasis.conf.sample
A doc/CHANGES-staging/flash_ami_event.txt
M include/asterisk/stasis_channels.h
M main/channel.c
M main/manager_channels.c
M main/stasis.c
M main/stasis_channels.c
7 files changed, 44 insertions(+), 0 deletions(-)

Approvals:
  Joshua Colp: Looks good to me, but someone else must approve; Approved for Submit
  George Joseph: Looks good to me, approved



diff --git a/configs/samples/stasis.conf.sample b/configs/samples/stasis.conf.sample
index 46a240e..6fadc74 100644
--- a/configs/samples/stasis.conf.sample
+++ b/configs/samples/stasis.conf.sample
@@ -53,6 +53,7 @@
 ; decline=ast_channel_hangup_request_type
 ; decline=ast_channel_dtmf_begin_type
 ; decline=ast_channel_dtmf_end_type
+; decline=ast_channel_flash_type
 ; decline=ast_channel_hold_type
 ; decline=ast_channel_unhold_type
 ; decline=ast_channel_chanspy_start_type
diff --git a/doc/CHANGES-staging/flash_ami_event.txt b/doc/CHANGES-staging/flash_ami_event.txt
new file mode 100644
index 0000000..4cbea80
--- /dev/null
+++ b/doc/CHANGES-staging/flash_ami_event.txt
@@ -0,0 +1,3 @@
+Subject: AMI Flash event
+
+Hook flash events are now exposed as AMI events.
diff --git a/include/asterisk/stasis_channels.h b/include/asterisk/stasis_channels.h
index 0efefa7..f0e5e47 100644
--- a/include/asterisk/stasis_channels.h
+++ b/include/asterisk/stasis_channels.h
@@ -417,6 +417,13 @@
 struct stasis_message_type *ast_channel_dtmf_end_type(void);
 
 /*!
+ * \brief Message type for when a hook flash occurs on a channel.
+ *
+ * \retval A stasis message type
+ */
+struct stasis_message_type *ast_channel_flash_type(void);
+
+/*!
  * \since 12
  * \brief Message type for when a channel is placed on hold.
  *
diff --git a/main/channel.c b/main/channel.c
index 9154a2c..f27a0a3 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -3327,6 +3327,7 @@
 				case AST_CONTROL_UPDATE_RTP_PEER:
 				case AST_CONTROL_HOLD:
 				case AST_CONTROL_UNHOLD:
+				case AST_CONTROL_FLASH:
 				case -1:
 					/* Unimportant */
 					break;
@@ -3405,6 +3406,11 @@
 	ast_channel_publish_cached_blob(chan, ast_channel_dtmf_end_type(), blob);
 }
 
+static void send_flash_event(struct ast_channel *chan)
+{
+	ast_channel_publish_blob(chan, ast_channel_flash_type(), NULL);
+}
+
 static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
 {
 	struct ast_generator *generator;
@@ -3871,6 +3877,8 @@
 				 */
 				ast_frfree(f);
 				f = &ast_null_frame;
+			} else if (f->subclass.integer == AST_CONTROL_FLASH) {
+				send_flash_event(chan);
 			}
 			break;
 		case AST_FRAME_DTMF_END:
diff --git a/main/manager_channels.c b/main/manager_channels.c
index 9bc51ed..943e9f4 100644
--- a/main/manager_channels.c
+++ b/main/manager_channels.c
@@ -985,6 +985,24 @@
 		digit, duration_ms, direction);
 }
 
+static void channel_flash_cb(void *data, struct stasis_subscription *sub,
+	struct stasis_message *message)
+{
+	struct ast_channel_blob *obj = stasis_message_data(message);
+	struct ast_str *channel_event_string;
+
+	channel_event_string = ast_manager_build_channel_state_string(obj->snapshot);
+	if (!channel_event_string) {
+		return;
+	}
+
+	manager_event(EVENT_FLAG_CALL, "Flash",
+		"%s",
+		ast_str_buffer(channel_event_string));
+
+	ast_free(channel_event_string);
+}
+
 static void channel_hangup_handler_cb(void *data, struct stasis_subscription *sub,
 		struct stasis_message *message)
 {
@@ -1345,6 +1363,9 @@
 		ast_channel_dtmf_end_type(), channel_dtmf_end_cb, NULL);
 
 	ret |= stasis_message_router_add(message_router,
+		ast_channel_flash_type(), channel_flash_cb, NULL);
+
+	ret |= stasis_message_router_add(message_router,
 		ast_channel_hangup_request_type(), channel_hangup_request_cb,
 		NULL);
 
diff --git a/main/stasis.c b/main/stasis.c
index e0c0446..30567ab 100644
--- a/main/stasis.c
+++ b/main/stasis.c
@@ -120,6 +120,7 @@
 							<enum name="ast_channel_hangup_request_type" />
 							<enum name="ast_channel_dtmf_begin_type" />
 							<enum name="ast_channel_dtmf_end_type" />
+							<enum name="ast_channel_flash_type" />
 							<enum name="ast_channel_hold_type" />
 							<enum name="ast_channel_unhold_type" />
 							<enum name="ast_channel_chanspy_start_type" />
diff --git a/main/stasis_channels.c b/main/stasis_channels.c
index e97806c..1da2db5 100644
--- a/main/stasis_channels.c
+++ b/main/stasis_channels.c
@@ -1307,6 +1307,7 @@
 STASIS_MESSAGE_TYPE_DEFN(ast_channel_unhold_type,
 	.to_json = unhold_to_json,
 	);
+STASIS_MESSAGE_TYPE_DEFN(ast_channel_flash_type);
 STASIS_MESSAGE_TYPE_DEFN(ast_channel_chanspy_start_type);
 STASIS_MESSAGE_TYPE_DEFN(ast_channel_chanspy_stop_type);
 STASIS_MESSAGE_TYPE_DEFN(ast_channel_fax_type);
@@ -1351,6 +1352,7 @@
 	STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_masquerade_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_dtmf_begin_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_dtmf_end_type);
+	STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_flash_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_hold_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_unhold_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(ast_channel_chanspy_start_type);
@@ -1405,6 +1407,7 @@
 	res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_masquerade_type);
 	res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_dtmf_begin_type);
 	res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_dtmf_end_type);
+	res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_flash_type);
 	res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_hold_type);
 	res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_unhold_type);
 	res |= STASIS_MESSAGE_TYPE_INIT(ast_channel_chanspy_start_type);

-- 
To view, visit https://gerrit.asterisk.org/c/asterisk/+/15901
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 16
Gerrit-Change-Id: Ie17ffe65086e0282c88542e38eed6a461ec79e81
Gerrit-Change-Number: 15901
Gerrit-PatchSet: 4
Gerrit-Owner: N A <mail at interlinked.x10host.com>
Gerrit-Reviewer: Friendly Automation
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Joshua Colp <jcolp at sangoma.com>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20210519/e79834e3/attachment-0001.html>


More information about the asterisk-code-review mailing list