Loading codec/c++/sip_codets.cpp +78 −3 Original line number Diff line number Diff line Loading @@ -131,6 +131,7 @@ bool is_tel_scheme (const char * pszScheme) { #define SIPREG_ESCAPED "(%[0-9A-Fa-f]{2})" #define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+" #define SIPREG_WORD "(?:[][" SIPCHARS_ALFANUM "\\-.!%*_+`'~()<>:\\\\\"/?{}])+" #define SIPREG_ASCII_WITHOUT_COMMA "[\\x21-\\x2B\\x2D-\\x7E]+" // sip version #define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]" Loading Loading @@ -640,6 +641,8 @@ private: SIP_HEADER_ADD (Content-Type, c, contentType, CONTENT_TYPE_E); SIP_HEADER_ADD (Contact, m, contact, CONTACT_E); SIP_HEADER_ADD (To, t, toField, TO_E); SIP_HEADER_ADD (Accept-Encoding, , acceptEncoding, ACCEPT_ENCODING_E); SIP_HEADER_ADD (Accept-Language, , acceptLanguage, ACCEPT_LANGUAGE_E); { mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, "")); Entry& e = *mEntries.rbegin(); Loading Loading @@ -821,7 +824,7 @@ void ContactAddress_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeE void ContactAddress::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_semicolon ("^;"); static Regex reg_semicolon ("^" SIPREG_SEMI); if (id == id_contactParams) { if(reg_semicolon.Match(buffer)) { SetHypFieldIsPresent (id, 1); Loading Loading @@ -868,8 +871,8 @@ void Accept::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ void AcceptBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_media_range ("^[^;,\\r\\n]+"); static Regex reg_semicolon ("^;"); static Regex reg_media_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+"); static Regex reg_semicolon ("^" SIPREG_SEMI); switch (id){ case id_mediaRange: reg_media_range.AssertMatch (buffer, this); Loading Loading @@ -898,6 +901,78 @@ void AcceptBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError SetHypSize(-2); } void AcceptEncoding::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ static Regex reg_content_coding ("^[^,\\r\\n]+"); if (id == id_contentCoding){ if(reg_content_coding.Match(buffer)) { SetHypFieldIsPresent (id, 1); } else { SetHypFieldIsPresent (id, 0); } } } void ContentCoding_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA); 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); SetHypLength(reg_content.GetMatchedLength()); } else SetHypSize(-2); } void AcceptLanguage::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ static Regex reg_language_body ("^[^;,\\r\\n]+"); if (id == id_languageBody){ if(reg_language_body.Match(buffer)) { SetHypFieldIsPresent (id, 1); } else { SetHypFieldIsPresent (id, 0); } } } void LanguageBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_language_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+"); static Regex reg_semicolon ("^" SIPREG_SEMI); switch (id){ case id_languageRange: reg_language_range.AssertMatch (buffer, this); SetHypFieldLength(id, reg_language_range.GetMatchedLength()); break; case id_acceptParam: if (reg_semicolon.Match (buffer)) { SetHypFieldIsPresent(id, 1); } else { SetHypFieldIsPresent(id, 0); } } } void LanguageBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); if (!buffer.GetBitsLeft()) return; if (GetSize() == 0) return; // at least one element must be present else if (reg_separator.Match(buffer)) buffer.SetPosition(buffer.GetPosition() + reg_separator.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 +78 −3 Original line number Diff line number Diff line Loading @@ -131,6 +131,7 @@ bool is_tel_scheme (const char * pszScheme) { #define SIPREG_ESCAPED "(%[0-9A-Fa-f]{2})" #define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+" #define SIPREG_WORD "(?:[][" SIPCHARS_ALFANUM "\\-.!%*_+`'~()<>:\\\\\"/?{}])+" #define SIPREG_ASCII_WITHOUT_COMMA "[\\x21-\\x2B\\x2D-\\x7E]+" // sip version #define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]" Loading Loading @@ -640,6 +641,8 @@ private: SIP_HEADER_ADD (Content-Type, c, contentType, CONTENT_TYPE_E); SIP_HEADER_ADD (Contact, m, contact, CONTACT_E); SIP_HEADER_ADD (To, t, toField, TO_E); SIP_HEADER_ADD (Accept-Encoding, , acceptEncoding, ACCEPT_ENCODING_E); SIP_HEADER_ADD (Accept-Language, , acceptLanguage, ACCEPT_LANGUAGE_E); { mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, "")); Entry& e = *mEntries.rbegin(); Loading Loading @@ -821,7 +824,7 @@ void ContactAddress_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeE void ContactAddress::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_semicolon ("^;"); static Regex reg_semicolon ("^" SIPREG_SEMI); if (id == id_contactParams) { if(reg_semicolon.Match(buffer)) { SetHypFieldIsPresent (id, 1); Loading Loading @@ -868,8 +871,8 @@ void Accept::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ void AcceptBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_media_range ("^[^;,\\r\\n]+"); static Regex reg_semicolon ("^;"); static Regex reg_media_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+"); static Regex reg_semicolon ("^" SIPREG_SEMI); switch (id){ case id_mediaRange: reg_media_range.AssertMatch (buffer, this); Loading Loading @@ -898,6 +901,78 @@ void AcceptBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError SetHypSize(-2); } void AcceptEncoding::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ static Regex reg_content_coding ("^[^,\\r\\n]+"); if (id == id_contentCoding){ if(reg_content_coding.Match(buffer)) { SetHypFieldIsPresent (id, 1); } else { SetHypFieldIsPresent (id, 0); } } } void ContentCoding_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA); 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); SetHypLength(reg_content.GetMatchedLength()); } else SetHypSize(-2); } void AcceptLanguage::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){ static Regex reg_language_body ("^[^;,\\r\\n]+"); if (id == id_languageBody){ if(reg_language_body.Match(buffer)) { SetHypFieldIsPresent (id, 1); } else { SetHypFieldIsPresent (id, 0); } } } void LanguageBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_language_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+"); static Regex reg_semicolon ("^" SIPREG_SEMI); switch (id){ case id_languageRange: reg_language_range.AssertMatch (buffer, this); SetHypFieldLength(id, reg_language_range.GetMatchedLength()); break; case id_acceptParam: if (reg_semicolon.Match (buffer)) { SetHypFieldIsPresent(id, 1); } else { SetHypFieldIsPresent(id, 0); } } } void LanguageBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_separator ("^" SIPREG_COMMA); if (!buffer.GetBitsLeft()) return; if (GetSize() == 0) return; // at least one element must be present else if (reg_separator.Match(buffer)) buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength()); else SetHypSize(-2); } void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME); Loading