Module: sip-router
Branch: master
Commit: 06982365e6d361d8fb78e1ece579eb1de87db643
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=06982365e6d361d8fb78e1ece579eb1de87db643

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
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
 


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to