Prechádzať zdrojové kódy

Merge pull request #316 from kamailio/vseva/pv_xavp_to_var

pv: pv_xavp_to_var()
Victor Seva 10 rokov pred
rodič
commit
061baf5175

+ 24 - 4
modules/pv/README

@@ -47,6 +47,7 @@ Daniel-Constantin Mierla
               4.9. sbranch_reset()
               4.10. pv_xavp_print()
               4.11. pv_var_to_xavp(varname, xname)
+              4.12. pv_xavp_to_var(xname)
 
         5. MI Commands
 
@@ -74,8 +75,9 @@ Daniel-Constantin Mierla
    1.12. sbranch_append() usage
    1.13. pv_xavp_print() usage
    1.14. pv_var_to_xavp() usage
-   1.15. shv_set usage
-   1.16. shv_get usage
+   1.15. pv_xavp_to_var() usage
+   1.16. shv_set usage
+   1.17. shv_get usage
 
 Chapter 1. Admin Guide
 
@@ -106,6 +108,7 @@ Chapter 1. Admin Guide
         4.9. sbranch_reset()
         4.10. pv_xavp_print()
         4.11. pv_var_to_xavp(varname, xname)
+        4.12. pv_xavp_to_var(xname)
 
    5. MI Commands
 
@@ -211,6 +214,7 @@ modparam("pv","avp_aliases","email=s:email_addr;tmp=i:100")
    4.9. sbranch_reset()
    4.10. pv_xavp_print()
    4.11. pv_var_to_xavp(varname, xname)
+   4.12. pv_xavp_to_var(xname)
 
 4.1. pv_isset(pvar)
 
@@ -395,6 +399,22 @@ $xavp("ok[0]=>temp") now is 3
 $xavp("ok[0]=>foo") now is "foo indeed"
 ...
 
+4.12.  pv_xavp_to_var(xname)
+
+   Copy xavp values to vars. Reverse of pv_var_to_xavp().
+
+   Function can be used from ANY_ROUTE.
+
+   Example 1.15. pv_xavp_to_var() usage
+...
+$xavp("bar=>temp") = 3;
+$xavp("bar[0]=>foo") = "foo indeed";
+pv_xavp_to_var("bar");
+...
+$var("temp") now is 3
+$var("foo") now is "foo indeed"
+...
+
 5. MI Commands
 
    5.1. shv_set
@@ -418,7 +438,7 @@ $xavp("ok[0]=>foo") now is "foo indeed"
                 _value_
                 _empty_line_
 
-   Example 1.15. shv_set usage
+   Example 1.16. shv_set usage
 ...
 $ kamctl fifo shv_set debug int 0
 ...
@@ -436,7 +456,7 @@ $ kamctl fifo shv_set debug int 0
                 _name_
                 _empty_line_
 
-   Example 1.16. shv_get usage
+   Example 1.17. shv_get usage
 ...
 $ kamctl fifo shv_get debug
 $ kamctl fifo shv_get

+ 24 - 0
modules/pv/doc/pv_admin.xml

@@ -422,6 +422,30 @@ pv_var_to_xavp("*", "ok");
 ...
 $xavp("ok[0]=>temp") now is 3
 $xavp("ok[0]=>foo") now is "foo indeed"
+...
+				</programlisting>
+			</example>
+		</section>
+		<section id="pv.f.pv_xavp_to_var">
+			<title>
+				<function moreinfo="none">pv_xavp_to_var(xname)</function>
+			</title>
+			<para>
+				Copy xavp values to vars. Reverse of pv_var_to_xavp().
+			</para>
+			<para>
+			Function can be used from ANY_ROUTE.
+			</para>
+			<example>
+				<title><function>pv_xavp_to_var()</function> usage</title>
+				<programlisting format="linespecific">
+...
+$xavp("bar=>temp") = 3;
+$xavp("bar[0]=>foo") = "foo indeed";
+pv_xavp_to_var("bar");
+...
+$var("temp") now is 3
+$var("foo") now is "foo indeed"
 ...
 				</programlisting>
 			</example>

+ 16 - 0
modules/pv/pv.c

@@ -495,6 +495,7 @@ static int w_sbranch_set_ruri(sip_msg_t *msg, char p1, char *p2);
 static int w_sbranch_append(sip_msg_t *msg, char p1, char *p2);
 static int w_sbranch_reset(sip_msg_t *msg, char p1, char *p2);
 static int w_var_to_xavp(sip_msg_t *msg, char *p1, char *p2);
+static int w_xavp_to_var(sip_msg_t *msg, char *p1);
 
 static int pv_init_rpc(void);
 
@@ -508,6 +509,8 @@ static cmd_export_t cmds[]={
 		ANY_ROUTE },
 	{"pv_var_to_xavp",  (cmd_function)w_var_to_xavp, 2, 0, 0,
 		ANY_ROUTE },
+	{"pv_xavp_to_var",  (cmd_function)w_xavp_to_var, 1, 0, 0,
+		ANY_ROUTE },
 #endif
 	{"is_int", (cmd_function)is_int, 1, fixup_pvar_null, fixup_free_pvar_null,
 		ANY_ROUTE},
@@ -710,6 +713,19 @@ static int w_var_to_xavp(sip_msg_t *msg, char *s1, char *s2)
 	return pv_var_to_xavp(&varname, &xname);
 }
 
+static int w_xavp_to_var(sip_msg_t *msg, char *s1)
+{
+	str xname;
+
+	if(s1 == NULL) {
+		LM_ERR("wrong parameters\n");
+		return -1;
+	}
+
+	xname.s = s1; xname.len = strlen(s1);
+	return pv_xavp_to_var(&xname);
+}
+
 /**
  *
  */

+ 58 - 0
modules/pv/pv_xavp.c

@@ -674,4 +674,62 @@ error:
 	xavp_rm_by_name(xname, 1, NULL);
 	return -1;
 }
+
+int pv_xavp_to_var_helper(sr_xavp_t *avp) {
+	script_var_t *it;
+	int_str value;
+	int flags = 0;
+
+	it = add_var(&avp->name, VAR_TYPE_ZERO);
+	if(!it)	return -1;
+	if(avp->val.type==SR_XTYPE_STR){
+		flags |= VAR_VAL_STR;
+		value.s.len = avp->val.v.s.len;
+		value.s.s = avp->val.v.s.s;
+		LM_DBG("var:[%.*s]  STR:[%.*s]\n", avp->name.len, avp->name.s,
+			value.s.len, value.s.s);
+	}
+	else if(avp->val.type==SR_XTYPE_INT) {
+		flags |= VAR_VAL_INT;
+		value.n = avp->val.v.i;
+		LM_DBG("var:[%.*s] INT:[%d]\n", avp->name.len, avp->name.s,
+			value.n);
+	} else {
+		LM_ERR("avp type not STR nor INT\n");
+		return -1;
+	}
+	set_var_value(it, &value, flags);
+
+	return 0;
+}
+
+int pv_xavp_to_var(str *xname) {
+	sr_xavp_t *xavp;
+	sr_xavp_t *avp;
+
+	LM_DBG("xname:%.*s\n", xname->len, xname->s);
+
+	xavp = xavp_get_by_index(xname, 0, NULL);
+	if(!xavp) {
+		LM_ERR("xavp [%.*s] not found\n", xname->len, xname->s);
+		return -1;
+	}
+	if(xavp->val.type!=SR_XTYPE_XAVP){
+		LM_ERR("%.*s not xavp type?\n", xname->len, xname->s);
+		return -1;
+	}
+	avp = xavp->val.v.xavp;
+	if (avp)
+	{
+		if(pv_xavp_to_var_helper(avp)<0) return -1;
+		avp = avp->next;
+	}
+
+	while(avp)
+	{
+		if(pv_xavp_to_var_helper(avp)<0) return -1;
+		avp = avp->next;
+	}
+	return 1;
+}
 #endif

+ 1 - 0
modules/pv/pv_xavp.h

@@ -33,6 +33,7 @@ int pv_xavp_print(struct sip_msg* msg, char* s1, char *s2);
 int xavp_params_explode(str *params, str *xname);
 
 int pv_var_to_xavp(str *varname, str *xname);
+int pv_xavp_to_var(str *xname);
 
 #endif
 #endif