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

Reply via email to