Module: sems Branch: master Commit: 097e5f44ae39840b1bb483c9d7506912eeaef9ae URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=097e5f44ae39840b1bb483c9d7506912eeaef9ae
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Thu Sep 23 16:55:21 2010 +0200 restore file that mysteriously got corrupted --- core/sip/parse_via.cpp | 176 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 168 insertions(+), 8 deletions(-) diff --git a/core/sip/parse_via.cpp b/core/sip/parse_via.cpp index 3e0b1cf..bee265f 100644 --- a/core/sip/parse_via.cpp +++ b/core/sip/parse_via.cpp @@ -3,21 +3,19 @@ * * Copyright (C) 2007 Raphael Coeffic * - * This file is part of SEMS, a free SIP media server. + * This file is part of sems, a free SIP media server. * - * SEMS is free software; you can redistribute it and/or modify + * 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. + * (at your option) any later version * - * For a license to use the SEMS software under conditions + * For a license to use the ser 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, + * 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. @@ -497,4 +495,166 @@ inline int parse_via_params(sip_via_parm* parm, const char** c, int len) case_VIA_PARAM(VP_BRANCH1,'r','R',VP_BRANCH2); case_VIA_PARAM(VP_BRANCH2,'a','A',VP_BRANCH3); - case_VIA_ \ No newline at end of file + case_VIA_PARAM(VP_BRANCH3,'n','N',VP_BRANCH4); + case_VIA_PARAM(VP_BRANCH4,'c','C',VP_BRANCH5); + case_VIA_PARAM(VP_BRANCH5,'h','H',VP_BRANCH); + + // "re" + case_VIA_PARAM(VP_RECVD1,'c','C',VP_RECVD2); + case_VIA_PARAM(VP_RECVD2,'e','E',VP_RECVD3); + case_VIA_PARAM(VP_RECVD3,'i','I',VP_RECVD4); + case_VIA_PARAM(VP_RECVD4,'v','V',VP_RECVD5); + case_VIA_PARAM(VP_RECVD5,'e','E',VP_RECVD6); + case_VIA_PARAM(VP_RECVD6,'d','D',VP_RECVD); + + // "rp" + case_VIA_PARAM(VP_RPORT1, 'o','O',VP_RPORT2); + case_VIA_PARAM(VP_RPORT2, 'r','R',VP_RPORT3); + case_VIA_PARAM(VP_RPORT3, 't','T',VP_RPORT); + + case VP_OTHER: + goto next_param; + } + } + + switch(st){ + case VP_BRANCH: + parm->branch = (*it)->value; + DBG("parsed branch: %.*s\n",(*it)->value.len,(*it)->value.s); + break; + case VP_RECVD: + parm->recved = (*it)->value; + break; + case VP_RPORT: + parm->has_rport = true; + parm->rport = (*it)->value; + if(parm->rport.len) { + if(str2i(c2stlstr(parm->rport),parm->rport_i)) { + DBG("invalid port number in Via 'sent-by' address.\n"); + } + } + else { + parm->rport.s = (*it)->name.s + (*it)->name.len; + } + break; + } + + next_param: + continue; // makes compiler happy + } + + DBG("has_rport: %i\n",parm->has_rport); + + return ret; +} + + +int parse_via(sip_via* via, const char* beg, int len) +{ + enum { + + V_TRANS=0, + V_URI, + V_PARM_SEP, + V_PARM_SEP_SWS + }; + + + const char* c = beg; + const char* end = beg+len; + + int saved_st=0, st=V_TRANS; + + auto_ptr<sip_via_parm> parm(new sip_via_parm()); + + int ret = 0; + for(;c<end;c++){ + + switch(st){ + + case V_TRANS: + ret = parse_transport(&parm->trans, &c, end-c); + if(ret) return ret; + + st = V_URI; + break; + + case V_URI: + switch(*c){ + + case_CR_LF; + + case SP: + case HTAB: + break; + + default: + ret = parse_by(parm.get(), &c, end-c); + if(ret) return ret; + + ret = parse_via_params(parm.get(),&c,end-c); + if(ret) return ret; + + parm->eop = c; + via->parms.push_back(parm.release()); + parm.reset(new sip_via_parm()); + + st = V_PARM_SEP; + c--; + break; + } + break; + + case V_PARM_SEP: + switch(*c){ + + case_CR_LF; + + case SP: + case HTAB: + break; + + case ',': + st = V_PARM_SEP_SWS; + break; + + default: + DBG("',' expected, found '%c'\n",*c); + return MALFORMED_SIP_MSG; + } + break; + + case V_PARM_SEP_SWS: + switch(*c){ + + case_CR_LF; + + case SP: + case HTAB: + break; + + default: + st = V_TRANS; + c--; + break; + } + break; + + case_ST_CR(*c); + + case ST_LF: + case ST_CRLF: + st = saved_st; + break; + } + } + + return 0; +} + +/** EMACS ** + * Local variables: + * mode: c++ + * c-basic-offset: 4 + * End: + */ _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
