Module: sip-router Branch: master Commit: 06982365e6d361d8fb78e1ece579eb1de87db643 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=06982365...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Tue Jun 19 15:06:03 2012 +0200
pv: new variable $cnt(...) to count the number of other array variables
- for now it supports counting AVPS - $cnt($avp(x) - returns the number of how many AVPs with name x exist - future plans - count headers with same name, xavps ...
---
modules_k/pv/pv.c | 3 ++ modules_k/pv/pv_core.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ modules_k/pv/pv_core.h | 6 ++++ 3 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/modules_k/pv/pv.c b/modules_k/pv/pv.c index 93955a1..6b7dccb 100644 --- a/modules_k/pv/pv.c +++ b/modules_k/pv/pv.c @@ -132,6 +132,9 @@ static pv_export_t mod_pvs[] = { {{"cl", (sizeof("cl")-1)}, /* */ PVT_OTHER, pv_get_content_length, 0, 0, 0, 0, 0}, + {{"cnt", sizeof("cnt")-1}, + PVT_OTHER, pv_get_cnt, 0, + pv_parse_cnt_name, 0, 0, 0 }, {{"cs", (sizeof("cs")-1)}, /* */ PVT_OTHER, pv_get_cseq, 0, 0, 0, 0, 0}, diff --git a/modules_k/pv/pv_core.c b/modules_k/pv/pv_core.c index 370ec1a..2a27490 100644 --- a/modules_k/pv/pv_core.c +++ b/modules_k/pv/pv_core.c @@ -1587,6 +1587,34 @@ int pv_get_server_id(struct sip_msg *msg, pv_param_t *param, return pv_get_sintval(msg, param, res, server_id); }
+int pv_get_cnt(struct sip_msg *msg, pv_param_t *param, + pv_value_t *res) +{ + int_str avp_name; + unsigned short avp_type = 0; + avp_search_state_t state; + pv_spec_t *pv=NULL; + unsigned int n = 0; + avp_t *avp; + + pv = (pv_spec_t*)param->pvn.u.dname; + if(pv==NULL) + return pv_get_null(msg, param, res); + + if(pv_get_avp_name(0, &pv->pvp, &avp_name, &avp_type)!=0) + { + LM_ERR("invalid AVP definition\n"); + return pv_get_null(msg, param, res); + } + avp=search_first_avp(avp_type, avp_name, NULL, &state); + while(avp) { + n++; + avp=search_next_avp(&state, NULL); + } + + return pv_get_uintval(msg, param, res, n); +} +
/********* end PV get functions *********/
@@ -2398,3 +2426,35 @@ error: return -1; }
+int pv_parse_cnt_name(pv_spec_p sp, str *in) +{ + pv_spec_t *pv=NULL; + + if(in->s==NULL || in->len<=0) + return -1; + + pv = (pv_spec_t*)pkg_malloc(sizeof(pv_spec_t)); + if(pv==NULL) + return -1; + + memset(pv, 0, sizeof(pv_spec_t)); + + if(pv_parse_spec(in, pv)==NULL) + goto error; + + if(pv->type!=PVT_AVP) + { + LM_ERR("expected avp name instead of [%.*s]\n", in->len, in->s); + goto error; + } + + sp->pvp.pvn.u.dname = (void*)pv; + sp->pvp.pvn.type = PV_NAME_PVAR; + return 0; + +error: + LM_ERR("invalid pv name [%.*s]\n", in->len, in->s); + if(pv!=NULL) + pkg_free(pv); + return -1; +} diff --git a/modules_k/pv/pv_core.h b/modules_k/pv/pv_core.h index 4fb83d5..0149d24 100644 --- a/modules_k/pv/pv_core.h +++ b/modules_k/pv/pv_core.h @@ -201,6 +201,10 @@ int pv_get_version(struct sip_msg *msg, pv_param_t *param,
int pv_get_server_id(struct sip_msg *msg, pv_param_t *param, pv_value_t *res); + +int pv_get_cnt(struct sip_msg *msg, pv_param_t *param, + pv_value_t *res); + /********* end PV get functions *********/
/********* start PV set functions *********/ @@ -270,5 +274,7 @@ int pv_parse_scriptvar_name(pv_spec_p sp, str *in);
int pv_parse_hdr_name(pv_spec_p sp, str *in);
+int pv_parse_cnt_name(pv_spec_p sp, str *in); + #endif