Loading codec/c++/sip_codets.cpp +26 −6 Original line number Diff line number Diff line Loading @@ -7,9 +7,9 @@ namespace t3devlib { namespace gen { class Regex { public: Regex(const char* regex) { Regex(const char* regex, int flags = 0) { if (regcomp (&mRegex, regex, 0)) if (regcomp (&mRegex, regex, flags)) { std::cerr << "bad regex: " << regex << endl; abort(); Loading @@ -23,6 +23,12 @@ public: return !regexec (&mRegex, start, 16, mMatches, 0); } void AssertMatch (Buffer& buffer, Variable* v) throw (DecodeError) { if (!Match (buffer)) { Error (v, buffer); } } int GetMatchedLength() { return (mMatches[0].rm_eo - mMatches[0].rm_so)*8; } Loading @@ -44,17 +50,31 @@ private: void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_scheme ("^sip:"); static Regex reg_scheme ("^sip:", REG_ICASE); static Regex reg_userinfo ("^[&=+$,;?/A-Z0-9\\-_.!~*'():]*@", REG_ICASE); switch (id) { case id_scheme: if (reg_scheme.Match (buffer)) { reg_scheme.AssertMatch (buffer, this); SetHypFieldLength (id_scheme, reg_scheme.GetMatchedLength()); break; case id_userInfo: if (reg_userinfo.Match (buffer)) { SetHypFieldIsPresent (id, 1); SetHypFieldLength (id, reg_userinfo.GetMatchedLength() - 8); } else { reg_scheme.Error (this, buffer); SetHypFieldIsPresent (id, 0); } break; case id_hostPort: if (IsPresent (id_userInfo)) { Unsigned(8).Decode(buffer); } break; } } Loading Loading
codec/c++/sip_codets.cpp +26 −6 Original line number Diff line number Diff line Loading @@ -7,9 +7,9 @@ namespace t3devlib { namespace gen { class Regex { public: Regex(const char* regex) { Regex(const char* regex, int flags = 0) { if (regcomp (&mRegex, regex, 0)) if (regcomp (&mRegex, regex, flags)) { std::cerr << "bad regex: " << regex << endl; abort(); Loading @@ -23,6 +23,12 @@ public: return !regexec (&mRegex, start, 16, mMatches, 0); } void AssertMatch (Buffer& buffer, Variable* v) throw (DecodeError) { if (!Match (buffer)) { Error (v, buffer); } } int GetMatchedLength() { return (mMatches[0].rm_eo - mMatches[0].rm_so)*8; } Loading @@ -44,17 +50,31 @@ private: void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) { static Regex reg_scheme ("^sip:"); static Regex reg_scheme ("^sip:", REG_ICASE); static Regex reg_userinfo ("^[&=+$,;?/A-Z0-9\\-_.!~*'():]*@", REG_ICASE); switch (id) { case id_scheme: if (reg_scheme.Match (buffer)) { reg_scheme.AssertMatch (buffer, this); SetHypFieldLength (id_scheme, reg_scheme.GetMatchedLength()); break; case id_userInfo: if (reg_userinfo.Match (buffer)) { SetHypFieldIsPresent (id, 1); SetHypFieldLength (id, reg_userinfo.GetMatchedLength() - 8); } else { reg_scheme.Error (this, buffer); SetHypFieldIsPresent (id, 0); } break; case id_hostPort: if (IsPresent (id_userInfo)) { Unsigned(8).Decode(buffer); } break; } } Loading