/** * creates and push a table for the key name in xavp * if simple_flag is != 0 it will return only the first value */ static void lua_sr_push_xavp_name_table(lua_State *L, sr_xavp_t *xavp, str name, const int simple_flag) { lua_Number i = 1; lua_Number elem = 1; sr_xavp_t *avp = xavp; while(avp!=NULL&&!STR_EQ(avp->name,name)) { avp = avp->next; } if(simple_flag==0) lua_newtable(L); while(avp!=NULL){ if(simple_flag==0) lua_pushnumber(L, elem); switch(avp->val.type) { case SR_XTYPE_NULL: lua_pushnil(L); break; case SR_XTYPE_INT: i = avp->val.v.i; lua_pushnumber(L, i); break; case SR_XTYPE_STR: lua_pushlstring(L, avp->val.v.s.s, avp->val.v.s.len); break; case SR_XTYPE_TIME: case SR_XTYPE_LONG: case SR_XTYPE_LLONG: case SR_XTYPE_DATA: lua_pushnil(L); LM_WARN("XAVP type:%d value not supported\n", avp->val.type); break; case SR_XTYPE_XAVP: if(!lua_sr_push_xavp_table(L,avp->val.v.xavp, simple_flag)){ LM_ERR("xavp:%.*s subtable error. Nil value added\n", avp->name.len, avp->name.s); lua_pushnil(L); } break; default: LM_ERR("xavp:%.*s unknown type: %d. Nil value added\n", avp->name.len, avp->name.s, avp->val.type); lua_pushnil(L); break; } if(simple_flag==0) { lua_rawset(L, -3); elem = elem + 1; avp = xavp_get_next(avp); } else { lua_setfield(L, -2, name.s); avp = NULL; } } if(simple_flag==0) lua_setfield(L, -2, name.s); }
int _cfgt_get_obj_avp_vals(str name, sr_xavp_t *xavp, srjson_doc_t *jdoc, srjson_t **jobj) { sr_xavp_t *avp = NULL; srjson_t *jobjt = NULL; *jobj = srjson_CreateArray(jdoc); if(*jobj==NULL) { LM_ERR("cannot create json object\n"); return -1; } avp = xavp; while(avp!=NULL&&!STR_EQ(avp->name,name)) { avp = avp->next; } while(avp!=NULL) { _cfgt_get_obj_xavp_val(avp, jdoc, &jobjt); srjson_AddItemToArray(jdoc, *jobj, jobjt); jobjt = NULL; avp = xavp_get_next(avp); } return 0; }
int xavp_add_last(sr_xavp_t *xavp, sr_xavp_t **list) { sr_xavp_t *prev; sr_xavp_t *crt; if (xavp==NULL) return -1; crt = xavp_get_internal(&xavp->name, list, 0, 0); prev = NULL; while(crt) { prev = crt; crt = xavp_get_next(prev); } if(prev==NULL) { /* Prepend new xavp to the list */ if(list) { xavp->next = *list; *list = xavp; } else { xavp->next = *_xavp_list_crt; *_xavp_list_crt = xavp; } } else { xavp->next = prev->next; prev->next = xavp; } return 0; }
int xavp_insert(sr_xavp_t *xavp, int idx, sr_xavp_t **list) { sr_xavp_t *crt = 0; sr_xavp_t *lst = 0; sr_xval_t val; int n = 0; int i = 0; crt = xavp_get_internal(&xavp->name, list, 0, NULL); if (idx == 0 && (!crt || crt->val.type != SR_XTYPE_NULL)) return xavp_add(xavp, list); while(crt!=NULL && n<idx) { lst = crt; n++; crt = xavp_get_next(lst); } if (crt && crt->val.type == SR_XTYPE_NULL) { xavp->next = crt->next; crt->next = xavp; xavp_rm(crt, list); return 0; } memset(&val, 0, sizeof(sr_xval_t)); val.type = SR_XTYPE_NULL; for(i=0; i<idx-n; i++) { crt = xavp_new_value(&xavp->name, &val); if(crt==NULL) return -1; if (lst == NULL) { xavp_add(crt, list); } else { crt->next = lst->next; lst->next = crt; } lst = crt; } if(lst==NULL) { LM_ERR("cannot link the xavp\n"); return -1; } xavp->next = lst->next; lst->next = xavp; return 0; }
sr_xavp_t *xavp_get_last(str *xname, sr_xavp_t **list) { sr_xavp_t *prev; sr_xavp_t *crt; crt = xavp_get_internal(xname, list, 0, 0); prev = NULL; while(crt) { prev = crt; crt = xavp_get_next(prev); } return prev; }
int _cfgt_get_obj_xavp_vals(struct sip_msg *msg, pv_param_t *param, srjson_doc_t *jdoc, srjson_t **jobjr, str *item_name) { pv_xavp_name_t *xname = (pv_xavp_name_t*)param->pvn.u.dname; sr_xavp_t *xavp = NULL; sr_xavp_t *avp = NULL; srjson_t *jobj = NULL; srjson_t *jobjt = NULL; struct str_list *keys; struct str_list *k; *jobjr = srjson_CreateArray(jdoc); if(*jobjr==NULL) { LM_ERR("cannot create json object\n"); return -1; } item_name->s = xname->name.s; item_name->len = xname->name.len; xavp = xavp_get_by_index(&xname->name, 0, NULL); if(xavp==NULL) { return 0; /* empty */ } do { if(xavp->val.type==SR_XTYPE_XAVP) { avp = xavp->val.v.xavp; jobj = srjson_CreateObject(jdoc); if(jobj==NULL) { LM_ERR("cannot create json object\n"); return -1; } keys = xavp_get_list_key_names(xavp); if(keys!=NULL) { do { _cfgt_get_obj_avp_vals(keys->s, avp, jdoc, &jobjt); srjson_AddStrItemToObject(jdoc, jobj, keys->s.s, keys->s.len, jobjt); k = keys; keys = keys->next; pkg_free(k); jobjt = NULL; }while(keys!=NULL); } } if(jobj!=NULL) { srjson_AddItemToArray(jdoc, *jobjr, jobj); jobj = NULL; } }while((xavp = xavp_get_next(xavp))!=0); return 0; }
int pv_get_xavp(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { pv_xavp_name_t *xname=NULL; sr_xavp_t *avp=NULL; int idxf = 0; int idx = 0; int count; char *p, *p_ini; int p_size; if(param==NULL) { LM_ERR("bad parameters\n"); return -1; } xname = (pv_xavp_name_t*)param->pvn.u.dname; if(xname->index.type==PVT_EXTRA) { /* get the index */ if(pv_get_spec_index(msg, &xname->index.pvp, &idx, &idxf)!=0) { LM_ERR("invalid index\n"); return -1; } } /* fix the index */ if(idx<0) { count = xavp_count(&xname->name, NULL); idx = count + idx; } avp = xavp_get_by_index(&xname->name, idx, NULL); if(avp==NULL) return pv_get_null(msg, param, res); if(xname->next==NULL) return pv_xavp_get_value(msg, param, res, avp); if(avp->val.type != SR_XTYPE_XAVP) return pv_get_null(msg, param, res); idx = 0; idxf = 0; if(xname->next->index.type==PVT_EXTRA) { /* get the index */ if(pv_get_spec_index(msg, &xname->next->index.pvp, &idx, &idxf)!=0) { LM_ERR("invalid index\n"); return -1; } } /* fix the index */ if(idx<0) { count = xavp_count(&xname->next->name, &avp->val.v.xavp); idx = count + idx; } avp = xavp_get_by_index(&xname->next->name, idx, &avp->val.v.xavp); if(avp==NULL) return pv_get_null(msg, param, res); /* get all values of second key */ if(idxf==PV_IDX_ALL) { p_ini = pv_get_buffer(); p = p_ini; p_size = pv_get_buffer_size(); do { if(p!=p_ini) { if(p-p_ini+PV_FIELD_DELIM_LEN+1>p_size) { LM_ERR("local buffer length exceeded\n"); return pv_get_null(msg, param, res); } memcpy(p, PV_FIELD_DELIM, PV_FIELD_DELIM_LEN); p += PV_FIELD_DELIM_LEN; } if(pv_xavp_get_value(msg, param, res, avp)<0) { LM_ERR("can get value\n"); return pv_get_null(msg, param, res); } if(p-p_ini+res->rs.len+1>p_size) { LM_ERR("local buffer length exceeded!\n"); return pv_get_null(msg, param, res); } memcpy(p, res->rs.s, res->rs.len); p += res->rs.len; } while ((avp=xavp_get_next(avp))!=0); res->rs.s = p_ini; res->rs.len = p - p_ini; return 0; } return pv_xavp_get_value(msg, param, res, avp); }
/** * $xavp(name1[idx1]=>name2[idx2]) */ int pv_set_xavp(struct sip_msg* msg, pv_param_t *param, int op, pv_value_t *val) { pv_xavp_name_t *xname=NULL; sr_xavp_t *avp=NULL; sr_xavp_t *list=NULL; sr_xval_t xval; int idxf = 0; int idx = 0; int idxf1 = 0; int idx1 = 0; int count; if(param==NULL) { LM_ERR("bad parameters\n"); return -1; } xname = (pv_xavp_name_t*)param->pvn.u.dname; if(xname->index.type==PVT_EXTRA) { /* get the index */ if(pv_get_spec_index(msg, &xname->index.pvp, &idx, &idxf)!=0) { LM_ERR("invalid index\n"); return -1; } } if((val==NULL) || (val->flags&PV_VAL_NULL)) { if(xname->next==NULL) { if(xname->index.type==PVT_EXTRA) { if(idxf==PV_IDX_ALL) { xavp_rm_by_name(&xname->name, 1, NULL); return 0; } } if(idx==0) { xavp_rm_by_name(&xname->name, 0, NULL); return 0; } /* fix the index */ if(idx<0) { count = xavp_count(&xname->name, NULL); idx = count + idx + 1; } xavp_rm_by_index(&xname->name, idx, NULL); return 0; } if(xname->next->index.type==PVT_EXTRA) { /* get the index */ if(pv_get_spec_index(msg,&xname->next->index.pvp,&idx1,&idxf1)!=0) { LM_ERR("invalid index!\n"); return -1; } } if(idxf==PV_IDX_ALL) { /* iterate */ avp = xavp_get(&xname->name, NULL); while(avp) { if(avp->val.type==SR_XTYPE_XAVP) { if(xname->next->index.type==PVT_EXTRA) { if(idxf1==PV_IDX_ALL) { xavp_rm_by_name(&xname->next->name, 1, &avp->val.v.xavp); } else { /* fix the index */ idx = idx1; if(idx<0) { count = xavp_count(&xname->next->name, &avp->val.v.xavp); idx = count + idx1 + 1; } xavp_rm_by_index(&xname->next->name, idx, &avp->val.v.xavp); } } else { xavp_rm_by_name(&xname->next->name, 0, &avp->val.v.xavp); } } avp = xavp_get_next(avp); } return 0; } if(idx==0) { avp = xavp_get(&xname->name, NULL); } else { /* fix the index */ if(idx<0) { count = xavp_count(&xname->name, NULL); idx = count + idx + 1; } avp = xavp_get_by_index(&xname->name, idx, NULL); } if(avp) { if(avp->val.type==SR_XTYPE_XAVP) { if(xname->next->index.type==PVT_EXTRA) { if(idxf1==PV_IDX_ALL) { xavp_rm_by_name(&xname->next->name, 1, &avp->val.v.xavp); } else { /* fix the index */ idx = idx1; if(idx<0) { count = xavp_count(&xname->next->name, &avp->val.v.xavp); idx = count + idx1 + 1; } xavp_rm_by_index(&xname->next->name, idx, &avp->val.v.xavp); } } else { xavp_rm_by_name(&xname->next->name, 0, &avp->val.v.xavp); } } } return 0; } /* NULL assignment */ /* build xavp value */ memset(&xval, 0, sizeof(sr_xval_t)); if(val->flags&PV_TYPE_INT) { xval.type = SR_XTYPE_INT; xval.v.i = val->ri; } else { xval.type = SR_XTYPE_STR; xval.v.s = val->rs; } /* where to add */ if(xname->next==NULL) { /* xavp with single value */ if(xname->index.type==PVT_EXTRA) { if(idxf==PV_IDX_ALL) { /* ignore: should iterate and set same value to all xavps * with same name?!?! */ return -1; } /* fix the index */ if(idx<0) { count = xavp_count(&xname->name, NULL); idx = count + idx + 1; } /* set the value */ if(xavp_set_value(&xname->name, idx, &xval, NULL)==NULL) return -1; return 0; } /* add new value */ if(xavp_add_value(&xname->name, &xval, NULL)==NULL) return -1; return 0; } /* xavp with xavp list value */ if(xname->next->index.type==PVT_EXTRA) { /* get the index */ if(pv_get_spec_index(msg,&xname->next->index.pvp,&idx1,&idxf1)!=0) { LM_ERR("invalid index!\n"); return -1; } } if(xname->index.type==PVT_EXTRA) { /* set the value */ if(idxf==PV_IDX_ALL) { /* ignore: should iterate and set same value to all xavps * with same name?!?! */ return 0; } if(idx==0) { avp = xavp_get(&xname->name, NULL); } else { /* fix the index */ if(idx<0) { count = xavp_count(&xname->name, NULL); idx = count + idx + 1; } avp = xavp_get_by_index(&xname->name, idx, NULL); } if(avp==NULL) return 0; if(avp->val.type!=SR_XTYPE_XAVP) return -1; if(xname->next->index.type==PVT_EXTRA) { if(idxf1==PV_IDX_ALL) { /* ignore: should iterate and set same value to all xavps * with same name?!?! */ return 0; } /* fix the index */ idx = idx1; if(idx<0) { count = xavp_count(&xname->next->name, &avp->val.v.xavp); idx = count + idx1 + 1; } /* set value */ xavp_set_value(&xname->next->name, idx, &xval, &avp->val.v.xavp); return 0; } /* add new value in sublist */ if(xavp_add_value(&xname->next->name, &xval, &avp->val.v.xavp)==NULL) return -1; return 0; } /* add new xavp with xavp list */ if(xavp_add_value(&xname->next->name, &xval, &list)==NULL) return -1; /* build xavp value */ memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_XAVP; xval.v.xavp = list; xavp_add_value(&xname->name, &xval, NULL); return 0; }