[sr-dev] git:master:2b53f673: pv: new function xavp_params_explode(p, x)

Daniel-Constantin Mierla miconda at gmail.com
Sun Apr 19 21:37:33 CEST 2015


Module: kamailio
Branch: master
Commit: 2b53f673b5888cf8b88b858d8b9a1da57313217b
URL: https://github.com/kamailio/kamailio/commit/2b53f673b5888cf8b88b858d8b9a1da57313217b

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2015-04-19T00:09:37+02:00

pv: new function xavp_params_explode(p, x)

- convert a string formatted as SIP params in xavp attributes
- e.g., xavp_params_explode("a=b;c=d;e=d", "x") results in:
  $xavp(x=>a) = "b";
  $xavp(x=>c) = "d";
  $xavp(x=>e) = "f";

---

Modified: modules/pv/pv.c
Modified: modules/pv/pv_xavp.c
Modified: modules/pv/pv_xavp.h

---

Diff:  https://github.com/kamailio/kamailio/commit/2b53f673b5888cf8b88b858d8b9a1da57313217b.diff
Patch: https://github.com/kamailio/kamailio/commit/2b53f673b5888cf8b88b858d8b9a1da57313217b.patch

---

diff --git a/modules/pv/pv.c b/modules/pv/pv.c
index 2f99a53..d969adc 100644
--- a/modules/pv/pv.c
+++ b/modules/pv/pv.c
@@ -475,6 +475,7 @@ static int pv_unset(struct sip_msg* msg, char* pvid, char *foo);
 static int is_int(struct sip_msg* msg, char* pvar, char* s2);
 static int pv_typeof(sip_msg_t *msg, char *pv, char *t);
 static int pv_not_empty(sip_msg_t *msg, char *pv, char *s2);
+static int w_xavp_params_explode(sip_msg_t *msg, char *pparams, char *pxname);
 static int pv_init_rpc(void);
 
 static cmd_export_t cmds[]={
@@ -494,6 +495,9 @@ static cmd_export_t cmds[]={
 	{"not_empty", (cmd_function)pv_not_empty, 1, fixup_pvar_null,
 		fixup_free_pvar_null,
 		ANY_ROUTE},
+	{"xavp_params_explode", (cmd_function)w_xavp_params_explode,
+		2, fixup_spve_spve, fixup_free_spve_spve,
+		ANY_ROUTE},
 
 	{0,0,0,0,0,0}
 };
@@ -663,6 +667,29 @@ static int is_int(struct sip_msg* msg, char* pvar, char* s2)
 	return -1;
 }
 
+/**
+ *
+ */
+static int w_xavp_params_explode(sip_msg_t *msg, char *pparams, char *pxname)
+{
+	str sparams;
+	str sxname;
+
+	if(fixup_get_svalue(msg, (gparam_t*)pparams, &sparams)!=0) {
+		LM_ERR("cannot get the params\n");
+		return -1;
+	}
+	if(fixup_get_svalue(msg, (gparam_t*)pxname, &sxname)!=0) {
+		LM_ERR("cannot get the xavp name\n");
+		return -1;
+	}
+
+	if(xavp_params_explode(&sparams, &sxname)<0)
+		return -1;
+
+	return 1;
+}
+
 static const char* rpc_shv_set_doc[2] = {
 	"Set a shared variable (args: name type value)",
 	0
diff --git a/modules/pv/pv_xavp.c b/modules/pv/pv_xavp.c
index 1cf65c0..53fd99a 100644
--- a/modules/pv/pv_xavp.c
+++ b/modules/pv/pv_xavp.c
@@ -21,6 +21,7 @@
 #include "../../dprint.h"
 #include "../../xavp.h"
 #include "../../pvapi.h"
+#include "../../parser/parse_param.h"
 
 #include "pv_xavp.h"
 
@@ -555,4 +556,61 @@ int pv_xavp_print(struct sip_msg* msg, char* s1, char *s2)
 	return 1;
 }
 
+/**
+ *
+ */
+int xavp_params_explode(str *params, str *xname)
+{
+	param_t* params_list = NULL;
+	param_hooks_t phooks;
+	param_t *pit=NULL;
+	str s;
+	sr_xavp_t *xavp=NULL;
+	sr_xval_t xval;
+
+	if(params==NULL || xname==NULL || params->s==NULL || xname->s==NULL
+			|| params->len<=0 || xname->len<=0)
+	{
+		LM_ERR("invalid parameters\n");
+		return -1;
+	}
+
+	s.s = params->s;
+	s.len = params->len;
+	if(s.s[s.len-1]==';')
+		s.len--;
+	if (parse_params(&s, CLASS_ANY, &phooks, &params_list)<0) {
+		LM_DBG("invalid formatted values [%.*s]\n", params->len, params->s);
+		return -1;
+	}
+
+	if(params_list==NULL) {
+		return -1;
+	}
+
+
+	for (pit = params_list; pit; pit=pit->next)
+	{
+		memset(&xval, 0, sizeof(sr_xval_t));
+		xval.type = SR_XTYPE_STR;
+		xval.v.s = pit->body;
+		if(xavp_add_value(&pit->name, &xval, &xavp)==NULL) {
+			free_params(params_list);
+			xavp_destroy_list(&xavp);
+			return -1;
+		}
+	}
+	free_params(params_list);
+
+	/* add main xavp in root list */
+	memset(&xval, 0, sizeof(sr_xval_t));
+	xval.type = SR_XTYPE_XAVP;
+	xval.v.xavp = xavp;
+	if(xavp_add_value(xname, &xval, NULL)==NULL) {
+		xavp_destroy_list(&xavp);
+		return -1;
+	}
+
+	return 0;
+}
 #endif
diff --git a/modules/pv/pv_xavp.h b/modules/pv/pv_xavp.h
index a8020e7..3c8238e 100644
--- a/modules/pv/pv_xavp.h
+++ b/modules/pv/pv_xavp.h
@@ -29,5 +29,7 @@ int pv_parse_xavp_name(pv_spec_p sp, str *in);
 
 int pv_xavp_print(struct sip_msg* msg, char* s1, char *s2);
 
+int xavp_params_explode(str *params, str *xname);
+
 #endif
 #endif




More information about the sr-dev mailing list