Skip to content

Commit

Permalink
jansson: added jansson_pv_get(...)
Browse files Browse the repository at this point in the history
- similar to jansson_geet(), but the input has to be a single variable
  name, not a dynamic string
  • Loading branch information
miconda committed Nov 17, 2022
1 parent a83e44b commit 3ce5c42
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 1 deletion.
23 changes: 23 additions & 0 deletions src/modules/jansson/jansson_funcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions src/modules/jansson/jansson_funcs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
34 changes: 33 additions & 1 deletion src/modules/jansson/jansson_mod.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
}

0 comments on commit 3ce5c42

Please sign in to comment.