[svn-commits] kharwell: branch kharwell/pimp_sip_state r388722 - in /team/kharwell/pimp_sip...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue May 14 15:29:14 CDT 2013


Author: kharwell
Date: Tue May 14 15:29:13 2013
New Revision: 388722

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=388722
Log:
changed xpidf provider to use pjxpidf.  updated pubsub to check for function callback before calling

Modified:
    team/kharwell/pimp_sip_state/res/res_sip_exten_state.c
    team/kharwell/pimp_sip_state/res/res_sip_providers/res_sip_pidf.c
    team/kharwell/pimp_sip_state/res/res_sip_pubsub.c

Modified: team/kharwell/pimp_sip_state/res/res_sip_exten_state.c
URL: http://svnview.digium.com/svn/asterisk/team/kharwell/pimp_sip_state/res/res_sip_exten_state.c?view=diff&rev=388722&r1=388721&r2=388722
==============================================================================
--- team/kharwell/pimp_sip_state/res/res_sip_exten_state.c (original)
+++ team/kharwell/pimp_sip_state/res/res_sip_exten_state.c Tue May 14 15:29:13 2013
@@ -486,14 +486,11 @@
 	ast_copy_pj_str(exten_state_sub->exten, &sip_uri->user, sizeof(exten_state_sub->exten));
 
 	if ((exten_state_sub->id = ast_extension_state_add(exten_state_sub->context, exten_state_sub->exten,
-						state_changed, exten_state_sub)) < 0) {
+							   state_changed, exten_state_sub)) < 0) {
 		ast_log(LOG_WARNING, "Unable to subscribe extension %s\n",
 			exten_state_sub->exten);
 		return NULL;
 	}
-
-	/* bump the ref since ast_extension_state_add holds a reference */
-	ao2_ref(exten_state_sub, +1);
 
 	if (add_datastore(exten_state_sub)) {
 		ast_log(LOG_WARNING, "Unable to add to subscription datastore.\n");
@@ -507,6 +504,8 @@
 	}
 
 	send_notify(exten_state_sub, NULL, PJSIP_EVSUB_STATE_ACTIVE);
+	/* bump the ref since ast_extension_state_add holds a reference */
+	ao2_ref(exten_state_sub, +1);
 	return exten_state_sub->sip_sub;
 }
 

Modified: team/kharwell/pimp_sip_state/res/res_sip_providers/res_sip_pidf.c
URL: http://svnview.digium.com/svn/asterisk/team/kharwell/pimp_sip_state/res/res_sip_providers/res_sip_pidf.c?view=diff&rev=388722&r1=388721&r2=388722
==============================================================================
--- team/kharwell/pimp_sip_state/res/res_sip_providers/res_sip_pidf.c (original)
+++ team/kharwell/pimp_sip_state/res/res_sip_providers/res_sip_pidf.c Tue May 14 15:29:13 2013
@@ -25,11 +25,15 @@
  ***/
 
 #include "asterisk.h"
+
+#include <pjsip.h>
+#include <pjsip_simple.h>
+#include <pjlib.h>
+
+#include "asterisk/res_sip.h"
 #include "asterisk/res_sip_exten_state.h"
 #include "include/res_sip_providers.h"
 
-#include <pjsip_simple.h>
-#include <pjlib.h>
 
 enum state {
 	NOTIFY_OPEN,
@@ -83,57 +87,20 @@
 	}
 }
 
-/*! Factory used to initialize memory allocation pool. */
-static pj_caching_pool *caching_pool = NULL;
-
-/*! Pool used for memory allocation. */
-static pj_pool_t *pool = NULL;
-
-static void pool_destructor(void *obj)
-{
-	struct pj_caching_pool *cp = obj;
-	if (cp) {
-		pj_caching_pool_destroy(cp);
-		caching_pool = NULL;
-	}
-}
-
-static void pool_create(void)
-{
-	caching_pool = ao2_alloc(sizeof(*caching_pool), pool_destructor);
-
-	pj_caching_pool_init(caching_pool,
-			     &pj_pool_factory_default_policy, 0);
-
-	if (!(pool = pj_pool_create(&caching_pool->factory, "pidf",
-				    1024, 1024, NULL))) {
-		ast_log(LOG_WARNING, "Failed to create memory pool for PIDF\n");
-		pj_caching_pool_destroy(caching_pool);
-	}
-}
-
-static void pool_ref(int ref)
-{
-	if (!caching_pool) {
-		pool_create();
-	} else {
-		ao2_ref(caching_pool, ref);
-	}
-}
-
-static void add_attr(pj_xml_node *node, const pj_str_t* name,
-		      const pj_str_t* value)
+static pj_xml_attr *create_attr(pj_pool_t *pool, pj_xml_node *node,
+				const char *name, const char *value)
 {
 	pj_xml_attr *attr = PJ_POOL_ALLOC_T(pool, pj_xml_attr);
 
-	pj_strdup(pool, &attr->name, name);
-	pj_strdup(pool, &attr->value, value);
-	attr->value = *value;
+	pj_strdup2(pool, &attr->name, name);
+	pj_strdup2(pool, &attr->value, value);
 
 	pj_xml_add_attr(node, attr);
-}
-
-static pj_xml_node *create_node(const char* name)
+	return attr;
+}
+
+static pj_xml_node *create_node(pj_pool_t *pool, pj_xml_node *parent,
+				const char* name)
 {
 	pj_xml_node *node = PJ_POOL_ALLOC_T(pool, pj_xml_node);
 
@@ -145,7 +112,26 @@
 	node->content.ptr = NULL;
 	node->content.slen = 0;
 
+	pj_xml_add_node(parent, node);
 	return node;
+}
+
+static pj_xml_attr *find_node_attr(pj_pool_t* pool, pj_xml_node *parent,
+				   const char *node_name, const char *attr_name)
+{
+	pj_str_t name;
+	pj_xml_node *node;
+	pj_xml_attr *attr;
+
+	if (!(node = pj_xml_find_node(parent, pj_cstr(&name, node_name)))) {
+		node = create_node(pool, parent, node_name);
+	}
+
+	if (!(attr = pj_xml_find_attr(node, pj_cstr(&name, attr_name), NULL))) {
+		attr = create_attr(pool, node, attr_name, "");
+	}
+
+	return attr;
 }
 
 /*!
@@ -158,33 +144,36 @@
  * supports this format.
 
  */
-static void add_non_standard(pj_xml_node *node, const char *pidfstate)
-{
-	static const pj_str_t XMLNS_PP = { "xmlns:pp", 8 };
-	static const pj_str_t XMLNS_PERSON = { "urn:ietf:params:xml:ns:pidf:person", 34 };
-
-	static const pj_str_t XMLNS_ES = { "xmlns:es", 8 };
-	static const pj_str_t XMLNS_RPID_STATUS = { "urn:ietf:params:xml:ns:pidf:rpid:status:rpid-status", 51 };
-
-	static const pj_str_t XMLNS_EP = { "xmlns:ep", 8 };
-	static const pj_str_t XMLNS_RPID_PERSON = { "urn:ietf:params:xml:ns:pidf:rpid:rpid-person", 44 };
-
-	pj_xml_node *person = create_node("pp:person");
-	pj_xml_node *status = create_node("status");
+static void add_non_standard(pj_pool_t *pool, pj_xml_node *node, const char *pidfstate)
+{
+	static const char *XMLNS_PP = "xmlns:pp";
+	static const char *XMLNS_PERSON = "urn:ietf:params:xml:ns:pidf:person";
+
+	static const char *XMLNS_ES = "xmlns:es";
+	static const char *XMLNS_RPID_STATUS = "urn:ietf:params:xml:ns:pidf:rpid:status:rpid-status";
+
+	static const char *XMLNS_EP = "xmlns:ep";
+	static const char *XMLNS_RPID_PERSON = "urn:ietf:params:xml:ns:pidf:rpid:rpid-person";
+
+	pj_xml_node *person = create_node(pool, node, "pp:person");
+	pj_xml_node *status = create_node(pool, person, "status");
 
 	if (pidfstate[0] != '-') {
-		pj_xml_node *activities = create_node("ep:activities");
+		pj_xml_node *activities = create_node(pool, status, "ep:activities");
 		pj_strdup2(pool, &activities->content, "ep:");
 		pj_strcat2(&activities->content, pidfstate);
-		pj_xml_add_node(status, activities);
-	}
-
-	add_attr(node, &XMLNS_PP, &XMLNS_PERSON);
-	add_attr(node, &XMLNS_ES, &XMLNS_RPID_STATUS);
-	add_attr(node, &XMLNS_EP, &XMLNS_RPID_PERSON);
-
-	pj_xml_add_node(person, status);
-	pj_xml_add_node(node, person);
+	}
+
+	create_attr(pool, node, XMLNS_PP, XMLNS_PERSON);
+	create_attr(pool, node, XMLNS_ES, XMLNS_RPID_STATUS);
+	create_attr(pool, node, XMLNS_EP, XMLNS_RPID_PERSON);
+}
+
+static void release_pool(void *obj)
+{
+	pj_pool_t *pool = obj;
+
+	pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
 }
 
 static int pidf_xml_create_body(struct ast_sip_exten_state_data *data, const char *local,
@@ -192,12 +181,14 @@
 {
 	pjpidf_pres *pres;
 	pjpidf_tuple *tuple;
-
 	pj_str_t entity, note, id, contact, priority;
-
 	char *statestring = NULL, *pidfstate = NULL, *pidfnote = NULL;
 	int local_state, size;
 
+	RAII_VAR(pj_pool_t *, pool,
+		 pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(),
+					 "pidf", 1024, 1024), release_pool);
+
 	exten_state_to_str(data->exten_state, &statestring, &pidfstate,
 			   &pidfnote, &local_state);
 
@@ -206,7 +197,7 @@
 		return -1;
 	}
 
-	add_non_standard(pres, pidfstate);
+	add_non_standard(pool, pres, pidfstate);
 
 	if (!pjpidf_pres_add_note(pool, pres, pj_cstr(&note, pidfnote))) {
 		ast_log(LOG_WARNING, "Unable to add note to PIDF presence\n");
@@ -228,7 +219,6 @@
 		ast_log(LOG_WARNING, "PIDF body text too large\n");
 		return -1;
 	}
-
 	*(ast_str_buffer(*body_text) + size) = '\0';
 	ast_str_update(*body_text);
 
@@ -244,39 +234,62 @@
 
 void ast_sip_register_pidf_xml_provider(void)
 {
-	pool_ref(+1);
 	ast_sip_register_exten_state_provider(&pidf_xml_provider);
 }
 
 void ast_sip_unregister_pidf_xml_provider(void)
 {
 	ast_sip_unregister_exten_state_provider(&pidf_xml_provider);
-	pool_ref(-1);
 }
 
 static int xpidf_xml_create_body(struct ast_sip_exten_state_data *data, const char *local,
 				 const char *remote, struct ast_str **body_text)
 {
+	pjxpidf_pres *pres;
+	pj_xml_attr *attr;
+	pj_str_t name;
 	char *statestring = NULL, *pidfstate = NULL, *pidfnote = NULL;
-	int local_state;
+	int local_state, size;
+
+	RAII_VAR(pj_pool_t *, pool,
+		 pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(),
+					 "pidf", 1024, 1024), release_pool);
 
 	exten_state_to_str(data->exten_state, &statestring, &pidfstate,
 			   &pidfnote, &local_state);
 
-	ast_str_append(body_text, 0,
-		       "<?xml version=\"1.0\"?>\n"
-		       "<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n"
-		       "<presence>\n");
-	ast_str_append(body_text, 0, "<presentity uri=\"%s;method=SUBSCRIBE\" />\n", local);
-	ast_str_append(body_text, 0, "<atom id=\"%s\">\n", data->exten);
-	ast_str_append(body_text, 0, "<address uri=\"%s;user=ip\" priority=\"0.800000\">\n", remote);
-	ast_str_append(body_text, 0, "<status status=\"%s\" />\n",
-		       (local_state ==  NOTIFY_OPEN) ? "open" :
-		       (local_state == NOTIFY_INUSE) ? "inuse" : "closed");
-	ast_str_append(body_text, 0, "<msnsubstatus substatus=\"%s\" />\n",
-		       (local_state == NOTIFY_OPEN) ? "online" :
-		       (local_state == NOTIFY_INUSE) ? "onthephone" : "offline");
-	ast_str_append(body_text, 0, "</address>\n</atom>\n</presence>\n");
+	if (!(pres = pjxpidf_create(pool, pj_cstr(&name, local)))) {
+		ast_log(LOG_WARNING, "Unable to create PIDF presence\n");
+		return -1;
+	}
+
+	attr = find_node_attr(pool, pres, "atom", "id");
+	pj_strdup2(pool, &attr->value, data->exten);
+
+	attr = find_node_attr(pool, pres, "address", "uri");
+	pj_strdup2(pool, &attr->value, remote);
+	pj_strcat2(&attr->value, ";user=ip");
+	create_attr(pool, pj_xml_find_node(pres, pj_cstr(&name, "address")),
+		    "priority", "0.80000");
+
+	attr = find_node_attr(pool, pres, "status", "status");
+	pj_strdup2(pool, &attr->value,
+		   (local_state ==  NOTIFY_OPEN) ? "open" :
+		   (local_state == NOTIFY_INUSE) ? "inuse" : "closed");
+
+	attr = find_node_attr(pool, pres, "msnsubstatus", "substatus");
+	pj_strdup2(pool, &attr->value,
+		   (local_state == NOTIFY_OPEN) ? "online" :
+		   (local_state == NOTIFY_INUSE) ? "onthephone" : "offline");
+
+	if (!(size = pjxpidf_print(pres, ast_str_buffer(*body_text),
+				  ast_str_size(*body_text)))) {
+		ast_log(LOG_WARNING, "XPIDF body text too large\n");
+		return -1;
+	}
+
+	*(ast_str_buffer(*body_text) + size) = '\0';
+	ast_str_update(*body_text);
 
 	return 0;
 }
@@ -290,14 +303,12 @@
 
 void ast_sip_register_xpidf_xml_provider(void)
 {
-	pool_ref(+1);
 	ast_sip_register_exten_state_provider(&xpidf_xml_provider);
 }
 
 void ast_sip_unregister_xpidf_xml_provider(void)
 {
 	ast_sip_unregister_exten_state_provider(&xpidf_xml_provider);
-	pool_ref(-1);
 }
 
 static struct ast_sip_exten_state_provider cpim_pidf_xml_provider = {
@@ -309,12 +320,10 @@
 
 void ast_sip_register_cpim_pidf_xml_provider(void)
 {
-	pool_ref(+1);
 	ast_sip_register_exten_state_provider(&cpim_pidf_xml_provider);
 }
 
 void ast_sip_unregister_cpim_pidf_xml_provider(void)
 {
 	ast_sip_unregister_exten_state_provider(&cpim_pidf_xml_provider);
-	pool_ref(-1);
-}
+}

Modified: team/kharwell/pimp_sip_state/res/res_sip_pubsub.c
URL: http://svnview.digium.com/svn/asterisk/team/kharwell/pimp_sip_state/res/res_sip_pubsub.c?view=diff&rev=388722&r1=388721&r2=388722
==============================================================================
--- team/kharwell/pimp_sip_state/res/res_sip_pubsub.c (original)
+++ team/kharwell/pimp_sip_state/res/res_sip_pubsub.c Tue May 14 15:29:13 2013
@@ -514,7 +514,8 @@
 		return;
 	}
 
-	if (tsx->role == PJSIP_ROLE_UAC && event->body.tsx_state.type == PJSIP_EVENT_RX_MSG) {
+	if (sub->handler->notify_response && tsx->role == PJSIP_ROLE_UAC &&
+	    event->body.tsx_state.type == PJSIP_EVENT_RX_MSG) {
 		sub->handler->notify_response(sub, event->body.tsx_state.src.rdata);
 	}
 }
@@ -598,7 +599,7 @@
 		.status_code = 200,
 	};
 
-	if (!sub|| !sub->handler->notify_request) {
+	if (!sub || !sub->handler->notify_request) {
 		return;
 	}
 




More information about the svn-commits mailing list