diff --git a/src/modules/kazoo/kz_json.c b/src/modules/kazoo/kz_json.c index 1211bc4b8cc..7911489eafb 100644 --- a/src/modules/kazoo/kz_json.c +++ b/src/modules/kazoo/kz_json.c @@ -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) { diff --git a/src/modules/kazoo/kz_json.h b/src/modules/kazoo/kz_json.h index c53d0a041af..027a532b3f4 100644 --- a/src/modules/kazoo/kz_json.h +++ b/src/modules/kazoo/kz_json.h @@ -33,6 +33,7 @@ #include +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); diff --git a/src/modules/kazoo/kz_trans.c b/src/modules/kazoo/kz_trans.c index 0c25105f849..59e555161e0 100644 --- a/src/modules/kazoo/kz_trans.c +++ b/src/modules/kazoo/kz_trans.c @@ -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'; @@ -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: @@ -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) diff --git a/src/modules/kazoo/kz_trans.h b/src/modules/kazoo/kz_trans.h index 7831664a652..0130e279073 100644 --- a/src/modules/kazoo/kz_trans.h +++ b/src/modules/kazoo/kz_trans.h @@ -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);