From 15dcaeef82ce4fc013668392838f8ff9e0ec8075 Mon Sep 17 00:00:00 2001
From: Matthew Jordan <mjordan@digium.com>
Date: Fri, 27 Jun 2014 13:50:02 +0000
Subject: [PATCH] res_pjsip: Add ActionID to events created as a result of
 PJSIP AMI actions

A number of various PJSIP AMI actions were failing to parse out and place the
ActionID into their responses. This patch updates the various PJSIP actions
such that the passed in ActionID is emitted on any event list complete events,
as well as any intermediate events created as a result of the action.

#ASTERISK-23947 #close
Reported by: Mark Michelson

Review: https://reviewboard.asterisk.org/r/3675/
........

Merged revisions 417460 from http://svn.asterisk.org/svn/asterisk/branches/12


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@417461 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 include/asterisk/res_pjsip.h          |  2 ++
 res/res_pjsip/pjsip_configuration.c   | 23 +++++++++++++++--------
 res/res_pjsip_outbound_registration.c | 12 +++++++-----
 res/res_pjsip_pubsub.c                | 20 ++++++++++++--------
 res/res_pjsip_registrar.c             | 10 ++++++----
 5 files changed, 42 insertions(+), 25 deletions(-)

diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h
index de654ee8db..4a3a84a8af 100644
--- a/include/asterisk/res_pjsip.h
+++ b/include/asterisk/res_pjsip.h
@@ -1719,6 +1719,8 @@ struct ast_sip_ami {
 	struct mansession *s;
 	/*! Manager message */
 	const struct message *m;
+	/*! Manager Action ID */
+	const char *action_id;
 	/*! user specified argument data */
 	void *arg;
 };
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index ea3326969d..b2ce4fe7ea 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -1024,6 +1024,9 @@ struct ast_str *ast_sip_create_ami_event(const char *event, struct ast_sip_ami *
 	}
 
 	ast_str_set(&buf, 0, "Event: %s\r\n", event);
+	if (!ast_strlen_zero(ami->action_id)) {
+		ast_str_append(&buf, 0, "ActionID: %s\r\n", ami->action_id);
+	}
 	return buf;
 }
 
@@ -1104,7 +1107,7 @@ static int format_ami_endpoint(const struct ast_sip_endpoint *endpoint,
 
 static int ami_show_endpoint(struct mansession *s, const struct message *m)
 {
-	struct ast_sip_ami ami = { .s = s, .m = m };
+	struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
 	RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
 	const char *endpoint_name = astman_get_header(m, "Endpoint");
 	int count = 0;
@@ -1136,9 +1139,11 @@ static int ami_show_endpoint(struct mansession *s, const struct message *m)
 			endpoint_name);
 	}
 
-	astman_append(s,
-		      "Event: EndpointDetailComplete\r\n"
-		      "EventList: Complete\r\n"
+	astman_append(s, "Event: EndpointDetailComplete\r\n");
+	if (!ast_strlen_zero(ami.action_id)) {
+		astman_append(s, "ActionID: %s\r\n", ami.action_id);
+	}
+	astman_append(s, "EventList: Complete\r\n"
 		      "ListItems: %d\r\n\r\n", count + 1);
 	return 0;
 }
@@ -1197,7 +1202,7 @@ static int format_ami_endpoints(void *obj, void *arg, int flags)
 
 static int ami_show_endpoints(struct mansession *s, const struct message *m)
 {
-	struct ast_sip_ami ami = { .s = s, .m = m };
+	struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
 	RAII_VAR(struct ao2_container *, endpoints, NULL, ao2_cleanup);
 	int num;
 
@@ -1216,9 +1221,11 @@ static int ami_show_endpoints(struct mansession *s, const struct message *m)
 
 	ao2_callback(endpoints, OBJ_NODATA, format_ami_endpoints, &ami);
 
-	astman_append(s,
-		      "Event: EndpointListComplete\r\n"
-		      "EventList: Complete\r\n"
+	astman_append(s, "Event: EndpointListComplete\r\n");
+	if (!ast_strlen_zero(ami.action_id)) {
+		astman_append(s, "ActionID: %s\r\n", ami.action_id);
+	}
+	astman_append(s, "EventList: Complete\r\n"
 		      "ListItems: %d\r\n\r\n", num);
 	return 0;
 }
diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c
index 7002a13cdb..bf03094f75 100644
--- a/res/res_pjsip_outbound_registration.c
+++ b/res/res_pjsip_outbound_registration.c
@@ -1102,7 +1102,7 @@ static int ami_outbound_registration_detail(void *obj, void *arg, int flags)
 static int ami_show_outbound_registrations(struct mansession *s,
 					   const struct message *m)
 {
-	struct ast_sip_ami ami = { .s = s, .m = m };
+	struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
 	struct sip_ami_outbound ami_outbound = { .ami = &ami };
 	RAII_VAR(struct ao2_container *, regs, ast_sorcery_retrieve_by_fields(
 			 ast_sip_get_sorcery(), "registration", AST_RETRIEVE_FLAG_MULTIPLE |
@@ -1119,9 +1119,11 @@ static int ami_show_outbound_registrations(struct mansession *s,
 
 	ao2_callback(regs, OBJ_NODATA, ami_outbound_registration_detail, &ami_outbound);
 
-	astman_append(s,
-		      "Event: OutboundRegistrationDetailComplete\r\n"
-		      "EventList: Complete\r\n"
+	astman_append(s, "Event: OutboundRegistrationDetailComplete\r\n");
+	if (!ast_strlen_zero(ami.action_id)) {
+		astman_append(s, "ActionID: %s\r\n", ami.action_id);
+	}
+	astman_append(s, "EventList: Complete\r\n"
 		      "Registered: %d\r\n"
 		      "NotRegistered: %d\r\n\r\n",
 		      ami_outbound.registered,
@@ -1259,7 +1261,7 @@ static int load_module(void)
 	sip_outbound_registration_perform_all();
 
 	ast_manager_register_xml("PJSIPUnregister", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, ami_unregister);
-	ast_manager_register_xml("PJSIPShowRegistrationsOutbound", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING,ami_show_outbound_registrations);
+	ast_manager_register_xml("PJSIPShowRegistrationsOutbound", EVENT_FLAG_SYSTEM | EVENT_FLAG_REPORTING, ami_show_outbound_registrations);
 
 	cli_formatter = ao2_alloc(sizeof(struct ast_sip_cli_formatter_entry), NULL);
 	if (!cli_formatter) {
diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c
index 39846823e4..9032bd3f62 100644
--- a/res/res_pjsip_pubsub.c
+++ b/res/res_pjsip_pubsub.c
@@ -1966,7 +1966,7 @@ static int ami_subscription_detail_outbound(struct ast_sip_subscription *sub, vo
 
 static int ami_show_subscriptions_inbound(struct mansession *s, const struct message *m)
 {
-	struct ast_sip_ami ami = { .s = s, .m = m };
+	struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
 	int num;
 
 	astman_send_listack(s, m, "Following are Events for "
@@ -1974,16 +1974,18 @@ static int ami_show_subscriptions_inbound(struct mansession *s, const struct mes
 
 	num = for_each_subscription(ami_subscription_detail_inbound, &ami);
 
-	astman_append(s,
-		      "Event: InboundSubscriptionDetailComplete\r\n"
-		      "EventList: Complete\r\n"
+	astman_append(s, "Event: InboundSubscriptionDetailComplete\r\n");
+	if (!ast_strlen_zero(ami.action_id)) {
+		astman_append(s, "ActionID: %s\r\n", ami.action_id);
+	}
+	astman_append(s, "EventList: Complete\r\n"
 		      "ListItems: %d\r\n\r\n", num);
 	return 0;
 }
 
 static int ami_show_subscriptions_outbound(struct mansession *s, const struct message *m)
 {
-	struct ast_sip_ami ami = { .s = s, .m = m };
+	struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
 	int num;
 
 	astman_send_listack(s, m, "Following are Events for "
@@ -1991,9 +1993,11 @@ static int ami_show_subscriptions_outbound(struct mansession *s, const struct me
 
 	num = for_each_subscription(ami_subscription_detail_outbound, &ami);
 
-	astman_append(s,
-		      "Event: OutboundSubscriptionDetailComplete\r\n"
-		      "EventList: Complete\r\n"
+	astman_append(s, "Event: OutboundSubscriptionDetailComplete\r\n");
+	if (!ast_strlen_zero(ami.action_id)) {
+		astman_append(s, "ActionID: %s\r\n", ami.action_id);
+	}
+	astman_append(s, "EventList: Complete\r\n"
 		      "ListItems: %d\r\n\r\n", num);
 	return 0;
 }
diff --git a/res/res_pjsip_registrar.c b/res/res_pjsip_registrar.c
index 962895b608..f7d082c18d 100644
--- a/res/res_pjsip_registrar.c
+++ b/res/res_pjsip_registrar.c
@@ -765,15 +765,17 @@ static int ami_registrations_endpoints(void *arg)
 static int ami_show_registrations(struct mansession *s, const struct message *m)
 {
 	int count = 0;
-	struct ast_sip_ami ami = { .s = s, .m = m, .arg = &count };
+	struct ast_sip_ami ami = { .s = s, .m = m, .arg = &count, .action_id = astman_get_header(m, "ActionID"), };
 	astman_send_listack(s, m, "Following are Events for each Inbound "
 			    "registration", "start");
 
 	ami_registrations_endpoints(&ami);
 
-	astman_append(s,
-		      "Event: InboundRegistrationDetailComplete\r\n"
-		      "EventList: Complete\r\n"
+	astman_append(s, "Event: InboundRegistrationDetailComplete\r\n");
+	if (!ast_strlen_zero(ami.action_id)) {
+		astman_append(s, "ActionID: %s\r\n", ami.action_id);
+	}
+	astman_append(s, "EventList: Complete\r\n"
 		      "ListItems: %d\r\n\r\n", count);
 	return 0;
 }
-- 
GitLab