diff options
author | RĂ¼diger Timm <rt@openoffice.org> | 2004-09-20 10:58:26 +0000 |
---|---|---|
committer | RĂ¼diger Timm <rt@openoffice.org> | 2004-09-20 10:58:26 +0000 |
commit | c3ecef8067e274d017a344b4c8049cd5f49c6729 (patch) | |
tree | 3134d155ea29e06325b238ea4b3a231f2f5f1b56 /tools | |
parent | 599d3216f338b10561944648f085e458bcf98440 (diff) |
INTEGRATION: CWS fwk01ea (1.42.4); FILE MERGED
2004/07/08 15:24:35 abi 1.42.4.5: RESYNC: (1.44-1.45); FILE MERGED
2004/04/28 07:10:53 abi 1.42.4.4: RESYNC: (1.42-1.44); FILE MERGED
2004/04/08 08:37:52 sb 1.42.4.3: #116269# Fixed problem with schemes where PrefixInfo::m_pPrefix contains more than scheme:.
2004/04/07 08:09:46 sb 1.42.4.2: #116269# Renamed INET_PROT_UNKNOWN to INET_PROT_GENERIC.
2004/04/06 13:25:53 sb 1.42.4.1: #116269# Added INET_PROT_UNKNOWN.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/source/fsys/urlobj.cxx | 137 |
1 files changed, 104 insertions, 33 deletions
diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx index 5804c766cb30..7d1b14eb537b 100644 --- a/tools/source/fsys/urlobj.cxx +++ b/tools/source/fsys/urlobj.cxx @@ -2,9 +2,9 @@ * * $RCSfile: urlobj.cxx,v $ * - * $Revision: 1.45 $ + * $Revision: 1.46 $ * - * last change: $Author: hjs $ $Date: 2004-06-25 17:12:06 $ + * last change: $Author: rt $ $Date: 2004-09-20 11:58:26 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -318,6 +318,11 @@ using namespace com::sun; ; private vnd-sun-star-tdoc-url = "VND.SUN.STAR.TDOC:/" segment *("/" segment) segment = *pchar + + + ; private + unknown-url = scheme ":" 1*uric + scheme = ALPHA *(alphanum / "+" / "-" / ".") */ //============================================================================ @@ -357,19 +362,26 @@ inline void INetURLObject::SubString::operator +=(sal_Int32 nDelta) } //============================================================================ -bool INetURLObject::SubString::equals(SubString const & rOther, +int INetURLObject::SubString::compare(SubString const & rOther, UniString const & rThisString, UniString const & rOtherString) const { - if (m_nLength != rOther.m_nLength) - return false; + xub_StrLen len = std::min(m_nLength, rOther.m_nLength); sal_Unicode const * p1 = rThisString.GetBuffer() + m_nBegin; - sal_Unicode const * p1End = p1 + m_nLength; + sal_Unicode const * end = p1 + len; sal_Unicode const * p2 = rOtherString.GetBuffer() + rOther.m_nBegin; - while (p1 != p1End) - if (*p1++ != *p2++) - return false; - return true; + while (p1 != end) { + if (*p1 < *p2) { + return -1; + } else if (*p1 > *p2) { + return 1; + } + ++p1; + ++p2; + } + return m_nLength < rOther.m_nLength ? -1 + : m_nLength > rOther.m_nLength ? 1 + : 0; } //============================================================================ @@ -462,7 +474,8 @@ static INetURLObject::SchemeInfo const aSchemeInfoMap[INET_PROT_END] { "vnd.sun.star.expand", "vnd.sun.star.expand:", 0, false, false, false, false, false, false, false, false }, { "vnd.sun.star.tdoc", "vnd.sun.star.tdoc:", 0, false, false, false, - false, false, false, true, false } }; + false, false, false, true, false }, + { "", "", 0, false, false, false, false, false, false, false, false } }; // static inline INetURLObject::SchemeInfo const & @@ -651,6 +664,7 @@ void INetURLObject::setInvalid() { m_aAbsURIRef.Erase(); m_eScheme = INET_PROT_NOT_VALID; + m_aScheme.clear(); m_aUser.clear(); m_aAuth.clear(); m_aHost.clear(); @@ -708,6 +722,23 @@ guessFSysStyleByCounting(sal_Unicode const * pBegin, INetURLObject::FSYS_DOS : INetURLObject::FSYS_MAC; } +UniString parseScheme(sal_Unicode const ** begin, sal_Unicode const * end) { + sal_Unicode const * p = *begin; + if (p != end && INetMIME::isAlpha(*p)) { + do { + ++p; + } while (p != end + && (INetMIME::isAlphanumeric(*p) || *p == '+' || *p == '-' + || *p == '.')); + if (p != end && *p == ':') { + UniString scheme = UniString(*begin, p - *begin).ToLowerAscii(); + *begin = p + 1; + return scheme; + } + } + return UniString(); +} + } bool INetURLObject::setAbsURIRef(UniString const & rTheAbsURIRef, @@ -738,6 +769,8 @@ bool INetURLObject::setAbsURIRef(UniString const & rTheAbsURIRef, >= PrefixInfo::EXTERNAL ? pPrefix->m_pTranslatedPrefix : pPrefix->m_pPrefix); + m_aScheme = SubString( + 0, aSynAbsURIRef.Search(static_cast< sal_Unicode >(':'))); } else { @@ -849,10 +882,23 @@ bool INetURLObject::setAbsURIRef(UniString const & rTheAbsURIRef, && p[3] == '.' ? INET_PROT_FTP : INET_PROT_HTTP; // 3rd, 4th } + } - if (m_eScheme == INET_PROT_NOT_VALID && pPos != pEnd - && *pPos != nFragmentDelimiter) - m_eScheme = m_eSmartScheme; + UniString aSynScheme; + if (m_eScheme == INET_PROT_NOT_VALID) { + sal_Unicode const * p = pPos; + aSynScheme = parseScheme(&p, pEnd); + if (aSynScheme.Len() != 0 && p != pEnd && *p != nFragmentDelimiter) + { + m_eScheme = INET_PROT_GENERIC; + pPos = p; + } + } + + if (bSmart && m_eScheme == INET_PROT_NOT_VALID && pPos != pEnd + && *pPos != nFragmentDelimiter) + { + m_eScheme = m_eSmartScheme; } if (m_eScheme == INET_PROT_NOT_VALID) @@ -861,7 +907,10 @@ bool INetURLObject::setAbsURIRef(UniString const & rTheAbsURIRef, return false; } - aSynAbsURIRef = UniString::CreateFromAscii(getSchemeInfo().m_pScheme); + if (m_eScheme != INET_PROT_GENERIC) { + aSynScheme = UniString::CreateFromAscii(getSchemeInfo().m_pScheme); + } + m_aScheme.set(aSynAbsURIRef, aSynScheme, aSynAbsURIRef.Len()); aSynAbsURIRef += ':'; } @@ -1821,15 +1870,21 @@ bool INetURLObject::convertAbsToRel(UniString const & rTheAbsURIRef, } // Check for differing scheme or authority parts: - if (m_eScheme != aSubject.m_eScheme - || !m_aUser.equals(aSubject.m_aUser, m_aAbsURIRef, - aSubject.m_aAbsURIRef) - || !m_aAuth.equals(aSubject.m_aAuth, m_aAbsURIRef, - aSubject.m_aAbsURIRef) - || !m_aHost.equals(aSubject.m_aHost, m_aAbsURIRef, - aSubject.m_aAbsURIRef) - || !m_aPort.equals(aSubject.m_aPort, m_aAbsURIRef, - aSubject.m_aAbsURIRef)) + if ((m_aScheme.compare( + aSubject.m_aScheme, m_aAbsURIRef, aSubject.m_aAbsURIRef) + != 0) + || (m_aUser.compare( + aSubject.m_aUser, m_aAbsURIRef, aSubject.m_aAbsURIRef) + != 0) + || (m_aAuth.compare( + aSubject.m_aAuth, m_aAbsURIRef, aSubject.m_aAbsURIRef) + != 0) + || (m_aHost.compare( + aSubject.m_aHost, m_aAbsURIRef, aSubject.m_aAbsURIRef) + != 0) + || (m_aPort.compare( + aSubject.m_aPort, m_aAbsURIRef, aSubject.m_aAbsURIRef) + != 0)) { rTheRelURIRef = aSubject.GetMainURL(eDecodeMechanism, eCharset); return false; @@ -2836,6 +2891,20 @@ bool INetURLObject::parsePath(INetProtocol eScheme, PART_PCHAR, '%', eCharset, false); } break; + + case INET_PROT_GENERIC: + while (pPos < pEnd && *pPos != nFragmentDelimiter) + { + EscapeType eEscapeType; + sal_uInt32 nUTF32 = getUTF32(pPos, pEnd, bOctets, + '%', eMechanism, + eCharset, eEscapeType); + appendUCS4(aTheSynPath, nUTF32, eEscapeType, bOctets, + PART_URIC, '%', eCharset, true); + } + if (aTheSynPath.Len() == 0) + return false; + break; } *pBegin = pPos; @@ -3389,7 +3458,10 @@ bool INetURLObject::operator ==(INetURLObject const & rObject) const return false; if (m_eScheme == INET_PROT_NOT_VALID) return (m_aAbsURIRef == rObject.m_aAbsURIRef) != false; - if (GetUser(NO_DECODE) != rObject.GetUser(NO_DECODE) + if ((m_aScheme.compare( + rObject.m_aScheme, m_aAbsURIRef, rObject.m_aAbsURIRef) + != 0) + || GetUser(NO_DECODE) != rObject.GetUser(NO_DECODE) || GetPass(NO_DECODE) != rObject.GetPass(NO_DECODE) || !GetHost(NO_DECODE).EqualsIgnoreCaseAscii(rObject. GetHost(NO_DECODE)) @@ -3438,13 +3510,12 @@ bool INetURLObject::operator ==(INetURLObject const & rObject) const //============================================================================ bool INetURLObject::operator <(INetURLObject const & rObject) const { - switch (GetScheme(m_eScheme).CompareTo(GetScheme(rObject.m_eScheme))) - { - case COMPARE_LESS: - return true; - - case COMPARE_GREATER: - return false; + int n = m_aScheme.compare( + rObject.m_aScheme, m_aAbsURIRef, rObject.m_aAbsURIRef); + if (n < 0) { + return true; + } else if (n > 0) { + return false; } sal_uInt32 nPort1 = GetPort(); sal_uInt32 nPort2 = rObject.GetPort(); @@ -3510,7 +3581,7 @@ bool INetURLObject::ConcatData(INetProtocol eTheScheme, { setInvalid(); m_eScheme = eTheScheme; - if (HasError()) + if (HasError() || m_eScheme == INET_PROT_GENERIC) return false; m_aAbsURIRef.AssignAscii(getSchemeInfo().m_pScheme); m_aAbsURIRef += ':'; |