[svn-commits] mmichelson: branch mmichelson/subscription_abstraction r416435 - in /team/mmi...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Jun 16 16:17:00 CDT 2014


Author: mmichelson
Date: Mon Jun 16 16:16:53 2014
New Revision: 416435

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=416435
Log:
Necessary changes for MWI tests to pass.

* Make sure the exports file has new API calls added.
* Change the real and virtual subscriptions not to be pointers.
* Be sure to return early if returning a failure response to a subscription.
* Validate MWI resource integrity before responding to SUBSCRIBE.


Modified:
    team/mmichelson/subscription_abstraction/include/asterisk/res_pjsip_pubsub.h
    team/mmichelson/subscription_abstraction/res/res_pjsip_mwi.c
    team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.c
    team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.exports.in

Modified: team/mmichelson/subscription_abstraction/include/asterisk/res_pjsip_pubsub.h
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/subscription_abstraction/include/asterisk/res_pjsip_pubsub.h?view=diff&rev=416435&r1=416434&r2=416435
==============================================================================
--- team/mmichelson/subscription_abstraction/include/asterisk/res_pjsip_pubsub.h (original)
+++ team/mmichelson/subscription_abstraction/include/asterisk/res_pjsip_pubsub.h Mon Jun 16 16:16:53 2014
@@ -243,8 +243,6 @@
 };
 
 struct ast_sip_subscriber {
-	/*! The types of body this subscriber accepts. */
-	const char *accept[AST_SIP_MAX_ACCEPT];
 	/*!
 	 * \brief A NOTIFY has been received.
 	 *
@@ -264,6 +262,8 @@
 struct ast_sip_subscription_handler {
 	/*! The name of the event this subscriber deals with */
 	const char *event_name;
+	/*! The types of body this subscriber accepts. */
+	const char *accept[AST_SIP_MAX_ACCEPT];
 	/*!
 	 * \brief Called when a subscription is to be destroyed
 	 *

Modified: team/mmichelson/subscription_abstraction/res/res_pjsip_mwi.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/subscription_abstraction/res/res_pjsip_mwi.c?view=diff&rev=416435&r1=416434&r2=416435
==============================================================================
--- team/mmichelson/subscription_abstraction/res/res_pjsip_mwi.c (original)
+++ team/mmichelson/subscription_abstraction/res/res_pjsip_mwi.c Mon Jun 16 16:16:53 2014
@@ -63,6 +63,7 @@
 
 static struct ast_sip_subscription_handler mwi_handler = {
 	.event_name = "message-summary",
+	.accept = { MWI_TYPE"/"MWI_SUBTYPE, },
 	.subscription_shutdown = mwi_subscription_shutdown,
 	.to_ami = mwi_to_ami,
 	.notifier = &mwi_notifier,
@@ -610,54 +611,68 @@
 	struct mwi_subscription *sub;
 
 	if (!aor) {
+		/*! I suppose it's possible for the AOR to disappear on us
+		 * between accepting the subscription and sending the first
+		 * NOTIFY...
+		 */
 		ast_log(LOG_WARNING, "Unable to locate aor %s. MWI "
 			"subscription failed.\n", name);
 		return NULL;
 	}
 
+	if (!(sub = mwi_create_subscription(endpoint, sip_sub))) {
+		return NULL;
+	}
+
+	mwi_on_aor(aor, sub, 0);
+	return sub;
+}
+
+static struct mwi_subscription *mwi_subscribe_all(
+	struct ast_sip_endpoint *endpoint, struct ast_sip_subscription *sip_sub)
+{
+	struct mwi_subscription *sub;
+
+	sub = mwi_create_subscription(endpoint, sip_sub);
+
+	if (!sub) {
+		return NULL;
+	}
+
+	ast_sip_for_each_aor(endpoint->aors, mwi_on_aor, sub);
+	return sub;
+}
+
+static int mwi_new_subscribe(struct ast_sip_endpoint *endpoint,
+		const char *resource)
+{
+	struct ast_sip_aor *aor;
+
+	if (ast_strlen_zero(resource)) {
+		if (ast_sip_for_each_aor(endpoint->aors, mwi_validate_for_aor, endpoint)) {
+			return 500;
+		}
+		return 200;
+	}
+
+	aor = ast_sip_location_retrieve_aor(resource);
+	
+	if (!aor) {
+		ast_log(LOG_WARNING, "Unable to locate aor %s. MWI "
+			"subscription failed.\n", resource);
+		return 404;
+	}
+
 	if (ast_strlen_zero(aor->mailboxes)) {
 		ast_log(LOG_WARNING, "AOR %s has no configured mailboxes. "
-			"MWI subscription failed\n", name);
-		return NULL;
+			"MWI subscription failed\n", resource);
+		return 404;
 	}
 
 	if (mwi_validate_for_aor(aor, endpoint, 0)) {
-		return NULL;
-	}
-
-	if (!(sub = mwi_create_subscription(endpoint, sip_sub))) {
-		return NULL;
-	}
-
-	mwi_on_aor(aor, sub, 0);
-	return sub;
-}
-
-static struct mwi_subscription *mwi_subscribe_all(
-	struct ast_sip_endpoint *endpoint, struct ast_sip_subscription *sip_sub)
-{
-	struct mwi_subscription *sub;
-
-	if (ast_sip_for_each_aor(endpoint->aors, mwi_validate_for_aor, endpoint)) {
-		return NULL;
-	}
-
-	sub = mwi_create_subscription(endpoint, sip_sub);
-
-	if (!sub) {
-		return NULL;
-	}
-
-	ast_sip_for_each_aor(endpoint->aors, mwi_on_aor, sub);
-	return sub;
-}
-
-static int mwi_new_subscribe(struct ast_sip_endpoint *endpoint,
-		const char *resource)
-{
-	/* The MWI notifier does not care what resource is being subscribed to. We'll happily
-	 * accept whatever resource is thrown our way.
-	 */
+		return 500;
+	}
+
 	return 200;
 }
 

Modified: team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.c?view=diff&rev=416435&r1=416434&r2=416435
==============================================================================
--- team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.c (original)
+++ team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.c Mon Jun 16 16:16:53 2014
@@ -296,8 +296,8 @@
 	enum sip_subscription_type type;
 	/*! Real and virtual components of the subscription */
 	union {
-		struct ast_sip_real_subscription *real;
-		struct ast_sip_virtual_subscription *virtual;
+		struct ast_sip_real_subscription real;
+		struct ast_sip_virtual_subscription virtual;
 	} pants;
 	/*! Body generaator for NOTIFYs */
 	struct ast_sip_pubsub_body_generator *body_generator;
@@ -323,12 +323,12 @@
 
 static pjsip_evsub *sip_subscription_get_evsub(struct ast_sip_subscription *sub)
 {
-	return sub->pants.real->evsub;
+	return sub->pants.real.evsub;
 }
 
 static pjsip_dialog *sip_subscription_get_dlg(struct ast_sip_subscription *sub)
 {
-	return sub->pants.real->dlg;
+	return sub->pants.real.dlg;
 }
 
 /*! \brief Destructor for subscription persistence */
@@ -771,6 +771,7 @@
 	struct subscription_persistence *persistence;
 	size_t resource_size;
 	pjsip_sip_uri *request_uri;
+	struct pjsip_evsub *evsub;
 
 	request_uri = pjsip_uri_get_uri(rdata->msg_info.msg->line.req.uri);
 	resource_size = pj_strlen(&request_uri->user) + 1;
@@ -813,12 +814,13 @@
 		dlg->remote.cseq = persistence->cseq;
 	}
 
-	pjsip_evsub_create_uas(dlg, &pubsub_cb, rdata, 0, &sub->pants.real->evsub);
+	pjsip_evsub_create_uas(dlg, &pubsub_cb, rdata, 0, &evsub);
+	sub->pants.real.evsub = evsub;
 	/* We keep a reference to the dialog until our subscription is destroyed. See
 	 * the subscription_destructor for more details
 	 */
 	pjsip_dlg_inc_session(dlg, &pubsub_module);
-	sub->pants.real->dlg = dlg;
+	sub->pants.real.dlg = dlg;
 	ast_sip_dialog_set_serializer(dlg, sub->serializer);
 	pjsip_evsub_set_mod_data(sip_subscription_get_evsub(sub), pubsub_module.id, sub);
 	sub->endpoint = ao2_bump(endpoint);
@@ -869,12 +871,12 @@
 	}
 
 	pj_cstr(&event, handler->event_name);
-	pjsip_evsub_create_uac(dlg, &pubsub_cb, &event, 0, &sub->pants.real->evsub);
+	pjsip_evsub_create_uac(dlg, &pubsub_cb, &event, 0, &sub->pants.real.evsub);
 	/* We keep a reference to the dialog until our subscription is destroyed. See
 	 * the subscription_destructor for more details
 	 */
 	pjsip_dlg_inc_session(dlg, &pubsub_module);
-	sub->pants.real->dlg = dlg;
+	sub->pants.real.dlg = dlg;
 	ast_sip_dialog_set_serializer(dlg, sub->serializer);
 	pjsip_evsub_set_mod_data(sip_subscription_get_evsub(sub), pubsub_module.id, sub);
 	ao2_ref(endpoint, +1);
@@ -931,6 +933,7 @@
 	struct ast_str *body_text = ast_str_create(64);
 	pjsip_evsub *evsub = sip_subscription_get_evsub(sub);
 	pjsip_tx_data *tdata;
+	pjsip_evsub_state state = pjsip_evsub_get_state(evsub);
 
 	if (!body_text) {
 		return -1;
@@ -943,7 +946,11 @@
 
 	body.body_text = ast_str_buffer(body_text);
 
-	if (pjsip_evsub_notify(evsub, pjsip_evsub_get_state(evsub), NULL, NULL, &tdata) != PJ_SUCCESS) {
+	state = state <= PJSIP_EVSUB_STATE_ACTIVE ? PJSIP_EVSUB_STATE_ACTIVE : PJSIP_EVSUB_STATE_TERMINATED;
+
+	ast_log_backtrace();
+
+	if (pjsip_evsub_notify(evsub, state, NULL, NULL, &tdata) != PJ_SUCCESS) {
 		ast_free(body_text);
 		return -1;
 	}
@@ -1184,10 +1191,8 @@
 		return -1;
 	}
 
-	if (handler->subscriber) {
-		for (i = 0; i < AST_SIP_MAX_ACCEPT && !ast_strlen_zero(handler->subscriber->accept[i]); ++i) {
-			pj_cstr(&accept[i], handler->subscriber->accept[i]);
-		}
+	for (i = 0; i < AST_SIP_MAX_ACCEPT && !ast_strlen_zero(handler->accept[i]); ++i) {
+		pj_cstr(&accept[i], handler->accept[i]);
 	}
 
 	pj_cstr(&event, handler->event_name);
@@ -1322,6 +1327,7 @@
 	resp = handler->notifier->new_subscribe(endpoint, resource);
 	if (resp < 200 || resp >= 300) {
 		pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, resp, NULL, NULL, NULL);
+		return PJ_TRUE;
 	}
 	sub = notifier_create_subscription(handler, endpoint, rdata);
 	if (!sub) {

Modified: team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.exports.in
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.exports.in?view=diff&rev=416435&r1=416434&r2=416435
==============================================================================
--- team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.exports.in (original)
+++ team/mmichelson/subscription_abstraction/res/res_pjsip_pubsub.exports.in Mon Jun 16 16:16:53 2014
@@ -1,7 +1,7 @@
 {
 	global:
 		LINKER_SYMBOL_PREFIXast_sip_create_subscription;
-		LINKER_SYMBOL_PREFIXast_sip_subsription_get_endpoint;
+		LINKER_SYMBOL_PREFIXast_sip_subscription_get_endpoint;
 		LINKER_SYMBOL_PREFIXast_sip_subscription_get_serializer;
 		LINKER_SYMBOL_PREFIXast_sip_subscription_get_evsub;
 		LINKER_SYMBOL_PREFIXast_sip_subscription_get_dlg;
@@ -30,6 +30,10 @@
 		LINKER_SYMBOL_PREFIXast_sip_pubsub_generate_body_content;
 		LINKER_SYMBOL_PREFIXast_sip_subscription_get_body_type;
 		LINKER_SYMBOL_PREFIXast_sip_subscription_get_body_subtype;
+		LINKER_SYMBOL_PREFIXast_sip_subscription_get_resource_name;
+		LINKER_SYMBOL_PREFIXast_sip_subscription_notify;
+		LINKER_SYMBOL_PREFIXast_sip_subscription_get_local_uri;
+		LINKER_SYMBOL_PREFIXast_sip_subscription_get_remote_uri;
 	local:
 		*;
 };




More information about the svn-commits mailing list