[sr-dev] git:master: xcap_server: components of xcap uri available in cfg

Daniel-Constantin Mierla miconda at gmail.com
Wed Sep 1 15:00:42 CEST 2010


Module: sip-router
Branch: master
Commit: 1ae80a64d1d488ed581a70085c61480ca3ae7c79
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1ae80a64d1d488ed581a70085c61480ca3ae7c79

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Wed Sep  1 12:49:01 2010 +0200

xcap_server: components of xcap uri available in cfg

- the user id is embedded in xcap uri and is needed to decide what is
  the sip uri associated with it
- $xcapuri(name=>key) PV exported to config

---

 modules_k/xcap_server/xcap_misc.c   |  247 ++++++++++++++++++++++++++++++++++-
 modules_k/xcap_server/xcap_misc.h   |    8 +
 modules_k/xcap_server/xcap_server.c |   10 +-
 3 files changed, 260 insertions(+), 5 deletions(-)

diff --git a/modules_k/xcap_server/xcap_misc.c b/modules_k/xcap_server/xcap_misc.c
index 70a7d1f..1c844e7 100644
--- a/modules_k/xcap_server/xcap_misc.c
+++ b/modules_k/xcap_server/xcap_misc.c
@@ -30,15 +30,19 @@
 #include <libxml/xpathInternals.h>
 
 #include "../../dprint.h"
-#include "../../sr_module.h"
 #include "../../mem/mem.h"
 #include "../../parser/parse_param.h"
 #include "../../modules_k/xcap_client/xcap_callbacks.h"
 
 #include "xcap_misc.h"
 
+extern str xcaps_root;
+
 static param_t *_xcaps_xpath_ns_root = NULL;
 
+/**
+ * parse xcap uri
+ */
 int xcap_parse_uri(str *huri, str *xroot, xcap_uri_t *xuri)
 {
 	str s;
@@ -213,6 +217,7 @@ int xcap_parse_uri(str *huri, str *xroot, xcap_uri_t *xuri)
 		xuri->node.len = xuri->uri.s + xuri->uri.len - xuri->node.s;
 	}
 
+#if 0
 	LM_DBG("----- uri: [%.*s]\n", xuri->uri.len, xuri->uri.s);
 	LM_DBG("----- root: [%.*s]\n", xuri->root.len, xuri->root.s);
 	LM_DBG("----- auid: [%.*s] (%d)\n", xuri->auid.len, xuri->auid.s,
@@ -225,9 +230,13 @@ int xcap_parse_uri(str *huri, str *xroot, xcap_uri_t *xuri)
 	LM_DBG("----- rdoc: [%.*s]\n", xuri->rdoc.len, xuri->rdoc.s);
 	if(xuri->nss!=NULL)
 		LM_DBG("----- node: [%.*s]\n", xuri->node.len, xuri->node.s);
+#endif
 	return 0;
 }
 
+/**
+ * get content of xpath pointer
+ */
 int xcaps_xpath_get(str *inbuf, str *xpaths, str *outbuf)
 {
 	xmlDocPtr doc = NULL;
@@ -357,7 +366,9 @@ error:
 	return -1;
 }
 
-
+/**
+ * set content of xpath pointer
+ */
 int xcaps_xpath_set(str *inbuf, str *xpaths, str *val, str *outbuf)
 {
 	xmlDocPtr doc = NULL;
@@ -499,7 +510,9 @@ error:
 	return -1;
 }
 
-
+/**
+ * register extra xml name spaces
+ */
 void xcaps_xpath_register_ns(xmlXPathContextPtr xpathCtx)
 {
 	param_t *ns;
@@ -511,6 +524,9 @@ void xcaps_xpath_register_ns(xmlXPathContextPtr xpathCtx)
 	}
 }
 
+/**
+ * parse xml ns parameter
+ */
 int xcaps_xpath_ns_param(modparam_t type, void *val)
 {
 	char *p;
@@ -549,3 +565,228 @@ error:
 
 }
 
+/**
+ * xcapuri PV export
+ */
+typedef struct _pv_xcap_uri {
+	str name;
+	unsigned int id;
+	xcap_uri_t xuri;
+	struct _pv_xcap_uri *next;
+} pv_xcap_uri_t;
+
+typedef struct _pv_xcap_uri_spec {
+	str name;
+	str key;
+	int ktype;
+	pv_xcap_uri_t *xus;
+} pv_xcap_uri_spec_t;
+
+
+pv_xcap_uri_t *_pv_xcap_uri_root = NULL;
+
+/**
+ *
+ */
+pv_xcap_uri_t *pv_xcap_uri_get_struct(str *name)
+{
+	unsigned int id;
+	pv_xcap_uri_t *it;
+
+	id = get_hash1_raw(name->s, name->len);
+	it = _pv_xcap_uri_root;
+
+	while(it!=NULL)
+	{
+		if(id == it->id && name->len==it->name.len
+				&& strncmp(name->s, it->name.s, name->len)==0)
+		{
+			LM_DBG("uri found [%.*s]\n", name->len, name->s);
+			return it;
+		}
+		it = it->next;
+	}
+
+	it = (pv_xcap_uri_t*)pkg_malloc(sizeof(pv_xcap_uri_t));
+	if(it==NULL)
+	{
+		LM_ERR("no more pkg\n");
+		return NULL;
+	}
+	memset(it, 0, sizeof(pv_xcap_uri_t));
+
+	it->id = id;
+	it->name = *name;
+
+	it->next = _pv_xcap_uri_root;
+	_pv_xcap_uri_root = it;
+	return it;
+}
+
+
+/**
+ *
+ */
+int pv_parse_xcap_uri_name(pv_spec_p sp, str *in)
+{
+	pv_xcap_uri_spec_t *pxs = NULL;
+	char *p;
+
+	if(in->s==NULL || in->len<=0)
+		return -1;
+
+	pxs = (pv_xcap_uri_spec_t*)pkg_malloc(sizeof(pv_xcap_uri_spec_t));
+	if(pxs==NULL)
+		return -1;
+
+	memset(pxs, 0, sizeof(pv_xcap_uri_spec_t));
+
+	p = in->s;
+
+	while(p<in->s+in->len && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r'))
+		p++;
+	if(p>in->s+in->len || *p=='\0')
+		goto error;
+	pxs->name.s = p;
+	while(p < in->s + in->len)
+	{
+		if(*p=='=' || *p==' ' || *p=='\t' || *p=='\n' || *p=='\r')
+			break;
+		p++;
+	}
+	if(p>in->s+in->len || *p=='\0')
+		goto error;
+	pxs->name.len = p - pxs->name.s;
+	if(*p!='=')
+	{
+		while(p<in->s+in->len && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r'))
+			p++;
+		if(p>in->s+in->len || *p=='\0' || *p!='=')
+			goto error;
+	}
+	p++;
+	if(*p!='>')
+		goto error;
+	p++;
+
+	pxs->key.len = in->len - (int)(p - in->s);
+	pxs->key.s = p;
+	LM_DBG("uri name [%.*s] - key [%.*s]\n", pxs->name.len, pxs->name.s,
+			pxs->key.len, pxs->key.s);
+	if(pxs->key.len==4 && strncmp(pxs->key.s, "data", 4)==0) {
+		pxs->ktype = 0;
+	} else if(pxs->key.len==3 && strncmp(pxs->key.s, "uri", 4)==0) {
+		pxs->ktype = 1;
+	} else if(pxs->key.len==4 && strncmp(pxs->key.s, "root", 4)==0) {
+		pxs->ktype = 2;
+	} else if(pxs->key.len==4 && strncmp(pxs->key.s, "auid", 4)==0) {
+		pxs->ktype = 3;
+	} else if(pxs->key.len==4 && strncmp(pxs->key.s, "type", 4)==0) {
+		pxs->ktype = 4;
+	} else if(pxs->key.len==4 && strncmp(pxs->key.s, "tree", 4)==0) {
+		pxs->ktype = 5;
+	} else if(pxs->key.len==4 && strncmp(pxs->key.s, "xuid", 4)==0) {
+		pxs->ktype = 6;
+	} else if(pxs->key.len==4 && strncmp(pxs->key.s, "file", 4)==0) {
+		pxs->ktype = 7;
+	} else if(pxs->key.len==4 && strncmp(pxs->key.s, "node", 4)==0) {
+		pxs->ktype = 8;
+	} else {
+		LM_ERR("unknown key type [%.*s]\n", in->len, in->s);
+		goto error;
+	}
+	pxs->xus = pv_xcap_uri_get_struct(&pxs->name);
+	sp->pvp.pvn.u.dname = (void*)pxs;
+	sp->pvp.pvn.type = PV_NAME_OTHER;
+	return 0;
+
+error:
+	if(pxs!=NULL)
+		pkg_free(pxs);
+	return -1;
+}
+
+/**
+ *
+ */
+int pv_set_xcap_uri(struct sip_msg* msg, pv_param_t *param,
+		int op, pv_value_t *val)
+{
+	pv_xcap_uri_spec_t *pxs = NULL;
+
+	pxs = (pv_xcap_uri_spec_t*)param->pvn.u.dname;
+	if(pxs->xus==NULL)
+		return -1;
+	if(!(val->flags&PV_VAL_STR))
+		return -1;
+	if(pxs->ktype!=0)
+		return -1;
+	/* set uri data */
+	if(xcap_parse_uri(&val->rs, &xcaps_root, &pxs->xus->xuri)<0)
+	{
+		LM_ERR("error setting xcap uri data [%.*s]\n",
+				val->rs.len, val->rs.s);
+		return -1;
+	}
+
+	return 0;
+}
+
+/**
+ *
+ */
+int pv_get_xcap_uri(struct sip_msg *msg,  pv_param_t *param,
+		pv_value_t *res)
+{
+	pv_xcap_uri_spec_t *pxs = NULL;
+
+	pxs = (pv_xcap_uri_spec_t*)param->pvn.u.dname;
+	if(pxs->xus==NULL)
+		return -1;
+
+	switch(pxs->ktype) {
+		case 0:
+		case 1:
+			/* get uri */
+			if(pxs->xus->xuri.uri.len>0)
+				return pv_get_strval(msg, param, res, &pxs->xus->xuri.uri);
+		break;
+		case 2:
+			/* get root */
+			if(pxs->xus->xuri.root.len>0)
+				return pv_get_strval(msg, param, res, &pxs->xus->xuri.root);
+		break;
+		case 3:
+			/* get auid */
+			if(pxs->xus->xuri.auid.len>0)
+				return pv_get_strval(msg, param, res, &pxs->xus->xuri.auid);
+		break;
+		case 4:
+			/* get type */
+			return pv_get_sintval(msg, param, res, pxs->xus->xuri.type);
+		break;
+		case 5:
+			/* get tree */
+			if(pxs->xus->xuri.tree.len>0)
+				return pv_get_strval(msg, param, res, &pxs->xus->xuri.tree);
+		break;
+		case 6:
+			/* get xuid */
+			if(pxs->xus->xuri.xuid.len>0)
+				return pv_get_strval(msg, param, res, &pxs->xus->xuri.xuid);
+		break;
+		case 7:
+			/* get file */
+			if(pxs->xus->xuri.file.len>0)
+				return pv_get_strval(msg, param, res, &pxs->xus->xuri.file);
+		break;
+		case 8:
+			/* get node */
+			if(pxs->xus->xuri.node.len>0)
+				return pv_get_strval(msg, param, res, &pxs->xus->xuri.node);
+		break;
+		default:
+			return pv_get_null(msg, param, res);
+	}
+	return pv_get_null(msg, param, res);
+}
diff --git a/modules_k/xcap_server/xcap_misc.h b/modules_k/xcap_server/xcap_misc.h
index 83564e9..78c92a0 100644
--- a/modules_k/xcap_server/xcap_misc.h
+++ b/modules_k/xcap_server/xcap_misc.h
@@ -26,6 +26,8 @@
 #define _XCAP_MISC_H_
 
 #include "../../str.h"
+#include "../../sr_module.h"
+#include "../../pvar.h"
 
 #define XCAP_MAX_URI_SIZE	127
 /* Node Selector Separator */
@@ -50,4 +52,10 @@ int xcap_parse_uri(str *huri, str *xroot, xcap_uri_t *xuri);
 int xcaps_xpath_set(str *inbuf, str *xpaths, str *val, str *outbuf);
 int xcaps_xpath_get(str *inbuf, str *xpaths, str *outbuf);
 
+int pv_get_xcap_uri(struct sip_msg *msg,  pv_param_t *param,
+		pv_value_t *res);
+int pv_set_xcap_uri(struct sip_msg* msg, pv_param_t *param,
+		int op, pv_value_t *val);
+int pv_parse_xcap_uri_name(pv_spec_p sp, str *in);
+
 #endif
diff --git a/modules_k/xcap_server/xcap_server.c b/modules_k/xcap_server/xcap_server.c
index e71bee4..4f5d5c0 100644
--- a/modules_k/xcap_server/xcap_server.c
+++ b/modules_k/xcap_server/xcap_server.c
@@ -75,9 +75,9 @@ int xcaps_generate_etag_hdr(str *etag);
 
 static str xcaps_db_table = str_init("xcap");
 static str xcaps_db_url = str_init(DEFAULT_DB_URL);
-static str xcaps_root = str_init("/xcap-root/");
 static int xcaps_init_time = 0;
 static int xcaps_etag_counter = 1;
+str xcaps_root = str_init("/xcap-root/");
 
 static str xcaps_buf = {0, 8192};
 #define XCAPS_ETAG_SIZE	128
@@ -100,6 +100,12 @@ db_func_t xcaps_dbf;
 /** SL API structure */
 sl_api_t slb;
 
+static pv_export_t mod_pvs[] = {
+	{ {"xcapuri", sizeof("xcapuri")-1}, PVT_OTHER, pv_get_xcap_uri,
+		pv_set_xcap_uri, pv_parse_xcap_uri_name, 0, 0, 0 },
+	{ {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
+};
+
 static param_export_t params[] = {
 	{ "db_url",		STR_PARAM, &xcaps_db_url.s    },
 	{ "xcap_table",	STR_PARAM, &xcaps_db_table.s  },
@@ -128,7 +134,7 @@ struct module_exports exports= {
 	params,						/* exported parameters */
 	0,      					/* exported statistics */
 	0,							/* exported MI functions */
-	0,							/* exported pseudo-variables */
+	mod_pvs,					/* exported pseudo-variables */
 	0,							/* extra processes */
 	mod_init,					/* module initialization function */
 	0,							/* response handling function */




More information about the sr-dev mailing list