Module: sip-router Branch: master Commit: 4a79fcdd9965c6c3195601baeb82d489d970aa12 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4a79fcdd...
Author: Victor Seva linuxmaniac@torreviejawireless.org Committer: Victor Seva linuxmaniac@torreviejawireless.org Date: Tue Jul 9 15:55:35 2013 +0200
modules/app_lua: fix sr.xavp.get. Get all the values not only the first one.
---
modules/app_lua/app_lua_sr.c | 65 ++++++++++++++++++++++++++++++++--------- 1 files changed, 50 insertions(+), 15 deletions(-)
diff --git a/modules/app_lua/app_lua_sr.c b/modules/app_lua/app_lua_sr.c index 93b89b8..4075ef8 100644 --- a/modules/app_lua/app_lua_sr.c +++ b/modules/app_lua/app_lua_sr.c @@ -1151,42 +1151,40 @@ static int lua_sr_push_str_list_table(lua_State *L, struct str_list *list) { return 1; }
+static int lua_sr_push_xavp_table(lua_State *L, sr_xavp_t *xavp); + /** - * creates and push a table to the lua stack with - * the elements of the xavp + * creates and push a table for the key name in xavp */ -static int lua_sr_push_xavp_table(lua_State *L, sr_xavp_t *xavp) { +static void lua_sr_push_xavp_name_table(lua_State *L, sr_xavp_t *xavp, str name) { lua_Number i = 1; - sr_xavp_t *avp = NULL; + lua_Number elem = 1; + sr_xavp_t *avp = xavp;
- if(xavp->val.type!=SR_XTYPE_XAVP){ - LM_ERR("%s not xavp?\n", xavp->name.s); - return 0; + while(avp!=NULL&&!STR_EQ(avp->name,name)) + { + avp = avp->next; } - avp = xavp->val.v.xavp; - lua_newtable(L); + while(avp!=NULL){ + lua_pushnumber(L, elem); switch(avp->val.type) { case SR_XTYPE_NULL: lua_pushnil(L); - lua_setfield(L, -2, avp->name.s); break; case SR_XTYPE_INT: i = avp->val.v.i; lua_pushnumber(L, i); - lua_setfield(L, -2, avp->name.s); break; case SR_XTYPE_STR: lua_pushlstring(L, avp->val.v.s.s, avp->val.v.s.len); - lua_setfield(L, -2, avp->name.s); break; case SR_XTYPE_TIME: case SR_XTYPE_LONG: case SR_XTYPE_LLONG: case SR_XTYPE_DATA: lua_pushnil(L); - lua_setfield(L, -2, avp->name.s); LM_WARN("XAVP type:%d value not supported\n", avp->val.type); break; case SR_XTYPE_XAVP: @@ -1194,11 +1192,48 @@ static int lua_sr_push_xavp_table(lua_State *L, sr_xavp_t *xavp) { LM_ERR("xavp:%.*s subtable error. Nil value added\n", avp->name.len, avp->name.s); lua_pushnil(L); } - lua_setfield(L, -2, avp->name.s); + 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; } - avp = avp->next; + lua_rawset(L, -3); + elem = elem + 1; + avp = xavp_get_next(avp); + } + lua_setfield(L, -2, name.s); +} + +/** + * creates and push a table to the lua stack with + * the elements of the xavp + */ +static int lua_sr_push_xavp_table(lua_State *L, sr_xavp_t *xavp) { + sr_xavp_t *avp = NULL; + struct str_list *keys; + struct str_list *k; + + if(xavp->val.type!=SR_XTYPE_XAVP){ + LM_ERR("%s not xavp?\n", xavp->name.s); + return 0; } + avp = xavp->val.v.xavp; + keys = xavp_get_list_key_names(xavp); + + lua_newtable(L); + if(keys!=NULL) + { + do + { + lua_sr_push_xavp_name_table(L, avp, keys->s); + k = keys; + keys = keys->next; + pkg_free(k); + }while(keys!=NULL); + } + return 1; }