diff --git a/src/modules/jansson/jansson_funcs.c b/src/modules/jansson/jansson_funcs.c index 857b6871f0c..0ff937ee7be 100644 --- a/src/modules/jansson/jansson_funcs.c +++ b/src/modules/jansson/jansson_funcs.c @@ -92,6 +92,29 @@ int janssonmod_get(struct sip_msg* msg, char* path_in, char* src_in, char* dst) return janssonmod_get_helper(msg, &path_s, &src_s, (pv_spec_t *)dst); } +int janssonmod_pv_get(struct sip_msg* msg, char* path_in, char* src_in, char* dst) +{ + str path_s; + pv_value_t val; + int ret; + + if((pv_get_spec_value(msg, (pv_spec_t*)src_in, &val) < 0) + || ((val.flags & PV_VAL_STR) == 0)) { + ERR("cannot get json string value\n"); + return -1; + } + if (fixup_get_svalue(msg, (gparam_p)path_in, &path_s) != 0) { + ERR("cannot get path string value\n"); + return -1; + } + + ret = janssonmod_get_helper(msg, &path_s, &val.rs, (pv_spec_t*)dst); + + pv_value_destroy(&val); + + return ret; +} + #define STR_EQ_STATIC(a,b) ((a.len == sizeof(b)-1) && (strncmp(a.s, b, sizeof(b)-1)==0)) int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in, diff --git a/src/modules/jansson/jansson_funcs.h b/src/modules/jansson/jansson_funcs.h index aeaf0791b90..ce8e9d5b4a1 100644 --- a/src/modules/jansson/jansson_funcs.h +++ b/src/modules/jansson/jansson_funcs.h @@ -27,6 +27,8 @@ int janssonmod_get(struct sip_msg* msg, char* path_in, char* json_in, char* result); +int janssonmod_pv_get(struct sip_msg* msg, char* path_in, char* json_in, + char* result); int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in, char* path_in, char* value_in, char* result); int janssonmod_array_size(struct sip_msg* msg, char* json_in, diff --git a/src/modules/jansson/jansson_mod.c b/src/modules/jansson/jansson_mod.c index 6a2fe6ead66..46cfda2fec4 100644 --- a/src/modules/jansson/jansson_mod.c +++ b/src/modules/jansson/jansson_mod.c @@ -36,6 +36,8 @@ MODULE_VERSION static int mod_init(void); static int fixup_get_params(void** param, int param_no); static int fixup_get_params_free(void** param, int param_no); +static int fixup_pv_get_params(void** param, int param_no); +static int fixup_pv_get_params_free(void** param, int param_no); static int fixup_set_params(void** param, int param_no); static int fixup_set_params_free(void** param, int param_no); static int fixup_xencode(void** param, int param_no); @@ -60,6 +62,8 @@ int janssonmod_get_field(struct sip_msg* msg, char* jansson_in, char* path_in, static cmd_export_t cmds[]={ {"jansson_get", (cmd_function)janssonmod_get, 3, fixup_get_params, fixup_get_params_free, ANY_ROUTE}, + {"jansson_pv_get", (cmd_function)janssonmod_pv_get, 3, + fixup_pv_get_params, fixup_pv_get_params_free, ANY_ROUTE}, {"jansson_array_size", (cmd_function)janssonmod_array_size, 3, fixup_get_params, fixup_get_params_free, ANY_ROUTE}, {"jansson_set", (cmd_function)janssonmod_set_replace, 4, @@ -121,6 +125,34 @@ static int fixup_get_params_free(void** param, int param_no) return -1; } +static int fixup_pv_get_params(void** param, int param_no) +{ + if (param_no == 1) { + return fixup_spve_null(param, 1); + } + + if (param_no == 2 || param_no == 3) { + return fixup_pvar_null(param, 1); + } + + ERR("invalid parameter number <%d>\n", param_no); + return -1; +} + +static int fixup_pv_get_params_free(void** param, int param_no) +{ + if (param_no == 1) { + return fixup_free_spve_null(param, 1); + } + + if (param_no == 2 || param_no == 3) { + return fixup_free_pvar_null(param, 1); + } + + ERR("invalid parameter number <%d>\n", param_no); + return -1; +} + static int fixup_set_params(void** param, int param_no) { if(param_no <= 3) { @@ -232,4 +264,4 @@ int mod_register(char *path, int *dlflags, void *p1, void *p2) { sr_kemi_modules_add(sr_kemi_jansson_exports); return 0; -} \ No newline at end of file +}