[sr-dev] git:master: sr_module: new fixup function: get_is_fparam()

Ovidiu Sas osas at voipembedded.com
Tue May 20 19:47:17 CEST 2014


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

Author: Ovidiu Sas <osas at voipembedded.com>
Committer: Ovidiu Sas <osas at voipembedded.com>
Date:   Tue May 20 13:45:40 2014 -0400

sr_module: new fixup function: get_is_fparam()
 - retrieve parameter value as string or/and integer (if possible)

---

 sr_module.c |   94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 sr_module.h |   11 +++++++
 2 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/sr_module.c b/sr_module.c
index 3fb98a6..a47b9de 100644
--- a/sr_module.c
+++ b/sr_module.c
@@ -1776,6 +1776,100 @@ int get_int_fparam(int* dst, struct sip_msg* msg, fparam_t* param)
 	return 0;
 }
 
+/** Get the function parameter value as string or/and integer (if possible).
+ *  @return  0 - Success
+ *          -1 - Cannot get value
+ */
+int get_is_fparam(int* i_dst, str* s_dst, struct sip_msg* msg, fparam_t* param, unsigned int *flags)
+{
+	int_str val;
+	int ret;
+	avp_t* avp;
+	str tmp;
+	pv_value_t pv_val;
+
+	*flags = 0;
+	switch(param->type) {
+		case FPARAM_INT:
+			*i_dst = param->v.i;
+			*flags |= PARAM_INT;
+			return 0;
+		case FPARAM_REGEX:
+		case FPARAM_UNSPEC:
+		case FPARAM_STRING:
+			s_dst->s = param->v.asciiz;
+			s_dst->len = strlen(param->v.asciiz);
+			*flags |= PARAM_STR;
+			break;
+		case FPARAM_STR:
+			*s_dst = param->v.str;
+			*flags |= PARAM_STR;
+			break;
+		case FPARAM_AVP:
+			avp = search_first_avp(param->v.avp.flags, param->v.avp.name,
+									&val, 0);
+			if (unlikely(!avp)) {
+				DBG("Could not find AVP from function parameter '%s'\n",
+						param->orig);
+				return -1;
+			}
+			if (avp->flags & AVP_VAL_STR) {
+				*s_dst = val.s;
+				*flags |= PARAM_STR;
+				if (str2int(&val.s, (unsigned int*)i_dst) < 0) {
+					ERR("Could not convert AVP string value to int\n");
+					return -1;
+				}
+			} else {
+				*i_dst = val.n;
+				*flags |= PARAM_INT;
+			}
+			break;
+		case FPARAM_SELECT:
+			ret = run_select(&tmp, param->v.select, msg);
+			if (unlikely(ret < 0 || ret > 0)) return -1;
+			if (unlikely(str2int(&tmp, (unsigned int*)i_dst) < 0)) {
+				ERR("Could not convert select result to int\n");
+				return -1;
+			}
+			*flags |= PARAM_INT;
+			break;
+		case FPARAM_PVS:
+			if (likely(pv_get_spec_value(msg, param->v.pvs, &pv_val)==0)) {
+				if ((pv_val.flags&(PV_VAL_NULL|PV_VAL_INT))==PV_VAL_INT){
+					*i_dst=pv_val.ri;
+					*flags |= PARAM_INT;
+				}
+				if ((pv_val.flags&(PV_VAL_NULL|PV_VAL_STR))==PV_VAL_STR){
+					*s_dst=pv_val.rs;
+					*flags |= PARAM_STR;
+				}
+			}else{
+				ERR("Could not get PV\n");
+				return -1;
+			}
+			break;
+		case FPARAM_PVE:
+			s_dst->s=pv_get_buffer();
+			s_dst->len=pv_get_buffer_size();
+			if (unlikely(pv_printf(msg, param->v.pve, s_dst->s, &s_dst->len)!=0)){
+				ERR("Could not convert the PV-formated string to str\n");
+				s_dst->len=0;
+				return -1;
+			}
+			*flags |= PARAM_STR;
+			break;
+	}
+
+	/* Let's convert to int, if possible */
+	if (!(*flags & PARAM_INT) && (*flags & PARAM_STR) && str2sint(s_dst, i_dst) == 0)
+		*flags |= PARAM_INT;
+
+	if (!*flags) return -1;
+
+	return 0;
+}
+
 /**
  * Retrieve the compiled RegExp.
  * @return: 0 for success, negative on error.
diff --git a/sr_module.h b/sr_module.h
index 14f9936..4d906b0 100644
--- a/sr_module.h
+++ b/sr_module.h
@@ -630,6 +630,17 @@ int get_str_fparam(str* dst, struct sip_msg* msg, fparam_t* param);
 int get_int_fparam(int* dst, struct sip_msg* msg, fparam_t* param);
 
 /**
+ * @brief Get the function parameter value as integer/string
+ * @param i_dst int destination
+ * @param s_dst string destination
+ * @param msg SIP message
+ * @param param function parameters
+ * @param flags flags to indicate destiantions
+ * @return 0 on success, 1 on error, e.g. cannot get value
+ */
+int get_is_fparam(int* i_dst, str* s_dst, struct sip_msg* msg, fparam_t* param, unsigned int *flags);
+
+/**
  * @brief Get the function parameter value as compiled regular expression
  * @param dst string destination
  * @param msg SIP message




More information about the sr-dev mailing list