Module: sip-router Branch: pd/outbound Commit: 936b6892a8a0ff25b108635e48a146b7cbc3a7ff URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=936b6892...
Author: Peter Dunkley peter.dunkley@crocodile-rcs.com Committer: Peter Dunkley peter.dunkley@crocodile-rcs.com Date: Wed Feb 27 14:03:27 2013 +0000
lib/kcore: added parser for Require: header
---
lib/kcore/parse_require.c | 71 +++++++++++++++++++++++++++++++++++++++++++++ lib/kcore/parse_require.h | 48 ++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 0 deletions(-)
diff --git a/lib/kcore/parse_require.c b/lib/kcore/parse_require.c new file mode 100644 index 0000000..7bb1a3d --- /dev/null +++ b/lib/kcore/parse_require.c @@ -0,0 +1,71 @@ +/* + * $Id$ + * + * This file is part of Kamailio, a free SIP server. + * + * Kamailio is free software; you can redistribute it and/or modify + * 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 + * + * Kamailio is distributed in the hope that it will be useful, + * 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 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/*! + * \file + * \brief Require parser + * \ingroup parser + */ + +#include "../../mem/mem.h" +#include "parse_require.h" + +/*! + * Parse all Require headers + */ +int parse_require( struct sip_msg *msg) +{ + unsigned int require; + struct hdr_field *hdr; + struct option_tag_body *rb; + + /* maybe the header is already parsed! */ + if (msg->require && msg->require->parsed) + return 0; + + /* parse to the end in order to get all SUPPORTED headers */ + if (parse_headers(msg,HDR_EOH_F,0)==-1 || !msg->require) + return -1; + + /* bad luck! :-( - we have to parse them */ + require = 0; + for( hdr=msg->require ; hdr ; hdr=next_sibling_hdr(hdr)) { + if (hdr->parsed) { + require |= ((struct option_tag_body*)hdr->parsed)->option_tags; + continue; + } + + rb = (struct option_tag_body*)pkg_malloc(sizeof(struct option_tag_body)); + if (rb == 0) { + LM_ERR("out of pkg_memory\n"); + return -1; + } + + parse_option_tag_body(&(hdr->body), &(rb->option_tags)); + rb->hfree = hf_free_option_tag; + rb->option_tags_all = 0; + hdr->parsed = (void*)rb; + require |= rb->option_tags; + } + + ((struct option_tag_body*)msg->require->parsed)->option_tags_all = + require; + return 0; +} diff --git a/lib/kcore/parse_require.h b/lib/kcore/parse_require.h new file mode 100644 index 0000000..9214455 --- /dev/null +++ b/lib/kcore/parse_require.h @@ -0,0 +1,48 @@ +/* + * $Id$ + * + * This file is part of Kamailio, a free SIP server. + * + * Kamailio is free software; you can redistribute it and/or modify + * 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 + * + * Kamailio is distributed in the hope that it will be useful, + * 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 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + * \file + * \brief Require parser + * \ingroup parser + */ + +#ifndef PARSE_REQUIRE_H +#define PARSE_REQUIRE_H + +#include "../../parser/msg_parser.h" +#include "../../parser/hf.h" +#include "../../mem/mem.h" +#include "option-tags.h" + +#define get_require(p_msg) \ + ((p_msg)->require ? ((struct option_tag_body*)(p_msg)->require->parsed)->option_tags_all : 0) + + +/*! + * Parse all Require headers. + */ +int parse_require( struct sip_msg *msg); + + +void free_require(struct option_tag_body **rb); + +#endif /* PARSE_REQUIRE_H */