Browse Source

pv: pv_var_to_xavp

Victor Seva 10 years ago
parent
commit
0c25a564ae
6 changed files with 118 additions and 1 deletions
  1. 31 0
      modules/pv/doc/pv_admin.xml
  2. 17 0
      modules/pv/pv.c
  3. 4 0
      modules/pv/pv_svar.c
  4. 1 0
      modules/pv/pv_svar.h
  5. 61 0
      modules/pv/pv_xavp.c
  6. 4 1
      modules/pv/pv_xavp.h

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

@@ -391,6 +391,37 @@ sbranch_reset();
 				<programlisting format="linespecific">
 ...
 pv_xavp_print();
+...
+				</programlisting>
+			</example>
+		</section>
+		<section id="pv.f.pv_var_to_xavp">
+			<title>
+				<function moreinfo="none">pv_var_to_xavp(varname, xname)</function>
+			</title>
+			<para>
+				Copy script variables values to a xavp.
+			</para>
+			<para>
+				First parameter can be '*' in order to copy all script variables. Second parameter is the name of the destination xavp. If xavp already exists it will be reset first.
+			</para>
+			<para>
+			Function can be used from ANY_ROUTE.
+			</para>
+			<example>
+				<title><function>pv_var_to_xavp()</function> usage</title>
+				<programlisting format="linespecific">
+...
+$var("temp") = 3;
+$var("foo") = "foo indeed";
+pv_var_to_xavp("temp", "ok");
+...
+$xavp("ok[0]=>temp") now is 3
+...
+pv_var_to_xavp("*", "ok");
+...
+$xavp("ok[0]=>temp") now is 3
+$xavp("ok[0]=>foo") now is "foo indeed"
 ...
 				</programlisting>
 			</example>

+ 17 - 0
modules/pv/pv.c

@@ -494,6 +494,7 @@ static int w_xavp_params_explode(sip_msg_t *msg, char *pparams, char *pxname);
 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 pv_init_rpc(void);
 
@@ -505,6 +506,8 @@ static cmd_export_t cmds[]={
 #ifdef WITH_XAVP
 	{"pv_xavp_print",  (cmd_function)pv_xavp_print,  0, 0, 0, 
 		ANY_ROUTE },
+	{"pv_var_to_xavp",  (cmd_function)w_var_to_xavp, 2, 0, 0,
+		ANY_ROUTE },
 #endif
 	{"is_int", (cmd_function)is_int, 1, fixup_pvar_null, fixup_free_pvar_null,
 		ANY_ROUTE},
@@ -693,6 +696,20 @@ static int is_int(struct sip_msg* msg, char* pvar, char* s2)
 	return -1;
 }
 
+static int w_var_to_xavp(sip_msg_t *msg, char *s1, char *s2)
+{
+	str xname, varname;
+
+	if(s1 == NULL || s2 == NULL) {
+		LM_ERR("wrong parameters\n");
+		return -1;
+	}
+
+	varname.len = strlen(s1); varname.s = s1;
+	xname.s = s2; xname.len = strlen(s2);
+	return pv_var_to_xavp(&varname, &xname);
+}
+
 /**
  *
  */

+ 4 - 0
modules/pv/pv_svar.c

@@ -186,6 +186,10 @@ script_var_t* get_varnull_by_name(str *name)
 	return 0;
 }
 
+script_var_t* get_var_all(void) {
+	return script_vars;
+}
+
 void reset_vars(void)
 {
 	script_var_t *it;

+ 1 - 0
modules/pv/pv_svar.h

@@ -51,6 +51,7 @@ script_var_t* add_var(str *name, int vtype);
 script_var_t* set_var_value(script_var_t *var, int_str *value, int flags);
 script_var_t* get_var_by_name(str *name);
 script_var_t* get_varnull_by_name(str *name);
+script_var_t* get_var_all(void);
 
 void reset_vars(void);
 void destroy_vars(void);

+ 61 - 0
modules/pv/pv_xavp.c

@@ -613,4 +613,65 @@ int xavp_params_explode(str *params, str *xname)
 
 	return 0;
 }
+
+int pv_var_to_xavp(str *varname, str *xname)
+{
+	script_var_t *it;
+	sr_xavp_t *xavp = NULL;
+	sr_xval_t xval;
+
+	LM_DBG("xname:%.*s varname:%.*s\n", xname->len, xname->s,
+		varname->len, varname->s);
+
+	// clean xavp
+	xavp_rm_by_name(xname, 1, NULL);
+
+	if(varname->len==1 && varname->s[0] == '*') {
+		for(it=get_var_all(); it; it=it->next) {
+			memset(&xval, 0, sizeof(sr_xval_t));
+			if(it->v.flags&VAR_VAL_INT)
+			{
+				xval.type = SR_XTYPE_INT;
+				xval.v.i = it->v.value.n;
+			} else {
+				if(it->v.value.s.len==0) continue;
+				xval.type = SR_XTYPE_STR;
+				xval.v.s.s = it->v.value.s.s;
+				xval.v.s.len = it->v.value.s.len;
+			}
+			xavp = xavp_add_xavp_value(xname, &it->name, &xval, NULL);
+			if(xavp==NULL) {
+				LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s);
+				goto error;
+			}
+		}
+	}
+	else {
+		it = get_var_by_name(varname);
+		if(it==NULL) {
+			LM_ERR("script var [%.*s] not found\n", varname->len, varname->s);
+			return -1;
+		}
+		memset(&xval, 0, sizeof(sr_xval_t));
+		if(it->v.flags&VAR_VAL_INT)
+		{
+			xval.type = SR_XTYPE_INT;
+			xval.v.i = it->v.value.n;
+		} else {
+			xval.type = SR_XTYPE_STR;
+			xval.v.s.s = it->v.value.s.s;
+			xval.v.s.len = it->v.value.s.len;
+		}
+		xavp = xavp_add_xavp_value(xname, &it->name, &xval, NULL);
+		if(xavp==NULL) {
+			LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s);
+			goto error;
+		}
+	}
+	return 1;
+
+error:
+	xavp_rm_by_name(xname, 1, NULL);
+	return -1;
+}
 #endif

+ 4 - 1
modules/pv/pv_xavp.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Daniel-Constantin Mierla (asipto.com) 
+ * Copyright (C) 2009 Daniel-Constantin Mierla (asipto.com)
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -20,6 +20,7 @@
 #ifdef WITH_XAVP
 
 #include "../../pvar.h"
+#include "pv_svar.h"
 
 int pv_get_xavp(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res);
@@ -31,5 +32,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);
+
 #endif
 #endif