summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKurt Zenker <kz@openoffice.org>2007-05-10 12:05:52 +0000
committerKurt Zenker <kz@openoffice.org>2007-05-10 12:05:52 +0000
commitaff2fe50859c74007461c611727812e5a89e6623 (patch)
tree36356b112b6edb092110cbdf190109fe10127f77
parent8b80cc394b71718efad7e8a663775f18b6471226 (diff)
INTEGRATION: CWS ucbfixes01 (1.18.24); FILE MERGED
2007/04/23 16:40:13 kso 1.18.24.1: #70959# - Eliminated multiple identical URI helper functionality implementations.
-rw-r--r--ucb/source/ucp/package/pkguri.cxx693
1 files changed, 50 insertions, 643 deletions
diff --git a/ucb/source/ucp/package/pkguri.cxx b/ucb/source/ucp/package/pkguri.cxx
index a68b63dd779b..489a9ad1ec34 100644
--- a/ucb/source/ucp/package/pkguri.cxx
+++ b/ucb/source/ucp/package/pkguri.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: pkguri.cxx,v $
*
- * $Revision: 1.18 $
+ * $Revision: 1.19 $
*
- * last change: $Author: vg $ $Date: 2006-11-21 17:44:27 $
+ * last change: $Author: kz $ $Date: 2007-05-10 13:05:52 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -42,16 +42,12 @@
*************************************************************************/
-#ifndef _RTL_USTRBUF_HXX_
-#include <rtl/ustrbuf.hxx>
-#endif
-#ifndef _OSL_DIAGNOSE_H_
-#include <osl/diagnose.h>
-#endif
+#include "rtl/ustrbuf.hxx"
+#include "osl/diagnose.h"
+
+#include "../inc/urihelper.hxx"
-#ifndef _PKGURI_HXX
#include "pkguri.hxx"
-#endif
using namespace package_ucp;
using namespace rtl;
@@ -90,7 +86,8 @@ void PackageUri::init() const
if ( m_aUri.getLength() && !m_aPath.getLength() )
{
// Note: Maybe it's a re-init, setUri only resets m_aPath!
- m_aPackage = m_aParentUri = m_aName = m_aParam = m_aScheme = OUString();
+ m_aPackage = m_aParentUri = m_aName = m_aParam = m_aScheme
+ = OUString();
// URI must match at least: <sheme>://<non_empty_url_to_file>
if ( ( m_aUri.getLength() < PACKAGE_URL_SCHEME_LENGTH + 4 ) )
@@ -126,18 +123,26 @@ void PackageUri::init() const
aPureUri = m_aUri;
// Scheme is case insensitive.
- m_aScheme = aPureUri.copy( 0, PACKAGE_URL_SCHEME_LENGTH ).toAsciiLowerCase();
+ m_aScheme = aPureUri.copy(
+ 0, PACKAGE_URL_SCHEME_LENGTH ).toAsciiLowerCase();
- if ( m_aScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PACKAGE_URL_SCHEME ) )
- || m_aScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PACKAGE_ZIP_URL_SCHEME ) ) )
+ if ( m_aScheme.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( PACKAGE_URL_SCHEME ) )
+ || m_aScheme.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( PACKAGE_ZIP_URL_SCHEME ) ) )
{
- if ( m_aScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PACKAGE_ZIP_URL_SCHEME ) ) )
+ if ( m_aScheme.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( PACKAGE_ZIP_URL_SCHEME ) ) )
{
- m_aParam += ( m_aParam.getLength() ? ::rtl::OUString::createFromAscii( "&purezip" )
- : ::rtl::OUString::createFromAscii( "?purezip" ) );
+ m_aParam +=
+ ( m_aParam.getLength()
+ ? ::rtl::OUString::createFromAscii( "&purezip" )
+ : ::rtl::OUString::createFromAscii( "?purezip" ) );
}
- aPureUri = aPureUri.replaceAt( 0, m_aScheme.getLength(), m_aScheme );
+ aPureUri = aPureUri.replaceAt( 0,
+ m_aScheme.getLength(),
+ m_aScheme );
sal_Int32 nStart = PACKAGE_URL_SCHEME_LENGTH + 3;
sal_Int32 nEnd = aPureUri.lastIndexOf( '/' );
@@ -175,25 +180,32 @@ void PackageUri::init() const
normalize( aNormPackage );
aPureUri = aPureUri.replaceAt(
- nStart, aPureUri.getLength() - nStart, aNormPackage );
- m_aPackage = decodeSegment( aNormPackage );
+ nStart, aPureUri.getLength() - nStart, aNormPackage );
+ m_aPackage = ::ucb::urihelper::decodeSegment( aNormPackage );
m_aPath = rtl::OUString::createFromAscii( "/" );
- m_aUri = m_aUri.replaceAt( 0, ( nParam >= 0 ) ? nParam : m_aUri.getLength(), aPureUri );
+ m_aUri = m_aUri.replaceAt( 0,
+ ( nParam >= 0 )
+ ? nParam
+ : m_aUri.getLength(), aPureUri );
sal_Int32 nLastSlash = m_aPackage.lastIndexOf( '/' );
if ( nLastSlash != -1 )
- m_aName = decodeSegment( m_aPackage.copy( nLastSlash + 1 ) );
+ m_aName = ::ucb::urihelper::decodeSegment(
+ m_aPackage.copy( nLastSlash + 1 ) );
else
- m_aName = decodeSegment( m_aPackage );
+ m_aName = ::ucb::urihelper::decodeSegment( m_aPackage );
}
else
{
m_aPath = aPureUri.copy( nEnd + 1 );
// Empty path segments or encoded slashes?
- if ( m_aPath.indexOf( rtl::OUString::createFromAscii( "//" ) ) != -1
- || m_aPath.indexOf( rtl::OUString::createFromAscii( "%2F" ) ) != -1
- || m_aPath.indexOf( rtl::OUString::createFromAscii( "%2f" ) ) != -1 )
+ if ( m_aPath.indexOf(
+ rtl::OUString::createFromAscii( "//" ) ) != -1
+ || m_aPath.indexOf(
+ rtl::OUString::createFromAscii( "%2F" ) ) != -1
+ || m_aPath.indexOf(
+ rtl::OUString::createFromAscii( "%2f" ) ) != -1 )
{
// error, but remember that we did a init().
m_aPath = rtl::OUString::createFromAscii( "/" );
@@ -204,19 +216,25 @@ void PackageUri::init() const
normalize( aNormPackage );
aPureUri = aPureUri.replaceAt(
- nStart, nEnd - nStart, aNormPackage );
+ nStart, nEnd - nStart, aNormPackage );
aPureUri = aPureUri.replaceAt(
- nEnd + 1, aPureUri.getLength() - nEnd - 1, encodeSegmentsForSure( m_aPath ) );
+ nEnd + 1,
+ aPureUri.getLength() - nEnd - 1,
+ ::ucb::urihelper::encodeURI( m_aPath ) );
- m_aPackage = decodeSegment( aNormPackage );
- m_aPath = decodeSegment( m_aPath );
- m_aUri = m_aUri.replaceAt( 0, ( nParam >= 0 ) ? nParam : m_aUri.getLength(), aPureUri );
+ m_aPackage = ::ucb::urihelper::decodeSegment( aNormPackage );
+ m_aPath = ::ucb::urihelper::decodeSegment( m_aPath );
+ m_aUri = m_aUri.replaceAt( 0,
+ ( nParam >= 0 )
+ ? nParam
+ : m_aUri.getLength(), aPureUri );
sal_Int32 nLastSlash = aPureUri.lastIndexOf( '/' );
if ( nLastSlash != -1 )
{
m_aParentUri = aPureUri.copy( 0, nLastSlash );
- m_aName = decodeSegment( aPureUri.copy( nLastSlash + 1 ) );
+ m_aName = ::ucb::urihelper::decodeSegment(
+ aPureUri.copy( nLastSlash + 1 ) );
}
}
@@ -230,614 +248,3 @@ void PackageUri::init() const
}
}
}
-
-//=========================================================================
-//
-// URI encode/decode stuff.
-//
-//=========================================================================
-
-inline bool isUSASCII(sal_uInt32 nChar)
-{
- return nChar <= 0x7F;
-}
-
-
-inline bool isVisible(sal_uInt32 nChar)
-{
- return nChar >= '!' && nChar <= '~';
-}
-
-
-inline bool isDigit(sal_uInt32 nChar)
-{
- return nChar >= '0' && nChar <= '9';
-}
-
-inline int getHexWeight(sal_uInt32 nChar)
-{
- return isDigit(nChar) ? int(nChar - '0') :
- nChar >= 'A' && nChar <= 'F' ? int(nChar - 'A' + 10) :
- nChar >= 'a' && nChar <= 'f' ? int(nChar - 'a' + 10) : -1;
-}
-
-inline bool isHighSurrogate(sal_uInt32 nUTF16)
-{
- return nUTF16 >= 0xD800 && nUTF16 <= 0xDBFF;
-}
-
-inline bool isLowSurrogate(sal_uInt32 nUTF16)
-{
- return nUTF16 >= 0xDC00 && nUTF16 <= 0xDFFF;
-}
-
-sal_uInt32 getUTF32Character(sal_Unicode const *& rBegin,
- sal_Unicode const * pEnd)
-{
- OSL_ASSERT(rBegin && rBegin < pEnd);
- if (rBegin + 1 < pEnd && rBegin[0] >= 0xD800 && rBegin[0] <= 0xDBFF
- && rBegin[1] >= 0xDC00 && rBegin[1] <= 0xDFFF)
- {
- sal_uInt32 nUTF32 = sal_uInt32(*rBegin++ & 0x3FF) << 10;
- return (nUTF32 | (*rBegin++ & 0x3FF)) + 0x10000;
- }
- else
- return *rBegin++;
-}
-
-sal_uInt32 getHexDigit(int nWeight)
-{
- OSL_ASSERT(nWeight >= 0 && nWeight < 16);
- static sal_Char const aDigits[16]
- = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
- 'D', 'E', 'F' };
- return aDigits[nWeight];
-}
-
-enum EncodeMechanism
-{
- ENCODE_ALL,
- WAS_ENCODED,
- NOT_CANONIC
-};
-
-enum DecodeMechanism
-{
- NO_DECODE,
- DECODE_TO_IURI,
- DECODE_WITH_CHARSET
-};
-
-enum Part
-{
- PART_OBSOLETE_NORMAL = 0x001, // Obsolete, do not use!
- PART_OBSOLETE_FILE = 0x002, // Obsolete, do not use!
- PART_OBSOLETE_PARAM = 0x004, // Obsolete, do not use!
- PART_USER_PASSWORD = 0x008,
- PART_IMAP_ACHAR = 0x010,
- PART_VIM = 0x020,
- PART_HOST_EXTRA = 0x040,
- PART_FPATH = 0x080,
- PART_AUTHORITY = 0x100,
- PART_PATH_SEGMENTS_EXTRA = 0x200,
- PART_REL_SEGMENT_EXTRA = 0x400,
- PART_URIC = 0x800,
- PART_HTTP_PATH = 0x1000,
- PART_FILE_SEGMENT_EXTRA = 0x2000, // Obsolete, do not use!
- PART_MESSAGE_ID = 0x4000,
- PART_MESSAGE_ID_PATH = 0x8000,
- PART_MAILTO = 0x10000,
- PART_PATH_BEFORE_QUERY = 0x20000,
- PART_PCHAR = 0x40000,
- PART_FRAGMENT = 0x80000, // Obsolete, do not use!
- PART_VISIBLE = 0x100000,
- max_part = 0x80000000
- // Do not use! Only there to allow compatible changes in the future.
-};
-
-enum EscapeType
-{
- ESCAPE_NO,
- ESCAPE_OCTET,
- ESCAPE_UTF32
-};
-
-inline void appendEscape(rtl::OUStringBuffer & rTheText,
- sal_Char cEscapePrefix, sal_uInt32 nOctet)
-{
- rTheText.append(sal_Unicode(cEscapePrefix));
- rTheText.append(sal_Unicode(getHexDigit(int(nOctet >> 4))));
- rTheText.append(sal_Unicode(getHexDigit(int(nOctet & 15))));
-}
-
-inline bool mustEncode(sal_uInt32 nUTF32, Part ePart)
-{
- enum
- {
- pA = PART_OBSOLETE_NORMAL,
- pB = PART_OBSOLETE_FILE,
- pC = PART_OBSOLETE_PARAM,
- pD = PART_USER_PASSWORD,
- pE = PART_IMAP_ACHAR,
- pF = PART_VIM,
- pG = PART_HOST_EXTRA,
- pH = PART_FPATH,
- pI = PART_AUTHORITY,
- pJ = PART_PATH_SEGMENTS_EXTRA,
- pK = PART_REL_SEGMENT_EXTRA,
- pL = PART_URIC,
- pM = PART_HTTP_PATH,
- pN = PART_FILE_SEGMENT_EXTRA,
- pO = PART_MESSAGE_ID,
- pP = PART_MESSAGE_ID_PATH,
- pQ = PART_MAILTO,
- pR = PART_PATH_BEFORE_QUERY,
- pS = PART_PCHAR,
- pT = PART_FRAGMENT,
- pU = PART_VISIBLE
- };
- static sal_uInt32 const aMap[128]
- = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /* */ 0,
- /* ! */ pC+pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* " */ pU,
- /* # */ pU,
- /* $ */ pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* % */ pU,
- /* & */ pA+pB+pC+pD+pE +pH+pI+pJ+pK+pL+pM+pN+pO+pP +pR+pS+pT+pU,
- /* ' */ pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* ( */ pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* ) */ pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* * */ pA+pB+pC+pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* + */ pA+pB+pC+pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* , */ pA+pB+pC+pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* - */ pA+pB+pC+pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* . */ pA+pB+pC+pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* / */ pA+pB+pC +pH +pJ +pL+pM +pP+pQ+pR +pT+pU,
- /* 0 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 1 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 2 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 3 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 4 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 5 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 6 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 7 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 8 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* 9 */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* : */ pB+pC +pH+pI+pJ +pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* ; */ pC+pD +pI+pJ+pK+pL+pM +pO+pP+pQ+pR +pT+pU,
- /* < */ pC +pO+pP +pU,
- /* = */ pA+pB+pC+pD+pE +pH+pI+pJ+pK+pL+pM+pN +pR+pS+pT+pU,
- /* > */ pC +pO+pP +pU,
- /* ? */ pC +pL +pT+pU,
- /* @ */ pC +pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* A */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* B */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* C */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* D */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* E */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* F */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* G */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* H */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* I */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* J */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* K */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* L */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* M */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* N */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* O */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* P */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* Q */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* R */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* S */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* T */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* U */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* V */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* W */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* X */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* Y */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* Z */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* [ */ pL +pU,
- /* \ */ pB +pU,
- /* ] */ pL +pU,
- /* ^ */ pU,
- /* _ */ pA+pB+pC+pD+pE +pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* ` */ +pU,
- /* a */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* b */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* c */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* d */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* e */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* f */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* g */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* h */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* i */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* j */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* k */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* l */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* m */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* n */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* o */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* p */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* q */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* r */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* s */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* t */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* u */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* v */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* w */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* x */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* y */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* z */ pA+pB+pC+pD+pE+pF+pG+pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* { */ +pU,
- /* | */ pB+pC +pN +pT+pU,
- /* } */ +pU,
- /* ~ */ pA+pB+pC+pD+pE +pH+pI+pJ+pK+pL+pM+pN+pO+pP+pQ+pR+pS+pT+pU,
- /* */ 0 };
- return !isUSASCII(nUTF32) || !(aMap[nUTF32] & ePart);
-}
-
-void appendUCS4Escape(rtl::OUStringBuffer & rTheText, sal_Char cEscapePrefix,
- sal_uInt32 nUCS4)
-{
- OSL_ASSERT(nUCS4 < 0x80000000);
- if (nUCS4 < 0x80)
- appendEscape(rTheText, cEscapePrefix, nUCS4);
- else if (nUCS4 < 0x800)
- {
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 6 | 0xC0);
- appendEscape(rTheText, cEscapePrefix, nUCS4 & 0x3F | 0x80);
- }
- else if (nUCS4 < 0x10000)
- {
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 12 | 0xE0);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 6 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 & 0x3F | 0x80);
- }
- else if (nUCS4 < 0x200000)
- {
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 18 | 0xF0);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 12 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 6 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 & 0x3F | 0x80);
- }
- else if (nUCS4 < 0x4000000)
- {
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 24 | 0xF8);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 18 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 12 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 6 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 & 0x3F | 0x80);
- }
- else
- {
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 30 | 0xFC);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 24 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 18 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 12 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 >> 6 & 0x3F | 0x80);
- appendEscape(rTheText, cEscapePrefix, nUCS4 & 0x3F | 0x80);
- }
-}
-
-void appendUCS4(rtl::OUStringBuffer & rTheText, sal_uInt32 nUCS4,
- EscapeType eEscapeType, bool bOctets, Part ePart,
- sal_Char cEscapePrefix, rtl_TextEncoding eCharset,
- bool bKeepVisibleEscapes)
-{
- bool bEscape = false;
- rtl_TextEncoding eTargetCharset = RTL_TEXTENCODING_ASCII_US;
- switch (eEscapeType)
- {
- case ESCAPE_NO:
- if (mustEncode(nUCS4, ePart))
- {
- bEscape = true;
- eTargetCharset = bOctets ? RTL_TEXTENCODING_ISO_8859_1 :
- RTL_TEXTENCODING_UTF8;
- }
- else
- bEscape = false;
- break;
-
- case ESCAPE_OCTET:
- bEscape = true;
- eTargetCharset = RTL_TEXTENCODING_ISO_8859_1;
- break;
-
- case ESCAPE_UTF32:
- if (mustEncode(nUCS4, ePart))
- {
- bEscape = true;
- eTargetCharset = eCharset;
- }
- else if (bKeepVisibleEscapes && isVisible(nUCS4))
- {
- bEscape = true;
- eTargetCharset = RTL_TEXTENCODING_ASCII_US;
- }
- else
- bEscape = false;
- break;
- }
- if (bEscape)
- switch (eTargetCharset)
- {
- default:
- OSL_ASSERT(false);
- case RTL_TEXTENCODING_ASCII_US:
- case RTL_TEXTENCODING_ISO_8859_1:
- appendEscape(rTheText, cEscapePrefix, nUCS4);
- break;
-
- case RTL_TEXTENCODING_UTF8:
- appendUCS4Escape(rTheText, cEscapePrefix, nUCS4);
- break;
- }
- else
- rTheText.append(sal_Unicode(nUCS4));
-}
-
-sal_uInt32 getUTF32(sal_Unicode const *& rBegin, sal_Unicode const * pEnd,
- bool bOctets, sal_Char cEscapePrefix,
- EncodeMechanism eMechanism, rtl_TextEncoding eCharset,
- EscapeType & rEscapeType)
-{
- OSL_ASSERT(rBegin < pEnd);
- sal_uInt32 nUTF32 = bOctets ? *rBegin++ : getUTF32Character(rBegin, pEnd);
- switch (eMechanism)
- {
- case ENCODE_ALL:
- rEscapeType = ESCAPE_NO;
- break;
-
- case WAS_ENCODED:
- {
- int nWeight1;
- int nWeight2;
- if (nUTF32 == sal::static_int_cast<sal_uInt32>(cEscapePrefix) && rBegin + 1 < pEnd
- && (nWeight1 = getHexWeight(rBegin[0])) >= 0
- && (nWeight2 = getHexWeight(rBegin[1])) >= 0)
- {
- rBegin += 2;
- nUTF32 = nWeight1 << 4 | nWeight2;
- switch (eCharset)
- {
- default:
- OSL_ASSERT(false);
- case RTL_TEXTENCODING_ASCII_US:
- rEscapeType
- = isUSASCII(nUTF32) ? ESCAPE_UTF32 : ESCAPE_OCTET;
- break;
-
- case RTL_TEXTENCODING_ISO_8859_1:
- rEscapeType = ESCAPE_UTF32;
- break;
-
- case RTL_TEXTENCODING_UTF8:
- if (isUSASCII(nUTF32))
- rEscapeType = ESCAPE_UTF32;
- else
- {
- if (nUTF32 >= 0xC0 && nUTF32 <= 0xF4)
- {
- sal_uInt32 nEncoded;
- int nShift;
- sal_uInt32 nMin;
- if (nUTF32 <= 0xDF)
- {
- nEncoded = (nUTF32 & 0x1F) << 6;
- nShift = 0;
- nMin = 0x80;
- }
- else if (nUTF32 <= 0xEF)
- {
- nEncoded = (nUTF32 & 0x0F) << 12;
- nShift = 6;
- nMin = 0x800;
- }
- else
- {
- nEncoded = (nUTF32 & 0x07) << 18;
- nShift = 12;
- nMin = 0x10000;
- }
- sal_Unicode const * p = rBegin;
- bool bUTF8 = true;
- for (;;)
- {
- if (p + 2 >= pEnd || p[0] != cEscapePrefix
- || (nWeight1 = getHexWeight(p[1])) < 0
- || (nWeight2 = getHexWeight(p[2])) < 0
- || nWeight1 < 8)
- {
- bUTF8 = false;
- break;
- }
- p += 3;
- nEncoded
- |= ((nWeight1 & 3) << 4 | nWeight2)
- << nShift;
- if (nShift == 0)
- break;
- nShift -= 6;
- }
- if (bUTF8 && nEncoded >= nMin
- && !isHighSurrogate(nEncoded)
- && !isLowSurrogate(nEncoded)
- && nEncoded <= 0x10FFFF)
- {
- rBegin = p;
- nUTF32 = nEncoded;
- rEscapeType = ESCAPE_UTF32;
- break;
- }
- }
- rEscapeType = ESCAPE_OCTET;
- }
- break;
- }
- }
- else
- rEscapeType = ESCAPE_NO;
- break;
- }
-
- case NOT_CANONIC:
- {
- int nWeight1;
- int nWeight2;
- if (nUTF32 == sal::static_int_cast<sal_uInt32>(cEscapePrefix) && rBegin + 1 < pEnd
- && ((nWeight1 = getHexWeight(rBegin[0])) >= 0)
- && ((nWeight2 = getHexWeight(rBegin[1])) >= 0))
- {
- rBegin += 2;
- nUTF32 = nWeight1 << 4 | nWeight2;
- rEscapeType = ESCAPE_OCTET;
- }
- else
- rEscapeType = ESCAPE_NO;
- break;
- }
- }
- return nUTF32;
-}
-
-static rtl::OUString encodeText(sal_Unicode const * pBegin,
- sal_Unicode const * pEnd, bool bOctets,
- Part ePart, sal_Char cEscapePrefix,
- EncodeMechanism eMechanism,
- rtl_TextEncoding eCharset,
- bool bKeepVisibleEscapes)
-{
- rtl::OUStringBuffer aResult;
- while (pBegin != pEnd)
- {
- EscapeType eEscapeType;
- sal_uInt32 nUTF32 = getUTF32(pBegin, pEnd, bOctets, cEscapePrefix,
- eMechanism, eCharset, eEscapeType);
- appendUCS4(aResult, nUTF32, eEscapeType, bOctets, ePart,
- cEscapePrefix, eCharset, bKeepVisibleEscapes);
- }
- return aResult.makeStringAndClear();
-}
-
-static rtl::OUString decode(sal_Unicode const * pBegin,
- sal_Unicode const * pEnd, sal_Char cEscapePrefix,
- DecodeMechanism eMechanism,
- rtl_TextEncoding eCharset)
-{
- switch (eMechanism)
- {
- case NO_DECODE:
- return rtl::OUString(pBegin, pEnd - pBegin);
-
- case DECODE_TO_IURI:
- eCharset = RTL_TEXTENCODING_UTF8;
- break;
- case DECODE_WITH_CHARSET:
- // do nothing ?
- break;
- }
- rtl::OUStringBuffer aResult;
- while (pBegin < pEnd)
- {
- EscapeType eEscapeType;
- sal_uInt32 nUTF32 = getUTF32(pBegin, pEnd, false, cEscapePrefix,
- WAS_ENCODED, eCharset, eEscapeType);
- switch (eEscapeType)
- {
- case ESCAPE_NO:
- aResult.append(sal_Unicode(nUTF32));
- break;
-
- case ESCAPE_OCTET:
- appendEscape(aResult, cEscapePrefix, nUTF32);
- break;
-
- case ESCAPE_UTF32:
- if (eMechanism == DECODE_TO_IURI && isUSASCII(nUTF32))
- appendEscape(aResult, cEscapePrefix, nUTF32);
- else
- aResult.append(sal_Unicode(nUTF32));
- break;
- }
- }
- return aResult.makeStringAndClear();
-}
-
-//=========================================================================
-// static
-rtl::OUString PackageUri::decodeSegment( const rtl::OUString& rSource )
-{
- return decode(rSource.getStr(), rSource.getStr() + rSource.getLength(),
- '%', DECODE_WITH_CHARSET, RTL_TEXTENCODING_UTF8);
-}
-
-/*
-//============================================================================
-// static
-rtl::OUString PackageUri::encodeURL( const rtl::OUString& rSource )
-{
- rtl::OUStringBuffer aResult;
-
- sal_Unicode const * pBegin = rSource.getStr();
- sal_Unicode const * pEnd = pBegin + rSource.getLength();
- sal_Unicode const * p = pBegin;
- while (p != pEnd && *p++ != ':');
- aResult.append(pBegin, p - pBegin);
-
- while (p != pEnd)
- {
- EscapeType eEscapeType;
- sal_uInt32 nUTF32 = getUTF32(p, pEnd, false, '%', WAS_ENCODED,
- RTL_TEXTENCODING_UTF8, eEscapeType);
- if (nUTF32 == '/' && eEscapeType == ESCAPE_NO)
- aResult.append(sal_Unicode(nUTF32));
- else
- appendUCS4(aResult, nUTF32, eEscapeType, false, PART_PCHAR, '%',
- RTL_TEXTENCODING_UTF8, false);
- }
-
- return aResult.makeStringAndClear();
-}
-*/
-
-//=========================================================================
-// static
-rtl::OUString PackageUri::encodeSegment( const rtl::OUString& rSource )
-{
- return encodeText(rSource.getStr(),
- rSource.getStr() + rSource.getLength(), false,
- PART_PCHAR, '%', ENCODE_ALL, RTL_TEXTENCODING_UTF8,
- false);
-}
-
-//=========================================================================
-// static
-rtl::OUString PackageUri::encodeSegmentsForSure( const rtl::OUString& rSource )
-{
- rtl::OUString aResult;
- sal_Int32 nIndex = 0;
- do
- {
- sal_Int32 nNext = rSource.indexOf( '/', nIndex );
- if ( nNext != -1 )
- {
- if ( nNext > nIndex )
- aResult += encodeSegment( decodeSegment( rSource.copy( nIndex, nNext - nIndex ) ) );
- aResult += ::rtl::OUString::createFromAscii( "/" );
- nIndex = nNext + 1;
- }
- else
- {
- aResult += encodeSegment( decodeSegment( rSource.copy( nIndex ) ) );
- nIndex = -1;
- }
- }
- while ( nIndex >= 0 && nIndex < rSource.getLength() );
-
- return aResult;
-}
-