parser/parse_allow.c
6def693e
 /*
  * Copyright (c) 2004 Juha Heinanen
  *
07ca8c05
  * This file is part of Kamailio, a free SIP server.
6def693e
  *
07ca8c05
  * Kamailio is free software; you can redistribute it and/or modify
6def693e
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version
  *
07ca8c05
  * Kamailio is distributed in the hope that it will be useful,
6def693e
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
9e1ff448
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
6def693e
  */
 
7b7456b0
 /*! \file
  * \brief Parser :: Allow header
  *
  * \ingroup parser
  */
 
 
6def693e
 #include <stdlib.h>
 #include <string.h>
 #include "../dprint.h"
 #include "../mem/mem.h"
 #include "parse_allow.h"
 #include "parse_methods.h"
 #include "msg_parser.h"
 
  
7b7456b0
 /*! \brief
6def693e
  * This method is used to parse Allow header.
  *
c867df9a
  * \param _hf message header field
7af69774
  * \return 0 on success, -1 on failure.
6def693e
  */
 int parse_allow_header(struct hdr_field* _hf)
 {
0d54a775
 	struct allow_body* ab = 0;
 
6def693e
 	if (!_hf) {
 		LOG(L_ERR, "parse_allow_header: Invalid parameter value\n");
 		return -1;
 	}
 	
0d54a775
 	/* maybe the header is already parsed! */
6def693e
  	if (_hf->parsed) {
  		return 0;
 	}
 
0d54a775
 	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;
 	}
6def693e
 
0d54a775
 	/* parse to the end in order to get all ALLOW headers */
 	if (parse_headers(msg,HDR_EOH_F,0)==-1 || !msg->allow) {
6def693e
 		return -1;
0d54a775
 	}
 	allow = 0;
6def693e
 
0d54a775
 	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;
6def693e
 }
 
 
 /*
  * Release memory
  */
0d54a775
 void free_allow_body(struct allow_body **ab)
 {
 	if (ab && *ab) {	
 		pkg_free(*ab);		
 		*ab = 0;
 	}
 }
 
 
 void free_allow_header(struct hdr_field* hf)
6def693e
 {
0d54a775
 	free_allow_body((struct allow_body**)(void*)(&(hf->parsed)));
6def693e
 }