Loading codec/c++/sip_codets.cpp +52 −17 Original line number Diff line number Diff line Loading @@ -73,14 +73,18 @@ public: private: const char* mSource; boost::regex mRegex; iterator mStart, mStop; boost::match_results<iterator> mResults; }; //WSP: space, htab, vtab, form feed #define SIPCHARS_WSP " \t\v\f" #define SIPREG_LWS "([" SIPCHARS_WSP "]*\\r\\n)?[" SIPCHARS_WSP "]+" #define SIPREG_SWS "(" SIPREG_LWS ")?" void remove_whitespace (Buffer & buffer) { static Regex reg_ws ("[ \t\r\n\f\v]+"); static Regex reg_ws ("^" SIPREG_LWS); if (reg_ws.Match (buffer)) { int nPos = buffer.GetPosition() + reg_ws.GetMatchedLength(); buffer.SetPosition (nPos); Loading @@ -104,13 +108,11 @@ void read_sp (Buffer & buffer, Variable* v) { #define SIPCHARS_UNRESERVED SIPCHARS_ALFANUM SIPCHARS_MARK #define SIPCHARS_RESERVED ";/?:@&=+$," #define SIPCHARS_USER_UNRESERVED "&=+$,;?/" #define SIPCHARS_UTF8_NONASCII "\xC0-\xFD" #define SIPCHARS_UTF8_CONTENT "\x80-\xBF" #define SIPCHARS_UTF8_NONASCII "\x80-\xFD" #define SIPREG_ESCAPED "(%[0-9A-Fa-f]{2})" #define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+" //FIXME: WSP is not clearly defined (all whitespaces) #define SIPCHARS_WSP " " // sip version #define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]" Loading @@ -120,11 +122,12 @@ void read_sp (Buffer & buffer, Variable* v) { #define SIPREG_DOMAINLABEL "[" SIPCHARS_ALFANUM "]([" SIPCHARS_ALFANUM "\\-]*[" SIPCHARS_ALFANUM "])?" #define SIPREG_HOSTNAME "(" SIPREG_DOMAINLABEL "\\.)*" SIPREG_TOPLABEL "\\.?" #define SIPREG_LWS "(?:[" SIPCHARS_WSP "]*\r\n)?[" SIPCHARS_WSP "]+" #define SIPREG_SWS "(?:" SIPREG_LWS ")?" #define SIPREG_HCOLON "[ ]*:" SIPREG_SWS // without leading and trailing whitespace #define SIPREG_QUOTED_STRING "[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|([\\x5C][\"\\x5C]))*[\"]" #define SIPREG_DISPLAY_NAME "((" SIPREG_TOKEN "(" SIPREG_LWS SIPREG_TOKEN ")*)|(" SIPREG_QUOTED_STRING "))" // IPv4 #define SIPREG_IP4 "([0-9]{1,3}\\.){3}[0-9]{1,3}" Loading Loading @@ -472,7 +475,7 @@ void StatusLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_sip_version (SIPREG_SIP_VERSION); static Regex reg_status_code ("^[0-9]{3}"); static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII SIPCHARS_UTF8_CONTENT " \t]|" SIPREG_ESCAPED ")*"); static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII " \t]|" SIPREG_ESCAPED ")*"); switch (id) { case id_sipVersion: Loading Loading @@ -701,19 +704,17 @@ void FieldName::Decode (Buffer& buffer) throw (DecodeError) void Addr_Union::PreDecode (Buffer& buffer) throw (DecodeError) { static Regex reg_scheme ("^[A-Za-z][A-Za-z0-9]*:"); static Regex reg_name_addr ("^" SIPREG_DISPLAY_NAME SIPREG_SWS "<[^\\r\\n]*>"); SetHypChosenId ( reg_scheme.Match (buffer) ? id_addrSpecUnion : id_nameAddr reg_name_addr.Match (buffer) ? id_nameAddr : id_addrSpecUnion ); } void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_semicolon ("^;"); if (id == id_fromParams) { if(reg_semicolon.Match(buffer)) { Unsigned(8).Decode(buffer); Loading @@ -722,7 +723,42 @@ void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) SetHypFieldIsPresent (id, 0); } } } void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME); static Regex reg_laquot = ("^<"); static Regex reg_uri = ("^[^\\r\\n]+"); remove_whitespace(buffer); switch (id){ case id_displayName: if (reg_display_name.Match(buffer)) { SetHypFieldIsPresent (id, 1); SetHypFieldLength (id, reg_display_name.GetMatchedLength()); } else { SetHypFieldIsPresent (id, 0); } break; case id_addrSpec: reg_laquot.AssertMatch (buffer, this); buffer.SetPosition(buffer.GetPosition() + 8); reg_uri.AssertMatch(buffer, this); SetHypFieldLength (id, reg_uri.GetMatchedLength()); break; } } void NameAddr::PostDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_raquot ("^>"); if (id == id_addrSpec) { reg_raquot.AssertMatch (buffer, this); buffer.SetPosition(buffer.GetPosition() + 8); remove_whitespace(buffer); } } void SentProtocol::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) Loading Loading @@ -800,5 +836,4 @@ void UndefinedHeader::PreDecodeField (int id, Buffer& buffer) throw (DecodeError } } }} // namespaces Loading
codec/c++/sip_codets.cpp +52 −17 Original line number Diff line number Diff line Loading @@ -73,14 +73,18 @@ public: private: const char* mSource; boost::regex mRegex; iterator mStart, mStop; boost::match_results<iterator> mResults; }; //WSP: space, htab, vtab, form feed #define SIPCHARS_WSP " \t\v\f" #define SIPREG_LWS "([" SIPCHARS_WSP "]*\\r\\n)?[" SIPCHARS_WSP "]+" #define SIPREG_SWS "(" SIPREG_LWS ")?" void remove_whitespace (Buffer & buffer) { static Regex reg_ws ("[ \t\r\n\f\v]+"); static Regex reg_ws ("^" SIPREG_LWS); if (reg_ws.Match (buffer)) { int nPos = buffer.GetPosition() + reg_ws.GetMatchedLength(); buffer.SetPosition (nPos); Loading @@ -104,13 +108,11 @@ void read_sp (Buffer & buffer, Variable* v) { #define SIPCHARS_UNRESERVED SIPCHARS_ALFANUM SIPCHARS_MARK #define SIPCHARS_RESERVED ";/?:@&=+$," #define SIPCHARS_USER_UNRESERVED "&=+$,;?/" #define SIPCHARS_UTF8_NONASCII "\xC0-\xFD" #define SIPCHARS_UTF8_CONTENT "\x80-\xBF" #define SIPCHARS_UTF8_NONASCII "\x80-\xFD" #define SIPREG_ESCAPED "(%[0-9A-Fa-f]{2})" #define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+" //FIXME: WSP is not clearly defined (all whitespaces) #define SIPCHARS_WSP " " // sip version #define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]" Loading @@ -120,11 +122,12 @@ void read_sp (Buffer & buffer, Variable* v) { #define SIPREG_DOMAINLABEL "[" SIPCHARS_ALFANUM "]([" SIPCHARS_ALFANUM "\\-]*[" SIPCHARS_ALFANUM "])?" #define SIPREG_HOSTNAME "(" SIPREG_DOMAINLABEL "\\.)*" SIPREG_TOPLABEL "\\.?" #define SIPREG_LWS "(?:[" SIPCHARS_WSP "]*\r\n)?[" SIPCHARS_WSP "]+" #define SIPREG_SWS "(?:" SIPREG_LWS ")?" #define SIPREG_HCOLON "[ ]*:" SIPREG_SWS // without leading and trailing whitespace #define SIPREG_QUOTED_STRING "[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|([\\x5C][\"\\x5C]))*[\"]" #define SIPREG_DISPLAY_NAME "((" SIPREG_TOKEN "(" SIPREG_LWS SIPREG_TOKEN ")*)|(" SIPREG_QUOTED_STRING "))" // IPv4 #define SIPREG_IP4 "([0-9]{1,3}\\.){3}[0-9]{1,3}" Loading Loading @@ -472,7 +475,7 @@ void StatusLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_sip_version (SIPREG_SIP_VERSION); static Regex reg_status_code ("^[0-9]{3}"); static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII SIPCHARS_UTF8_CONTENT " \t]|" SIPREG_ESCAPED ")*"); static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII " \t]|" SIPREG_ESCAPED ")*"); switch (id) { case id_sipVersion: Loading Loading @@ -701,19 +704,17 @@ void FieldName::Decode (Buffer& buffer) throw (DecodeError) void Addr_Union::PreDecode (Buffer& buffer) throw (DecodeError) { static Regex reg_scheme ("^[A-Za-z][A-Za-z0-9]*:"); static Regex reg_name_addr ("^" SIPREG_DISPLAY_NAME SIPREG_SWS "<[^\\r\\n]*>"); SetHypChosenId ( reg_scheme.Match (buffer) ? id_addrSpecUnion : id_nameAddr reg_name_addr.Match (buffer) ? id_nameAddr : id_addrSpecUnion ); } void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_semicolon ("^;"); if (id == id_fromParams) { if(reg_semicolon.Match(buffer)) { Unsigned(8).Decode(buffer); Loading @@ -722,7 +723,42 @@ void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) SetHypFieldIsPresent (id, 0); } } } void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME); static Regex reg_laquot = ("^<"); static Regex reg_uri = ("^[^\\r\\n]+"); remove_whitespace(buffer); switch (id){ case id_displayName: if (reg_display_name.Match(buffer)) { SetHypFieldIsPresent (id, 1); SetHypFieldLength (id, reg_display_name.GetMatchedLength()); } else { SetHypFieldIsPresent (id, 0); } break; case id_addrSpec: reg_laquot.AssertMatch (buffer, this); buffer.SetPosition(buffer.GetPosition() + 8); reg_uri.AssertMatch(buffer, this); SetHypFieldLength (id, reg_uri.GetMatchedLength()); break; } } void NameAddr::PostDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_raquot ("^>"); if (id == id_addrSpec) { reg_raquot.AssertMatch (buffer, this); buffer.SetPosition(buffer.GetPosition() + 8); remove_whitespace(buffer); } } void SentProtocol::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) Loading Loading @@ -800,5 +836,4 @@ void UndefinedHeader::PreDecodeField (int id, Buffer& buffer) throw (DecodeError } } }} // namespaces