[SR-Dev] git:master: Allow parser syn'ced with kamailio version

Jan Janak jan at iptel.org
Mon Mar 23 11:13:54 CET 2009


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Jan Janak <jan at iptel.org>
Date:   Fri Mar 20 17:19:22 2009 +0100

Allow parser syn'ced with kamailio version

Sync'ed parse_allow_header() prototype name with implementation. New
parse_allow() function that work over sim_msg structure

Signed-off-by: Jan Janak <jan at iptel.org>

---

 parser/hf.c          |    2 +
 parser/parse_allow.c |   83 +++++++++++++++++++++++++++++++++++++++-----------
 parser/parse_allow.h |   28 ++++++++++++++--
 3 files changed, 91 insertions(+), 22 deletions(-)

diff --git a/parser/hf.c b/parser/hf.c
index c5f7ba3..f33aaa1 100644
--- a/parser/hf.c
+++ b/parser/hf.c
@@ -52,6 +52,7 @@
 #include "parse_subscription_state.h"
 #include "contact/parse_contact.h"
 #include "parse_disposition.h"
+#include "parse_allow.h"
 #include "../ut.h"
 
 
@@ -138,6 +139,7 @@ void clean_hdr_field(struct hdr_field* hf)
 			break;
 
 		case HDR_ALLOW_T:
+			free_allow_header(hf);
 			break;
 
 		case HDR_EVENT_T:
diff --git a/parser/parse_allow.c b/parser/parse_allow.c
index 62cec93..ce435ac 100644
--- a/parser/parse_allow.c
+++ b/parser/parse_allow.c
@@ -43,41 +43,88 @@
  */
 int parse_allow_header(struct hdr_field* _hf)
 {
-	unsigned int* methods;
-	
+	struct allow_body* ab = 0;
+
 	if (!_hf) {
 		LOG(L_ERR, "parse_allow_header: Invalid parameter value\n");
 		return -1;
 	}
 	
-	     /* maybe the header is already parsed! */
+	/* maybe the header is already parsed! */
  	if (_hf->parsed) {
  		return 0;
 	}
 
-	     /* bad luck! :-( - we have to parse it */
-	methods = pkg_malloc(sizeof(unsigned int));
- 	if (methods == 0) {
- 		LOG(L_ERR, "ERROR:parse_allow_header: Out of pkg_memory\n");
- 		return -1;
- 	}
+	ab = (struct allow_body*)pkg_malloc(sizeof(struct allow_body));
+	if (ab == 0) {
+		LOG(L_ERR, "ERROR:parse_allow_header: out of pkg_memory\n");
+		return -1;
+	}
+	memset(ab,'\0', sizeof(struct allow_body));
+	
+	if (parse_methods(&(_hf->body), &(ab->allow)) !=0 ) {
+		LOG(L_ERR, "ERROR:parse_allow_header: bad allow body header\n");		
+		goto error;
+	}
+	
+	ab->allow_all = 0;	
+	_hf->parsed = (void*)ab;
+ 	return 0;
+
+error:
+	if (ab) pkg_free(ab);
+	return -1;
+}
+
+/*!
+ * \brief This method is used to parse all Allow HF body.
+ * \param msg sip msg
+ * \return 0 on success,-1 on failure.
+ */
+int parse_allow(struct sip_msg *msg)
+{       
+	unsigned int allow;
+	struct hdr_field  *hdr;
+
+	/* maybe the header is already parsed! */
+	if (msg->allow && msg->allow->parsed) {
+		return 0;
+	}
 
-	if (!parse_methods(&(_hf->body), methods)) {
- 		LOG(L_ERR, "ERROR:parse_allow_header: Bad allow header\n"); 
- 		pkg_free(methods);
+	/* parse to the end in order to get all ALLOW headers */
+	if (parse_headers(msg,HDR_EOH_F,0)==-1 || !msg->allow) {
 		return -1;
- 	}
+	}
+	allow = 0;
 
- 	_hf->parsed = methods;
- 	return 0;
+	for(hdr = msg->allow ; hdr ; hdr = next_sibling_hdr(hdr)) {
+		if (hdr->parsed == 0) {
+			if(parse_allow_header(hdr) < 0) {
+				return -1;
+			}
+		}
+
+		allow |= ((struct allow_body*)hdr->parsed)->allow;
+	}
+	
+	((struct allow_body*)msg->allow->parsed)->allow_all = allow;
+    return 0;
 }
 
 
 /*
  * Release memory
  */
-void free_allow(unsigned int** _methods)
+void free_allow_body(struct allow_body **ab)
+{
+	if (ab && *ab) {	
+		pkg_free(*ab);		
+		*ab = 0;
+	}
+}
+
+
+void free_allow_header(struct hdr_field* hf)
 {
-	if (_methods && *_methods) pkg_free(*_methods);
-	*_methods = 0;
+	free_allow_body((struct allow_body**)(void*)(&(hf->parsed)));
 }
diff --git a/parser/parse_allow.h b/parser/parse_allow.h
index b939c7a..743e6bb 100644
--- a/parser/parse_allow.h
+++ b/parser/parse_allow.h
@@ -29,23 +29,43 @@
 #define PARSE_ALLOW_H
  
 #include "hf.h"
+#include "msg_parser.h"
 
  
 /* 
- * casting macro for accessing RPID body 
+ * casting macro for accessing Allow body 
  */
-#define get_allow_methods(p_msg) (unsigned int)(p_msg)->allow->parsed)
+#define get_allow_methods(p_msg)							\
+	(((struct allow_body*)(p_msg)->allow->parsed)->allow_all)
+
+
+struct allow_body {
+	unsigned int allow;     /* allow mask for the current hdr */
+	unsigned int allow_all; /* allow mask for the all allow hdr - it's
+							 * set only for the first hdr in sibling
+							 * list*/
+};
+
+
+/*
+ * Parse all Allow HFs
+ */
+int parse_allow(struct sip_msg *msg);
 
 
 /*
  * Parse Allow HF body
  */
-int parse_allow(struct hdr_field* _h);
+int parse_allow_header(struct hdr_field* _h);
 
 
 /*
  * Release memory
  */
-void free_allow(unsigned int** _methods);
+void free_allow_body(struct allow_body **ab);
+
+void free_allow_header(struct hdr_field* hf);
+
+
 
 #endif /* PARSE_ALLOW_H */




More information about the sr-dev mailing list