Module: sems Branch: master Commit: 5d5adb0e2eeec4b1a577651174d7a3c6647f6ed9 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=5d5adb0e2eeec4b1a577651174d7a3c6647f6ed9
Author: Raphael Coeffic <[email protected]> Committer: Raphael Coeffic <[email protected]> Date: Sun Feb 13 15:04:59 2011 +0100 adds separate first route parser. --- core/sip/parse_route.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++ core/sip/parse_route.h | 54 +++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 0 deletions(-) diff --git a/core/sip/parse_route.cpp b/core/sip/parse_route.cpp new file mode 100644 index 0000000..25ebb6d --- /dev/null +++ b/core/sip/parse_route.cpp @@ -0,0 +1,75 @@ +#include "parse_route.h" +#include "parse_from_to.h" +#include "parse_common.h" + +#include <memory> +using std::auto_ptr; + +sip_route::~sip_route() +{ + for(list<sip_nameaddr*>::iterator it = elmts.begin(); + it != elmts.end(); ++it) + delete *it; +} + +bool is_loose_route(const sip_uri* fr_uri) +{ + bool is_lr = false; + + if(!fr_uri->params.empty()){ + + list<sip_avp*>::const_iterator it = fr_uri->params.begin(); + for(;it != fr_uri->params.end(); it++){ + + if( ((*it)->name.len == 2) && + (!memcmp((*it)->name.s,"lr",2)) ) { + + is_lr = true; + break; + } + } + } + + return is_lr; +} + +int parse_first_route_uri(sip_header* fr) +{ + if(fr->p) return 0; + + auto_ptr<sip_nameaddr> na(new sip_nameaddr()); + const char* c = fr->value.s; + + if(parse_nameaddr(na.get(), &c, fr->value.len)<0) { + + DBG("Parsing name-addr failed\n"); + return -1; + } + + if(parse_uri(&na->uri,na->addr.s,na->addr.len) < 0) { + + DBG("Parsing route uri failed\n"); + return -1; + } + + fr->p = new sip_route(); + ((sip_route*)(fr->p))->elmts.push_back(na.release()); + + return 0; +} + +sip_uri* get_first_route_uri(sip_header* fr) +{ + int err=0; + + assert(fr); + if(!fr->p) err = parse_first_route_uri(fr); + if(err || ((sip_route*)(fr->p))->elmts.empty()) + return NULL; + + sip_nameaddr* na = ((sip_route*)(fr->p))->elmts.front(); + assert(na); + + return &(na->uri); +} + diff --git a/core/sip/parse_route.h b/core/sip/parse_route.h new file mode 100644 index 0000000..03fe18c --- /dev/null +++ b/core/sip/parse_route.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2011 Raphael Coeffic + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS 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. This program is released under + * the GPL with the additional exemption that compiling, linking, + * and/or using OpenSSL is allowed. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * [email protected] + * + * SEMS 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 + */ + + +#ifndef _parse_route_h +#define _parse_route_h + +#include "parse_header.h" + +struct sip_nameaddr; +struct sip_uri; + +struct sip_route: public sip_parsed_hdr +{ + list<sip_nameaddr*> elmts; + + sip_route() + : sip_parsed_hdr(), + elmts() + {} + + ~sip_route(); +}; + +int parse_first_route_uri(sip_header* fr); +sip_uri* get_first_route_uri(sip_header* fr); + +bool is_loose_route(const sip_uri* fr_uri); + +#endif _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
