Module: sip-router Branch: master Commit: 288e2739da28251e12086b52358c3a0d18e91fa5 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=288e2739...
Author: Victor Seva linuxmaniac@torreviejawireless.org Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Mon Apr 22 10:46:17 2013 +0200
core[xavp]: Added helper function to get a list of keys from a xavp variable.
---
xavp.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xavp.h | 2 ++ 2 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/xavp.c b/xavp.c index 6c8566d..adce5d1 100644 --- a/xavp.c +++ b/xavp.c @@ -27,6 +27,7 @@ #include <stdio.h> #include <string.h>
+#include "mem/mem.h" #include "mem/shm_mem.h" #include "dprint.h" #include "hashes.h" @@ -538,6 +539,67 @@ void xavp_print_list(sr_xavp_t **head) }
/** + * returns a list of str with key names. + * Example: + * If we have this structure + * $xavp(test=>one) = 1 + * $xavp(test[0]=>two) = "2" + * $xavp(test[0]=>three) = 3 + * $xavp(test[0]=>four) = $xavp(whatever) + * + * xavp_get_list_keys_names(test[0]) returns + * {"one", "two", "three", "four"} + */ +struct str_list *xavp_get_list_key_names(sr_xavp_t *xavp) +{ + sr_xavp_t *avp = NULL; + struct str_list *result = NULL; + struct str_list *r = NULL; + int total = 0; + + if(xavp==NULL){ + LM_ERR("xavp is NULL\n"); + return 0; + } + + if(xavp->val.type!=SR_XTYPE_XAVP){ + LM_ERR("%s not xavp?\n", xavp->name.s); + return 0; + } + + avp = xavp->val.v.xavp; + + if (avp) + { + result = (struct str_list*)pkg_malloc(sizeof(struct str_list)); + if (result==NULL) { + PKG_MEM_ERROR; + return 0; + } + r = result; + r->s.s = avp->name.s; + r->s.len = avp->name.len; + r->next = NULL; + avp = avp->next; + } + + while(avp) + { + r = append_str_list(avp->name.s, avp->name.len, &r, &total); + if(r==NULL){ + while(result){ + r = result; + result = result->next; + pkg_free(r); + } + return 0; + } + avp = avp->next; + } + return result; +} + +/** * clone the xavp without values that are custom data * - only one list level is cloned, other sublists are ignored */ diff --git a/xavp.h b/xavp.h index b581c08..7d5d517 100644 --- a/xavp.h +++ b/xavp.h @@ -29,6 +29,7 @@
#include <time.h> #include "str.h" +#include "str_list.h"
struct _sr_xavp;
@@ -95,6 +96,7 @@ void xavp_destroy_list(sr_xavp_t **head); void xavp_reset_list(void); sr_xavp_t **xavp_set_list(sr_xavp_t **head); sr_xavp_t **xavp_get_crt_list(void); +struct str_list *xavp_get_list_key_names(sr_xavp_t *xavp);
int xavp_insert(sr_xavp_t *xavp, int idx, sr_xavp_t **list); sr_xavp_t *xavp_extract(str *name, sr_xavp_t **list);