Module: sip-router
Branch: pd/outbound
Commit: 936b6892a8a0ff25b108635e48a146b7cbc3a7ff
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=936b689…
Author: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley(a)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 */