2 * Copyright (C) 2009 Daniel-Constantin Mierla (asipto.com)
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include "../../core/dprint.h"
20 #include "../../core/xavp.h"
21 #include "../../core/pvapi.h"
22 #include "../../core/trim.h"
23 #include "../../core/parser/parse_param.h"
27 #define PV_FIELD_DELIM ", "
28 #define PV_FIELD_DELIM_LEN (sizeof(PV_FIELD_DELIM) - 1)
30 int pv_xavp_get_value(struct sip_msg *msg, pv_param_t *param,
31 pv_value_t *res, sr_xavp_t *avp)
33 static char _pv_xavp_buf[128];
36 switch(avp->val.type) {
38 return pv_get_null(msg, param, res);
41 return pv_get_sintval(msg, param, res, avp->val.v.i);
44 return pv_get_strval(msg, param, res, &avp->val.v.s);
47 if(snprintf(_pv_xavp_buf, 128, "%lu", (long unsigned)avp->val.v.t)<0)
48 return pv_get_null(msg, param, res);
51 if(snprintf(_pv_xavp_buf, 128, "%ld", (long unsigned)avp->val.v.l)<0)
52 return pv_get_null(msg, param, res);
55 if(snprintf(_pv_xavp_buf, 128, "%lld", avp->val.v.ll)<0)
56 return pv_get_null(msg, param, res);
59 if(snprintf(_pv_xavp_buf, 128, "<<xavp:%p>>", avp->val.v.xavp)<0)
60 return pv_get_null(msg, param, res);
63 if(snprintf(_pv_xavp_buf, 128, "<<vptr:%p>>", avp->val.v.vptr)<0)
64 return pv_get_null(msg, param, res);
67 if(snprintf(_pv_xavp_buf, 128, "<<sptr:%p>>", avp->val.v.vptr)<0)
68 return pv_get_null(msg, param, res);
71 if(snprintf(_pv_xavp_buf, 128, "<<data:%p>>", avp->val.v.data)<0)
72 return pv_get_null(msg, param, res);
75 return pv_get_null(msg, param, res);
78 s.len = strlen(_pv_xavp_buf);
79 return pv_get_strval(msg, param, res, &s);
83 int pv_get_xavp(struct sip_msg *msg, pv_param_t *param,
86 pv_xavp_name_t *xname=NULL;
96 LM_ERR("bad parameters\n");
99 xname = (pv_xavp_name_t*)param->pvn.u.dname;
101 if(xname->index.type==PVT_EXTRA)
104 if(pv_get_spec_index(msg, &xname->index.pvp, &idx, &idxf)!=0)
106 LM_ERR("invalid index\n");
113 count = xavp_count(&xname->name, NULL);
116 avp = xavp_get_by_index(&xname->name, idx, NULL);
118 return pv_get_null(msg, param, res);
119 if(xname->next==NULL)
120 return pv_xavp_get_value(msg, param, res, avp);
121 if(avp->val.type != SR_XTYPE_XAVP)
122 return pv_get_null(msg, param, res);
126 if(xname->next->index.type==PVT_EXTRA)
129 if(pv_get_spec_index(msg, &xname->next->index.pvp, &idx, &idxf)!=0)
131 LM_ERR("invalid index\n");
138 count = xavp_count(&xname->next->name, &avp->val.v.xavp);
141 avp = xavp_get_by_index(&xname->next->name, idx, &avp->val.v.xavp);
143 return pv_get_null(msg, param, res);
144 /* get all values of second key */
147 p_ini = pv_get_buffer();
149 p_size = pv_get_buffer_size();
153 if(p-p_ini+PV_FIELD_DELIM_LEN+1>p_size)
155 LM_ERR("local buffer length exceeded\n");
156 return pv_get_null(msg, param, res);
158 memcpy(p, PV_FIELD_DELIM, PV_FIELD_DELIM_LEN);
159 p += PV_FIELD_DELIM_LEN;
161 if(pv_xavp_get_value(msg, param, res, avp)<0)
163 LM_ERR("can get value\n");
164 return pv_get_null(msg, param, res);
166 if(p-p_ini+res->rs.len+1>p_size)
168 LM_ERR("local buffer length exceeded!\n");
169 return pv_get_null(msg, param, res);
171 memcpy(p, res->rs.s, res->rs.len);
173 } while ((avp=xavp_get_next(avp))!=0);
175 res->rs.len = p - p_ini;
178 return pv_xavp_get_value(msg, param, res, avp);
182 * $xavp(name1[idx1]=>name2[idx2])
184 int pv_set_xavp(struct sip_msg* msg, pv_param_t *param,
185 int op, pv_value_t *val)
187 pv_xavp_name_t *xname=NULL;
189 sr_xavp_t *list=NULL;
199 LM_ERR("bad parameters\n");
202 xname = (pv_xavp_name_t*)param->pvn.u.dname;
204 if(xname->index.type==PVT_EXTRA)
207 if(pv_get_spec_index(msg, &xname->index.pvp, &idx, &idxf)!=0)
209 LM_ERR("invalid index\n");
214 if((val==NULL) || (val->flags&PV_VAL_NULL))
216 if(xname->next==NULL)
218 if(xname->index.type==PVT_EXTRA) {
219 if(idxf==PV_IDX_ALL) {
220 xavp_rm_by_name(&xname->name, 1, NULL);
225 xavp_rm_by_name(&xname->name, 0, NULL);
231 count = xavp_count(&xname->name, NULL);
232 idx = count + idx + 1;
234 xavp_rm_by_index(&xname->name, idx, NULL);
238 if(xname->next->index.type==PVT_EXTRA)
241 if(pv_get_spec_index(msg,&xname->next->index.pvp,&idx1,&idxf1)!=0)
243 LM_ERR("invalid index!\n");
248 if(idxf==PV_IDX_ALL) {
250 avp = xavp_get(&xname->name, NULL);
252 if(avp->val.type==SR_XTYPE_XAVP) {
253 if(xname->next->index.type==PVT_EXTRA) {
254 if(idxf1==PV_IDX_ALL) {
255 xavp_rm_by_name(&xname->next->name, 1,
262 count = xavp_count(&xname->next->name,
264 idx = count + idx1 + 1;
266 xavp_rm_by_index(&xname->next->name, idx,
270 xavp_rm_by_name(&xname->next->name, 0,
274 avp = xavp_get_next(avp);
280 avp = xavp_get(&xname->name, NULL);
285 count = xavp_count(&xname->name, NULL);
286 idx = count + idx + 1;
288 avp = xavp_get_by_index(&xname->name, idx, NULL);
291 if(avp->val.type==SR_XTYPE_XAVP) {
292 if(xname->next->index.type==PVT_EXTRA) {
293 if(idxf1==PV_IDX_ALL) {
294 xavp_rm_by_name(&xname->next->name, 1,
301 count = xavp_count(&xname->next->name,
303 idx = count + idx1 + 1;
305 xavp_rm_by_index(&xname->next->name, idx,
309 xavp_rm_by_name(&xname->next->name, 0,
315 } /* NULL assignment */
317 /* build xavp value */
318 memset(&xval, 0, sizeof(sr_xval_t));
320 if(val->flags&PV_TYPE_INT)
322 xval.type = SR_XTYPE_INT;
325 xval.type = SR_XTYPE_STR;
330 if(xname->next==NULL)
332 /* xavp with single value */
333 if(xname->index.type==PVT_EXTRA) {
334 if(idxf==PV_IDX_ALL) {
335 /* ignore: should iterate and set same value to all xavps
336 * with same name?!?! */
342 count = xavp_count(&xname->name, NULL);
343 idx = count + idx + 1;
346 if(xavp_set_value(&xname->name, idx, &xval, NULL)==NULL)
351 if(xavp_add_value(&xname->name, &xval, NULL)==NULL)
356 /* xavp with xavp list value */
357 if(xname->next->index.type==PVT_EXTRA)
360 if(pv_get_spec_index(msg,&xname->next->index.pvp,&idx1,&idxf1)!=0)
362 LM_ERR("invalid index!\n");
367 if(xname->index.type==PVT_EXTRA)
370 if(idxf==PV_IDX_ALL) {
371 /* ignore: should iterate and set same value to all xavps
372 * with same name?!?! */
377 avp = xavp_get(&xname->name, NULL);
382 count = xavp_count(&xname->name, NULL);
383 idx = count + idx + 1;
385 avp = xavp_get_by_index(&xname->name, idx, NULL);
390 if(avp->val.type!=SR_XTYPE_XAVP)
393 if(xname->next->index.type==PVT_EXTRA) {
394 if(idxf1==PV_IDX_ALL) {
395 /* ignore: should iterate and set same value to all xavps
396 * with same name?!?! */
403 count = xavp_count(&xname->next->name,
405 idx = count + idx1 + 1;
408 xavp_set_value(&xname->next->name, idx, &xval, &avp->val.v.xavp);
411 /* add new value in sublist */
412 if(xavp_add_value(&xname->next->name, &xval, &avp->val.v.xavp)==NULL)
416 /* add new xavp with xavp list */
417 if(xavp_add_value(&xname->next->name, &xval, &list)==NULL)
420 /* build xavp value */
421 memset(&xval, 0, sizeof(sr_xval_t));
422 xval.type = SR_XTYPE_XAVP;
424 xavp_add_value(&xname->name, &xval, NULL);
429 char* pv_xavp_fill_ni(str *in, pv_xavp_name_t *xname)
435 if(in->s==NULL || in->len<=0 || xname==NULL)
440 while(p<in->s+in->len && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r'))
442 if(p>in->s+in->len || *p=='\0')
445 while(p < in->s + in->len)
447 if(*p=='=' || *p==' ' || *p=='\t' || *p=='\n' || *p=='\r' || *p=='[')
451 xname->name.len = p - xname->name.s;
452 if(p>in->s+in->len || *p=='\0')
455 while(p<in->s+in->len && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r'))
457 if(p>in->s+in->len || *p=='\0')
466 while(p<in->s+in->len && *p!='\0')
478 if(p>in->s+in->len || *p=='\0')
483 LM_ERR("xavp [\"%.*s\"] does not get empty index param\n",
488 if(pv_parse_index(&xname->index, &idx)!=0)
490 LM_ERR("idx \"%.*s\" has an invalid index param [%.*s]\n",
491 in->len, in->s, idx.len, idx.s);
494 xname->index.type = PVT_EXTRA;
501 void pv_xavp_name_destroy(pv_xavp_name_t *xname)
506 int pv_parse_xavp_name(pv_spec_p sp, str *in)
508 pv_xavp_name_t *xname=NULL;
512 if(in->s==NULL || in->len<=0)
515 xname = (pv_xavp_name_t*)pkg_malloc(sizeof(pv_xavp_name_t));
517 LM_ERR("not enough pkg mem\n");
521 memset(xname, 0, sizeof(pv_xavp_name_t));
525 p = pv_xavp_fill_ni(&s, xname);
536 s.len = in->len - (int)(p - in->s);
538 LM_DBG("xavp sublist [%.*s] - key [%.*s]\n", xname->name.len,
539 xname->name.s, s.len, s.s);
541 xname->next = (pv_xavp_name_t*)pkg_malloc(sizeof(pv_xavp_name_t));
542 if(xname->next==NULL) {
543 LM_ERR("not enough pkg mem\n");
546 memset(xname->next, 0, sizeof(pv_xavp_name_t));
548 p = pv_xavp_fill_ni(&s, xname->next);
553 sp->pvp.pvn.u.dname = (void*)xname;
554 sp->pvp.pvn.type = PV_NAME_PVAR;
559 pv_xavp_name_destroy(xname);
565 int pv_xavp_print(sip_msg_t* msg, char* s1, char *s2)
567 xavp_print_list(NULL);
571 int pv_xavu_print(sip_msg_t* msg, char* s1, char *s2)
573 xavu_print_list(NULL);
577 int pv_xavi_print(sip_msg_t* msg, char* s1, char *s2)
579 xavi_print_list(NULL);
586 int xavp_params_explode(str *params, str *xname)
588 param_t* params_list = NULL;
589 param_hooks_t phooks;
592 sr_xavp_t *xavp=NULL;
595 if(params==NULL || xname==NULL || params->s==NULL || xname->s==NULL
596 || params->len<=0 || xname->len<=0)
598 LM_ERR("invalid parameters\n");
604 if(s.s[s.len-1]==';')
606 if (parse_params(&s, CLASS_ANY, &phooks, ¶ms_list)<0) {
607 LM_DBG("invalid formatted values [%.*s]\n", params->len, params->s);
611 if(params_list==NULL) {
616 for (pit = params_list; pit; pit=pit->next)
618 memset(&xval, 0, sizeof(sr_xval_t));
619 xval.type = SR_XTYPE_STR;
620 xval.v.s = pit->body;
621 if(xavp_add_value(&pit->name, &xval, &xavp)==NULL) {
622 free_params(params_list);
623 xavp_destroy_list(&xavp);
627 free_params(params_list);
629 /* add main xavp in root list */
630 memset(&xval, 0, sizeof(sr_xval_t));
631 xval.type = SR_XTYPE_XAVP;
633 if(xavp_add_value(xname, &xval, NULL)==NULL) {
634 xavp_destroy_list(&xavp);
641 int pv_var_to_xavp(str *varname, str *xname)
644 sr_xavp_t *avp = NULL;
647 LM_DBG("xname:%.*s varname:%.*s\n", xname->len, xname->s,
648 varname->len, varname->s);
651 xavp_rm_by_name(xname, 1, NULL);
653 if(varname->len==1 && varname->s[0] == '*') {
654 for(it=get_var_all(); it; it=it->next) {
655 memset(&xval, 0, sizeof(sr_xval_t));
656 if(it->v.flags==VAR_VAL_INT)
658 xval.type = SR_XTYPE_INT;
659 xval.v.i = it->v.value.n;
660 LM_DBG("[%.*s]: %d\n", it->name.len, it->name.s, xval.v.i);
662 if(it->v.value.s.len==0) continue;
663 xval.type = SR_XTYPE_STR;
664 xval.v.s.s = it->v.value.s.s;
665 xval.v.s.len = it->v.value.s.len;
666 LM_DBG("[%.*s]: '%.*s'\n", it->name.len, it->name.s,
667 xval.v.s.len, xval.v.s.s);
669 if(xavp_add_value(&it->name, &xval, &avp)==NULL) {
670 LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s);
675 memset(&xval, 0, sizeof(sr_xval_t));
676 xval.type = SR_XTYPE_XAVP;
678 if(xavp_add_value(xname, &xval, NULL)==NULL) {
679 LM_ERR("Can't create xavp[%.*s]\n", xname->len, xname->s);
685 it = get_var_by_name(varname);
687 LM_ERR("script var [%.*s] not found\n", varname->len, varname->s);
690 memset(&xval, 0, sizeof(sr_xval_t));
691 if(it->v.flags==VAR_VAL_INT)
693 xval.type = SR_XTYPE_INT;
694 xval.v.i = it->v.value.n;
695 LM_DBG("[%.*s]: %d\n", it->name.len, it->name.s, xval.v.i);
697 xval.type = SR_XTYPE_STR;
698 xval.v.s.s = it->v.value.s.s;
699 xval.v.s.len = it->v.value.s.len;
700 LM_DBG("[%.*s]: '%.*s'\n", it->name.len, it->name.s,
701 xval.v.s.len, xval.v.s.s);
703 if(xavp_add_xavp_value(xname, &it->name, &xval, NULL)==NULL) {
704 LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s);
711 if(avp) xavp_destroy_list(&avp);
715 int pv_xavp_to_var_helper(sr_xavp_t *avp) {
720 it = add_var(&avp->name, VAR_TYPE_ZERO);
722 if(avp->val.type==SR_XTYPE_STR){
723 flags |= VAR_VAL_STR;
724 value.s.len = avp->val.v.s.len;
725 value.s.s = avp->val.v.s.s;
726 LM_DBG("var:[%.*s] STR:[%.*s]\n", avp->name.len, avp->name.s,
727 value.s.len, value.s.s);
729 else if(avp->val.type==SR_XTYPE_INT) {
730 flags |= VAR_VAL_INT;
731 value.n = avp->val.v.i;
732 LM_DBG("var:[%.*s] INT:[%d]\n", avp->name.len, avp->name.s,
735 LM_ERR("avp type not STR nor INT\n");
738 set_var_value(it, &value, flags);
743 int pv_xavp_to_var(str *xname) {
747 LM_DBG("xname:%.*s\n", xname->len, xname->s);
749 xavp = xavp_get_by_index(xname, 0, NULL);
751 LM_ERR("xavp [%.*s] not found\n", xname->len, xname->s);
754 if(xavp->val.type!=SR_XTYPE_XAVP){
755 LM_ERR("%.*s not xavp type?\n", xname->len, xname->s);
759 avp = xavp->val.v.xavp;
762 if(pv_xavp_to_var_helper(avp)<0) return -1;
768 if(pv_xavp_to_var_helper(avp)<0) return -1;
771 xavp = xavp_get_next(xavp);
776 void pv_xavu_name_destroy(pv_xavu_name_t *xname)
781 int pv_parse_xavu_name(pv_spec_t *sp, str *in)
783 pv_xavu_name_t *xname=NULL;
787 if(in->s==NULL || in->len<=0)
790 xname = (pv_xavu_name_t*)pkg_malloc(sizeof(pv_xavu_name_t));
792 LM_ERR("not enough pkg mem\n");
796 memset(xname, 0, sizeof(pv_xavu_name_t));
801 xname->name.len = s.len;
802 for(i=0; i<s.len; i++) {
821 LM_DBG("xavp sublist [%.*s] - key [%.*s]\n", xname->name.len,
822 xname->name.s, s.len - i, s.s + i);
824 xname->next = (pv_xavu_name_t*)pkg_malloc(sizeof(pv_xavu_name_t));
825 if(xname->next==NULL) {
826 LM_ERR("not enough pkg mem\n");
829 memset(xname->next, 0, sizeof(pv_xavu_name_t));
831 xname->next->name.s = s.s + i;
832 xname->next->name.len = s.len - i;
835 sp->pvp.pvn.u.dname = (void*)xname;
836 sp->pvp.pvn.type = PV_NAME_PVAR;
841 pv_xavu_name_destroy(xname);
847 int pv_get_xavu(struct sip_msg *msg, pv_param_t *param,
850 pv_xavu_name_t *xname=NULL;
854 LM_ERR("bad parameters\n");
857 xname = (pv_xavu_name_t*)param->pvn.u.dname;
859 avu = xavu_lookup(&xname->name, NULL);
861 return pv_get_null(msg, param, res);
863 if(xname->next==NULL) {
864 return pv_xavp_get_value(msg, param, res, avu);
866 if(avu->val.type != SR_XTYPE_XAVP) {
867 return pv_get_null(msg, param, res);
870 avu = xavu_lookup(&xname->next->name, &avu->val.v.xavp);
872 return pv_get_null(msg, param, res);
874 return pv_xavp_get_value(msg, param, res, avu);
878 * $xavu(name1=>name2)
880 int pv_set_xavu(struct sip_msg* msg, pv_param_t *param,
881 int op, pv_value_t *val)
883 pv_xavu_name_t *xname=NULL;
888 LM_ERR("bad parameters\n");
891 xname = (pv_xavu_name_t*)param->pvn.u.dname;
893 if((val==NULL) || (val->flags&PV_VAL_NULL)) {
894 if(xname->next==NULL) {
895 xavu_rm_by_name(&xname->name, NULL);
899 avu = xavu_lookup(&xname->name, NULL);
900 if(avu!=NULL && avu->val.type==SR_XTYPE_XAVP) {
901 xavu_rm_by_name(&xname->next->name, &avu->val.v.xavp);
904 } /* NULL assignment */
906 /* build xavp value */
907 memset(&xval, 0, sizeof(sr_xval_t));
909 if(val->flags&PV_TYPE_INT) {
910 xval.type = SR_XTYPE_INT;
913 xval.type = SR_XTYPE_STR;
917 if(xname->next==NULL) {
918 /* set root xavu value */
919 if(xavu_set_xval(&xname->name, &xval, NULL)==NULL) {
925 /* set child xavu value */
926 if(xavu_set_child_xval(&xname->name, &xname->next->name, &xval)==NULL) {
932 void pv_xavi_name_destroy(pv_xavp_name_t *xname)
937 int pv_parse_xavi_name(pv_spec_p sp, str *in)
939 pv_xavp_name_t *xname=NULL;
943 if(in->s==NULL || in->len<=0)
946 xname = (pv_xavp_name_t*)pkg_malloc(sizeof(pv_xavp_name_t));
952 memset(xname, 0, sizeof(pv_xavp_name_t));
956 p = pv_xavp_fill_ni(&s, xname);
967 s.len = in->len - (int)(p - in->s);
969 LM_DBG("xavi sublist [%.*s] - key [%.*s]\n", xname->name.len,
970 xname->name.s, s.len, s.s);
972 xname->next = (pv_xavp_name_t*)pkg_malloc(sizeof(pv_xavp_name_t));
973 if(xname->next==NULL) {
974 LM_ERR("not enough pkg mem\n");
977 memset(xname->next, 0, sizeof(pv_xavp_name_t));
979 p = pv_xavp_fill_ni(&s, xname->next);
984 sp->pvp.pvn.u.dname = (void*)xname;
985 sp->pvp.pvn.type = PV_NAME_PVAR;
990 pv_xavi_name_destroy(xname);
996 int pv_get_xavi(struct sip_msg *msg, pv_param_t *param,
999 pv_xavp_name_t *xname=NULL;
1000 sr_xavp_t *avi=NULL;
1009 LM_ERR("bad parameters\n");
1012 xname = (pv_xavp_name_t*)param->pvn.u.dname;
1014 if(xname->index.type==PVT_EXTRA)
1017 if(pv_get_spec_index(msg, &xname->index.pvp, &idx, &idxf)!=0)
1019 LM_ERR("invalid index\n");
1026 count = xavi_count(&xname->name, NULL);
1029 avi = xavi_get_by_index(&xname->name, idx, NULL);
1031 return pv_get_null(msg, param, res);
1032 if(xname->next==NULL)
1033 return pv_xavp_get_value(msg, param, res, avi);
1034 if(avi->val.type != SR_XTYPE_XAVP)
1035 return pv_get_null(msg, param, res);
1039 if(xname->next->index.type==PVT_EXTRA)
1042 if(pv_get_spec_index(msg, &xname->next->index.pvp, &idx, &idxf)!=0)
1044 LM_ERR("invalid index\n");
1051 count = xavi_count(&xname->next->name, &avi->val.v.xavp);
1054 avi = xavi_get_by_index(&xname->next->name, idx, &avi->val.v.xavp);
1056 return pv_get_null(msg, param, res);
1057 /* get all values of second key */
1058 if(idxf==PV_IDX_ALL)
1060 p_ini = pv_get_buffer();
1062 p_size = pv_get_buffer_size();
1066 if(p-p_ini+PV_FIELD_DELIM_LEN+1>p_size)
1068 LM_ERR("local buffer length exceeded\n");
1069 return pv_get_null(msg, param, res);
1071 memcpy(p, PV_FIELD_DELIM, PV_FIELD_DELIM_LEN);
1072 p += PV_FIELD_DELIM_LEN;
1074 if(pv_xavp_get_value(msg, param, res, avi)<0)
1076 LM_ERR("can get value\n");
1077 return pv_get_null(msg, param, res);
1079 if(p-p_ini+res->rs.len+1>p_size)
1081 LM_ERR("local buffer length exceeded!\n");
1082 return pv_get_null(msg, param, res);
1084 memcpy(p, res->rs.s, res->rs.len);
1086 } while ((avi=xavi_get_next(avi))!=0);
1088 res->rs.len = p - p_ini;
1091 return pv_xavp_get_value(msg, param, res, avi);
1095 * $xavi(name1[idx1]=>name2[idx2])
1097 int pv_set_xavi(struct sip_msg* msg, pv_param_t *param,
1098 int op, pv_value_t *val)
1100 pv_xavp_name_t *xname=NULL;
1101 sr_xavp_t *avi=NULL;
1102 sr_xavp_t *list=NULL;
1112 LM_ERR("bad parameters\n");
1115 xname = (pv_xavp_name_t*)param->pvn.u.dname;
1117 if(xname->index.type==PVT_EXTRA)
1120 if(pv_get_spec_index(msg, &xname->index.pvp, &idx, &idxf)!=0)
1122 LM_ERR("invalid index\n");
1127 if((val==NULL) || (val->flags&PV_VAL_NULL))
1129 if(xname->next==NULL)
1131 if(xname->index.type==PVT_EXTRA) {
1132 if(idxf==PV_IDX_ALL) {
1133 xavi_rm_by_name(&xname->name, 1, NULL);
1138 xavi_rm_by_name(&xname->name, 0, NULL);
1144 count = xavi_count(&xname->name, NULL);
1145 idx = count + idx + 1;
1147 xavi_rm_by_index(&xname->name, idx, NULL);
1151 if(xname->next->index.type==PVT_EXTRA)
1154 if(pv_get_spec_index(msg,&xname->next->index.pvp,&idx1,&idxf1)!=0)
1156 LM_ERR("invalid index!\n");
1161 if(idxf==PV_IDX_ALL) {
1163 avi = xavi_get(&xname->name, NULL);
1165 if(avi->val.type==SR_XTYPE_XAVP) {
1166 if(xname->next->index.type==PVT_EXTRA) {
1167 if(idxf1==PV_IDX_ALL) {
1168 xavi_rm_by_name(&xname->next->name, 1,
1175 count = xavi_count(&xname->next->name,
1177 idx = count + idx1 + 1;
1179 xavi_rm_by_index(&xname->next->name, idx,
1183 xavi_rm_by_name(&xname->next->name, 0,
1187 avi = xavi_get_next(avi);
1193 avi = xavi_get(&xname->name, NULL);
1198 count = xavi_count(&xname->name, NULL);
1199 idx = count + idx + 1;
1201 avi = xavi_get_by_index(&xname->name, idx, NULL);
1204 if(avi->val.type==SR_XTYPE_XAVP) {
1205 if(xname->next->index.type==PVT_EXTRA) {
1206 if(idxf1==PV_IDX_ALL) {
1207 xavi_rm_by_name(&xname->next->name, 1,
1214 count = xavi_count(&xname->next->name,
1216 idx = count + idx1 + 1;
1218 xavi_rm_by_index(&xname->next->name, idx,
1222 xavi_rm_by_name(&xname->next->name, 0,
1228 } /* NULL assignment */
1230 /* build xavi value */
1231 memset(&xval, 0, sizeof(sr_xval_t));
1233 if(val->flags&PV_TYPE_INT)
1235 xval.type = SR_XTYPE_INT;
1238 xval.type = SR_XTYPE_STR;
1243 if(xname->next==NULL)
1245 /* xavi with single value */
1246 if(xname->index.type==PVT_EXTRA) {
1247 if(idxf==PV_IDX_ALL) {
1248 /* ignore: should iterate and set same value to all xavis
1249 * with same name?!?! */
1255 count = xavi_count(&xname->name, NULL);
1256 idx = count + idx + 1;
1259 if(xavi_set_value(&xname->name, idx, &xval, NULL)==NULL)
1264 if(xavi_add_value(&xname->name, &xval, NULL)==NULL)
1269 /* xavi with xavp list value */
1270 if(xname->next->index.type==PVT_EXTRA)
1273 if(pv_get_spec_index(msg,&xname->next->index.pvp,&idx1,&idxf1)!=0)
1275 LM_ERR("invalid index!\n");
1280 if(xname->index.type==PVT_EXTRA)
1283 if(idxf==PV_IDX_ALL) {
1284 /* ignore: should iterate and set same value to all xavis
1285 * with same name?!?! */
1290 avi = xavi_get(&xname->name, NULL);
1295 count = xavi_count(&xname->name, NULL);
1296 idx = count + idx + 1;
1298 avi = xavi_get_by_index(&xname->name, idx, NULL);
1303 if(avi->val.type!=SR_XTYPE_XAVP)
1306 if(xname->next->index.type==PVT_EXTRA) {
1307 if(idxf1==PV_IDX_ALL) {
1308 /* ignore: should iterate and set same value to all xavis
1309 * with same name?!?! */
1316 count = xavi_count(&xname->next->name,
1318 idx = count + idx1 + 1;
1321 xavi_set_value(&xname->next->name, idx, &xval, &avi->val.v.xavp);
1324 /* add new value in sublist */
1325 if(xavi_add_value(&xname->next->name, &xval, &avi->val.v.xavp)==NULL)
1329 /* add new xavi with xavp list */
1330 if(xavi_add_value(&xname->next->name, &xval, &list)==NULL)
1333 /* build xavi value */
1334 memset(&xval, 0, sizeof(sr_xval_t));
1335 xval.type = SR_XTYPE_XAVP;
1337 xavi_add_value(&xname->name, &xval, NULL);