542
* returns a list of str with key names.
544
* If we have this structure
545
* $xavp(test=>one) = 1
546
* $xavp(test[0]=>two) = "2"
547
* $xavp(test[0]=>three) = 3
548
* $xavp(test[0]=>four) = $xavp(whatever)
549
* $xavp(test[0]=>two) = "other 2"
551
* xavp_get_list_keys_names(test[0]) returns
552
* {"one", "two", "three", "four"}
554
* free the struct str_list afterwards
555
* but do *NO* free the strings inside
557
struct str_list *xavp_get_list_key_names(sr_xavp_t *xavp)
559
sr_xavp_t *avp = NULL;
560
struct str_list *result = NULL;
561
struct str_list *r = NULL;
562
struct str_list *f = NULL;
566
LM_ERR("xavp is NULL\n");
570
if(xavp->val.type!=SR_XTYPE_XAVP){
571
LM_ERR("%s not xavp?\n", xavp->name.s);
575
avp = xavp->val.v.xavp;
579
result = (struct str_list*)pkg_malloc(sizeof(struct str_list));
585
r->s.s = avp->name.s;
586
r->s.len = avp->name.len;
596
if((avp->name.len==f->s.len)&&
597
(strncmp(avp->name.s, f->s.s, f->s.len)==0))
599
break; /* name already on list */
605
r = append_str_list(avp->name.s, avp->name.len, &r, &total);
609
result = result->next;
541
621
* clone the xavp without values that are custom data
542
622
* - only one list level is cloned, other sublists are ignored
792
* return child node of an xavp
793
* - $xavp(rname=>cname)
795
sr_xavp_t* xavp_get_child(str *rname, str *cname)
797
sr_xavp_t *ravp=NULL;
799
ravp = xavp_get(rname, NULL);
800
if(ravp==NULL || ravp->val.type!=SR_XTYPE_XAVP)
803
return xavp_get(cname, ravp->val.v.xavp);
808
* return child node of an xavp if it has int value
809
* - $xavp(rname=>cname)
811
sr_xavp_t* xavp_get_child_with_ival(str *rname, str *cname)
813
sr_xavp_t *vavp=NULL;
815
vavp = xavp_get_child(rname, cname);
817
if(vavp==NULL || vavp->val.type!=SR_XTYPE_INT)
825
* return child node of an xavp if it has string value
826
* - $xavp(rname=>cname)
828
sr_xavp_t* xavp_get_child_with_sval(str *rname, str *cname)
830
sr_xavp_t *vavp=NULL;
832
vavp = xavp_get_child(rname, cname);
834
if(vavp==NULL || vavp->val.type!=SR_XTYPE_STR)