Skip to content

Commit

Permalink
kazoo: add json.count transformation
Browse files Browse the repository at this point in the history
(cherry picked from commit 551413f)
  • Loading branch information
lazedo committed Jun 28, 2017
1 parent d5d15e6 commit 2ccf97c
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 1 deletion.
18 changes: 18 additions & 0 deletions src/modules/kazoo/kz_json.c
Expand Up @@ -197,6 +197,24 @@ struct json_object * kz_json_get_field_object(str* json, str* field)
return ret;
}

int kz_json_get_count(str* json, str* field, pv_value_p dst_val)
{

struct json_object *jtree = kz_json_get_field_object(json, field);


dst_val->flags = PV_TYPE_INT | PV_VAL_INT;
dst_val->rs = kz_pv_str_empty;
dst_val->ri = 0;
if(jtree != NULL) {
if(json_object_is_type(jtree, json_type_array)) {
dst_val->ri = json_object_array_length(jtree);
}
json_object_put(jtree);
}
return 1;
}


int kz_json_get_field_ex(str* json, str* field, pv_value_p dst_val)
{
Expand Down
1 change: 1 addition & 0 deletions src/modules/kazoo/kz_json.h
Expand Up @@ -33,6 +33,7 @@
#include <json.h>


int kz_json_get_count(str* json, str* field, pv_value_p dst_val);
int kz_json_get_field(struct sip_msg* msg, char* json, char* field, char* dst);
int kz_json_get_field_ex(str* json, str* field, pv_value_p dst_val);
int kz_json_get_keys(struct sip_msg* msg, char* json, char* field, char* dst);
Expand Down
77 changes: 77 additions & 0 deletions src/modules/kazoo/kz_trans.c
Expand Up @@ -283,6 +283,8 @@ int kz_tr_eval(struct sip_msg *msg, tr_param_t *tp, int subtype, pv_value_t *val
kz_destroy_pv_value(pv);
return -1;
}

kz_free_pv_value(val);

strncpy(_kz_tr_buffer, pv->rs.s, pv->rs.len);
_kz_tr_buffer[pv->rs.len] = '\0';
Expand All @@ -293,8 +295,64 @@ int kz_tr_eval(struct sip_msg *msg, tr_param_t *tp, int subtype, pv_value_t *val
val->rs.len = pv->rs.len;

kz_destroy_pv_value(pv);

break;

case TR_KAZOO_JSON_COUNT:
if(tp==NULL)
{
LM_ERR("kazoo json.count transform invalid parameter\n");
return -1;
}

pv = kz_alloc_pv_value();
if(pv == NULL)
{
LM_ERR("kazoo json.count transform : no more private memory\n");
return -1;
}


if(tp->type == TR_PARAM_STRING)
{
v1 = tp->v.s.s;
if(fixup_spve_null(&v1, 1) != 0) {
LM_ERR("cannot get spve_value from TR_PARAM_STRING : %.*s\n", tp->v.s.len, tp->v.s.s);
return -1;
}
if (fixup_get_svalue(msg, (gparam_p)v1, &v2) != 0) {
LM_ERR("cannot get value from TR_PARAM_STRING\n");
fixup_free_spve_null(&v1, 1);
return -1;
}
fixup_free_spve_null(&v1, 1);
sv = v2;
} else {
if(pv_get_spec_value(msg, (pv_spec_p)tp->v.data, &v)!=0
|| (!(v.flags&PV_VAL_STR)) || v.rs.len<=0)
{
LM_ERR("value cannot get spec value in json transform\n");
kz_destroy_pv_value(pv);
return -1;
}
sv = v.rs;
}

if(kz_json_get_count(&val->rs, &sv, pv ) != 1) {
LM_ERR("error getting json\n");
kz_destroy_pv_value(pv);
return -1;
}

kz_free_pv_value(val);

val->flags = PV_TYPE_INT | PV_VAL_INT;
val->rs.s = NULL;
val->rs.len = 0;
val->ri = pv->ri;

kz_destroy_pv_value(pv);

break;

default:
Expand Down Expand Up @@ -400,6 +458,25 @@ char* kz_tr_parse(str* in, trans_t *t)
{
t->subtype = TR_KAZOO_ENCODE;
goto done;
} else if(name.len==10 && strncasecmp(name.s, "json.count", 10)==0) {
t->subtype = TR_KAZOO_JSON_COUNT;
if(*p!=TR_PARAM_MARKER)
{
LM_ERR("invalid json transformation: %.*s!\n", in->len, in->s);
goto error;
}
p++;
_kz_tr_parse_sparam(p, p0, tp, spec, ps, in, s);
t->params = tp;
tp = 0;
while(*p && (*p==' ' || *p=='\t' || *p=='\n')) p++;
if(*p!=TR_RBRACKET)
{
LM_ERR("invalid json transformation: %.*s!!\n",
in->len, in->s);
goto error;
}
goto done;
} else if(name.len==4 && strncasecmp(name.s, "json", 4)==0) {
t->subtype = TR_KAZOO_JSON;
if(*p!=TR_PARAM_MARKER)
Expand Down
2 changes: 1 addition & 1 deletion src/modules/kazoo/kz_trans.h
Expand Up @@ -34,7 +34,7 @@


enum _kz_tr_type { TR_NONE=0, TR_KAZOO };
enum _kz_tr_subtype { TR_KAZOO_NONE=0, TR_KAZOO_ENCODE, TR_KAZOO_JSON };
enum _kz_tr_subtype { TR_KAZOO_NONE=0, TR_KAZOO_ENCODE, TR_KAZOO_JSON, TR_KAZOO_JSON_COUNT };

char* kz_tr_parse(str *in, trans_t *tr);

Expand Down

0 comments on commit 2ccf97c

Please sign in to comment.