|
@@ -843,4 +843,65 @@ sr_xavp_t* xavp_get_child_with_sval(str *rname, str *cname)
|
|
|
|
|
|
return vavp;
|
|
return vavp;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * serialize the values in subfields of an xavp in name=value; format
|
|
|
|
+ * - rname - name of the root list xavp
|
|
|
|
+ * - obuf - buffer were to write the output
|
|
|
|
+ * - olen - the size of obuf
|
|
|
|
+ * return: 0 - not found; -1 - error; >0 - length of output
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+int xavp_serialize_fields(str *rname, char *obuf, int olen)
|
|
|
|
+{
|
|
|
|
+ sr_xavp_t *ravp = NULL;
|
|
|
|
+ sr_xavp_t *avp = NULL;
|
|
|
|
+ str ostr;
|
|
|
|
+ int rlen;
|
|
|
|
+
|
|
|
|
+ ravp = xavp_get(rname, NULL);
|
|
|
|
+ if(ravp==NULL || ravp->val.type!=SR_XTYPE_XAVP) {
|
|
|
|
+ /* not found or not holding subfields */
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rlen = 0;
|
|
|
|
+ ostr.s = obuf;
|
|
|
|
+ avp = ravp->val.v.xavp;
|
|
|
|
+ while(avp) {
|
|
|
|
+ switch(avp->val.type) {
|
|
|
|
+ case SR_XTYPE_INT:
|
|
|
|
+ LM_DBG(" XAVP int value: %d\n", avp->val.v.i);
|
|
|
|
+ ostr.len = snprintf(ostr.s, olen-rlen, "%.*s=%u;",
|
|
|
|
+ avp->name.len, avp->name.s, (unsigned int)avp->val.v.i);
|
|
|
|
+ if(ostr.len<=0 || ostr.len>=olen-rlen) {
|
|
|
|
+ LM_ERR("failed to serialize int value (%d/%d\n",
|
|
|
|
+ ostr.len, olen-rlen);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case SR_XTYPE_STR:
|
|
|
|
+ LM_DBG(" XAVP str value: %s\n", avp->val.v.s.s);
|
|
|
|
+ ostr.len = snprintf(ostr.s, olen-rlen, "%.*s=%.*s;",
|
|
|
|
+ avp->name.len, avp->name.s,
|
|
|
|
+ avp->val.v.s.len, avp->val.v.s.s);
|
|
|
|
+ if(ostr.len<=0 || ostr.len>=olen-rlen) {
|
|
|
|
+ LM_ERR("failed to serialize int value (%d/%d\n",
|
|
|
|
+ ostr.len, olen-rlen);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ LM_DBG("skipping value type: %d\n", avp->val.type);
|
|
|
|
+ ostr.len = 0;
|
|
|
|
+ }
|
|
|
|
+ if(ostr.len>0) {
|
|
|
|
+ ostr.s += ostr.len;
|
|
|
|
+ rlen += ostr.len;
|
|
|
|
+ }
|
|
|
|
+ avp = avp->next;
|
|
|
|
+ }
|
|
|
|
+ return rlen;
|
|
|
|
+}
|
|
#endif
|
|
#endif
|