Loading codec/c++/sip_codets.cpp +56 −4 Original line number Diff line number Diff line Loading @@ -144,6 +144,7 @@ bool is_tel_scheme (const char * pszScheme) { #define SIPREG_HCOLON "[ ]*:" SIPREG_SWS #define SIPREG_COMMA SIPREG_SWS "[,]" SIPREG_SWS #define SIPREG_SEMI SIPREG_SWS "[;]" SIPREG_SWS #define SIPREG_EQUAL SIPREG_SWS "[=]" SIPREG_SWS // without leading and trailing whitespace #define SIPREG_QUOTED_STRING "[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|([\\x5C][\"\\x5C]))*[\"]" Loading Loading @@ -177,6 +178,8 @@ bool is_tel_scheme (const char * pszScheme) { #define SIPREG_TELPARAM_VALUE "([\\x21\\x23-\\x3A\\x3C-\\x7E]+|(" SIPREG_QUOTED_STRING "))" #define SIPREG_TELPARAMS "([;]" SIPREG_TELPARAM_NAME "([=]" SIPREG_TELPARAM_VALUE ")?)+" #define SIPREG_CPARAM "[\\x21\\x23-\\x2B\\x2D-\\x3C\\x3E-\\x7E]" void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { Loading Loading @@ -364,9 +367,21 @@ void AmpersandParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeE SetHypSize(-2); } void CommaParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); if (!buffer.GetBitsLeft() || GetSize() == 0) return; if (reg_separator.Match(buffer)) buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength()); else SetHypSize(-2); } void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_equals ("^="); static Regex reg_equal ("^" SIPREG_EQUAL); static Regex reg_pparname ("^" SIPREG_PPARAM "+"); static Regex reg_pparvalue ("^" SIPREG_PPARAM "*"); Loading @@ -377,6 +392,9 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) static Regex reg_telparname ("^" SIPREG_TELPARAM_NAME); static Regex reg_telparvalue ("^" SIPREG_TELPARAM_VALUE); static Regex reg_cparname ("^" SIPREG_CPARAM "+"); static Regex reg_cparvalue ("^(" SIPREG_CPARAM "+)|(" SIPREG_QUOTED_STRING ")"); Regex * preg_name; Regex * preg_value; bool bMandatoryParam = false; Loading Loading @@ -407,6 +425,8 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) bMandatoryParam = true; } else if (strcmp(pszParName, "CommaParam_List") == 0){ preg_name = ®_cparname; preg_value = ®_cparvalue; } else { std::string message ("Unexpected parent type of parameter record: '"); Loading @@ -422,9 +442,9 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) break; case id_paramValue: if (bMandatoryParam) reg_equals.AssertMatch(buffer, this); if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equals.Match(buffer))) { buffer.SetPosition(buffer.GetPosition() + 8); reg_equal.AssertMatch(buffer, this); if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equal.Match(buffer))) { buffer.SetPosition(buffer.GetPosition() + reg_equal.GetMatchedLength()); preg_value->AssertMatch (buffer, this); SetHypFieldIsPresent (id, 1); SetHypFieldLength (id, preg_value->GetMatchedLength()); Loading Loading @@ -648,6 +668,9 @@ private: SIP_HEADER_ADD (Require, , require, REQUIRE_E); SIP_HEADER_ADD (Proxy-Require, , proxyRequire, PROXY_REQUIRE_E); SIP_HEADER_ADD (Record-Route, , recordRoute, RECORD_ROUTE_E); SIP_HEADER_ADD (Allow, , allow, ALLOW_E); SIP_HEADER_ADD (Authentication-Info, , authenticationInfo, AUTHENTICATION_INFO_E); { mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, "")); Entry& e = *mEntries.rbegin(); Loading Loading @@ -1045,6 +1068,35 @@ void AlertInfoBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeEr SetHypSize(-2); } void Allow::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ static Regex reg_allow ("^[^,\\r\\n]"); if (id == id_methods){ if(reg_allow.Match(buffer)) { SetHypFieldIsPresent (id, 1); } else { SetHypFieldIsPresent (id, 0); } } } void Method_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); static Regex reg_content ("^[]" SIPREG_TOKEN); if (!buffer.GetBitsLeft()) return; bool bSeparated = reg_separator.Match(buffer); if (bSeparated) buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength()); if (GetSize() == 0 || bSeparated) { reg_content.AssertMatch(buffer, this); SetHypFieldLength(reg_content.GetMatchedLength()); } else SetHypSize(-2); } void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME); Loading Loading
codec/c++/sip_codets.cpp +56 −4 Original line number Diff line number Diff line Loading @@ -144,6 +144,7 @@ bool is_tel_scheme (const char * pszScheme) { #define SIPREG_HCOLON "[ ]*:" SIPREG_SWS #define SIPREG_COMMA SIPREG_SWS "[,]" SIPREG_SWS #define SIPREG_SEMI SIPREG_SWS "[;]" SIPREG_SWS #define SIPREG_EQUAL SIPREG_SWS "[=]" SIPREG_SWS // without leading and trailing whitespace #define SIPREG_QUOTED_STRING "[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|([\\x5C][\"\\x5C]))*[\"]" Loading Loading @@ -177,6 +178,8 @@ bool is_tel_scheme (const char * pszScheme) { #define SIPREG_TELPARAM_VALUE "([\\x21\\x23-\\x3A\\x3C-\\x7E]+|(" SIPREG_QUOTED_STRING "))" #define SIPREG_TELPARAMS "([;]" SIPREG_TELPARAM_NAME "([=]" SIPREG_TELPARAM_VALUE ")?)+" #define SIPREG_CPARAM "[\\x21\\x23-\\x2B\\x2D-\\x3C\\x3E-\\x7E]" void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { Loading Loading @@ -364,9 +367,21 @@ void AmpersandParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeE SetHypSize(-2); } void CommaParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); if (!buffer.GetBitsLeft() || GetSize() == 0) return; if (reg_separator.Match(buffer)) buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength()); else SetHypSize(-2); } void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_equals ("^="); static Regex reg_equal ("^" SIPREG_EQUAL); static Regex reg_pparname ("^" SIPREG_PPARAM "+"); static Regex reg_pparvalue ("^" SIPREG_PPARAM "*"); Loading @@ -377,6 +392,9 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) static Regex reg_telparname ("^" SIPREG_TELPARAM_NAME); static Regex reg_telparvalue ("^" SIPREG_TELPARAM_VALUE); static Regex reg_cparname ("^" SIPREG_CPARAM "+"); static Regex reg_cparvalue ("^(" SIPREG_CPARAM "+)|(" SIPREG_QUOTED_STRING ")"); Regex * preg_name; Regex * preg_value; bool bMandatoryParam = false; Loading Loading @@ -407,6 +425,8 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) bMandatoryParam = true; } else if (strcmp(pszParName, "CommaParam_List") == 0){ preg_name = ®_cparname; preg_value = ®_cparvalue; } else { std::string message ("Unexpected parent type of parameter record: '"); Loading @@ -422,9 +442,9 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) break; case id_paramValue: if (bMandatoryParam) reg_equals.AssertMatch(buffer, this); if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equals.Match(buffer))) { buffer.SetPosition(buffer.GetPosition() + 8); reg_equal.AssertMatch(buffer, this); if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equal.Match(buffer))) { buffer.SetPosition(buffer.GetPosition() + reg_equal.GetMatchedLength()); preg_value->AssertMatch (buffer, this); SetHypFieldIsPresent (id, 1); SetHypFieldLength (id, preg_value->GetMatchedLength()); Loading Loading @@ -648,6 +668,9 @@ private: SIP_HEADER_ADD (Require, , require, REQUIRE_E); SIP_HEADER_ADD (Proxy-Require, , proxyRequire, PROXY_REQUIRE_E); SIP_HEADER_ADD (Record-Route, , recordRoute, RECORD_ROUTE_E); SIP_HEADER_ADD (Allow, , allow, ALLOW_E); SIP_HEADER_ADD (Authentication-Info, , authenticationInfo, AUTHENTICATION_INFO_E); { mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, "")); Entry& e = *mEntries.rbegin(); Loading Loading @@ -1045,6 +1068,35 @@ void AlertInfoBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeEr SetHypSize(-2); } void Allow::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ static Regex reg_allow ("^[^,\\r\\n]"); if (id == id_methods){ if(reg_allow.Match(buffer)) { SetHypFieldIsPresent (id, 1); } else { SetHypFieldIsPresent (id, 0); } } } void Method_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); static Regex reg_content ("^[]" SIPREG_TOKEN); if (!buffer.GetBitsLeft()) return; bool bSeparated = reg_separator.Match(buffer); if (bSeparated) buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength()); if (GetSize() == 0 || bSeparated) { reg_content.AssertMatch(buffer, this); SetHypFieldLength(reg_content.GetMatchedLength()); } else SetHypSize(-2); } void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME); Loading