diff options
Diffstat (limited to 'tools/inc')
-rw-r--r-- | tools/inc/tools/urlkeys.hxx | 85 | ||||
-rw-r--r-- | tools/inc/tools/urlobj.hxx | 1945 | ||||
-rw-r--r-- | tools/inc/tools/vcompat.hxx | 83 |
3 files changed, 2113 insertions, 0 deletions
diff --git a/tools/inc/tools/urlkeys.hxx b/tools/inc/tools/urlkeys.hxx new file mode 100644 index 000000000000..a0e3ffbfd223 --- /dev/null +++ b/tools/inc/tools/urlkeys.hxx @@ -0,0 +1,85 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: urlkeys.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: vg $ $Date: 2007-04-11 20:20:56 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#ifndef __URLKEYS_HXX +#define __URLKEYS_HXX + +// Defines for common keys in URL files + +// ANSI version + +#define A_URLSECTION_SHORTCUT "InternetShortcut" +#define A_URLKEY_URL "URL" +#define A_URLKEY_TITLE "Title" +#define A_URLKEY_TARGET "Target" +#define A_URLKEY_FRAME "Frame" +#define A_URLKEY_OPENAS "OpenAs" +#define A_URLKEY_SOICON "SOIcon" +#define A_URLKEY_WIN_ICONFILE "IconFile" +#define A_URLKEY_WIN_ICONINDEX "IconIndex" +#define A_URLKEY_WORKDIR "WorkingDirectory" +#define A_URLKEY_ARGUMENTS "Arguments" +#define A_URLKEY_INTERN_ORIGURL "[URL]" + +// Unicode version + +#define U_URLSECTION_SHORTCUT L"InternetShortcut" +#define U_URLKEY_URL L"URL" +#define U_URLKEY_TITLE L"Title" +#define U_URLKEY_TARGET L"Target" +#define U_URLKEY_FRAME L"Frame" +#define U_URLKEY_OPENAS L"OpenAs" +#define U_URLKEY_SOICON L"SOIcon" +#define U_URLKEY_WIN_ICONFILE L"IconFile" +#define U_URLKEY_WIN_ICONINDEX L"IconIndex" +#define U_URLKEY_WORKDIR L"WorkingDirectory" +#define U_URLKEY_ARGUMENTS L"Arguments" +#define U_URLKEY_INTERN_ORIGURL L"[URL]" + +# define URLSECTION_SHORTCUT U_URLSECTION_SHORTCUT +# define URLKEY_URL U_URLKEY_URL +# define URLKEY_TITLE U_URLKEY_TITLE +# define URLKEY_TARGET U_URLKEY_TARGET +# define URLKEY_FRAME U_URLKEY_FRAME +# define URLKEY_OPENAS U_URLKEY_OPENAS +# define URLKEY_SOICON U_URLKEY_SOICON +# define URLKEY_WIN_ICONFILE U_URLKEY_WIN_ICONFILE +# define URLKEY_WIN_ICONINDEX U_URLKEY_WIN_ICONINDEX +# define URLKEY_WORKDIR U_URLKEY_WORKDIR +# define URLKEY_ARGUMENTS U_URLKEY_ARGUMENTS +# define URLKEY_INTERN_ORIGURL U_URLKEY_INTERN_ORIGURL + +#endif // __URLKEYS_HXX + diff --git a/tools/inc/tools/urlobj.hxx b/tools/inc/tools/urlobj.hxx new file mode 100644 index 000000000000..bb19dd11d420 --- /dev/null +++ b/tools/inc/tools/urlobj.hxx @@ -0,0 +1,1945 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: urlobj.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: vg $ $Date: 2007-04-11 20:21:07 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef _URLOBJ_HXX +#define _URLOBJ_HXX + +#ifndef INCLUDED_TOOLSDLLAPI_H +#include "tools/toolsdllapi.h" +#endif + +#ifndef _STRING_HXX +#include <tools/string.hxx> +#endif + +#ifndef _COM_SUN_STAR_UNO_REFERENCE_HXX_ +#include "com/sun/star/uno/Reference.hxx" +#endif +#ifndef _RTL_STRING_H_ +#include "rtl/string.h" +#endif +#ifndef _RTL_USTRBUF_HXX_ +#include "rtl/ustrbuf.hxx" +#endif +#ifndef _RTL_TEXTENC_H +#include "rtl/textenc.h" +#endif +#ifndef _SAL_TYPES_H_ +#include "sal/types.h" +#endif + +namespace com { namespace sun { namespace star { namespace util { + class XStringWidth; +} } } } + +//============================================================================ +// Special tokens: +#define INET_PASS_TOKEN '@' +#define INET_DELIM_TOKEN ':' +#define INET_DELIM_IMAPID ';' +#define INET_ENC_DELIM_TOKEN '|' +#define INET_DELIM_HOST_TOKEN '.' +#define INET_PATH_TOKEN '/' +#define INET_DOSPATH_TOKEN '\\' +#define INET_MARK_TOKEN '#' +#define INET_PARAM_TOKEN '?' +#define INET_HEX_ESCAPE '%' + +//============================================================================ +// Common URL prefixes for various schemes: +#define INET_FTP_SCHEME "ftp://" +#define INET_HTTP_SCHEME "http://" +#define INET_HTTPS_SCHEME "https://" +#define INET_FILE_SCHEME "file://" +#define INET_GOPHER_SCHEME "gopher://" +#define INET_MAILTO_SCHEME "mailto:" +#define INET_CID_SCHEME "cid:" +#define INET_NEWS_SCHEME "news:" +#define INET_POP3_SCHEME "pop3://" +#define INET_LDAP_SCHEME "ldap://" +#define INET_PRIVATE_SCHEME "private:" +#define INET_BUGDOC_SCHEME "bugdoc:" +#define INET_SLOT_SCHEME "slot:" +#define INET_MACRO_SCHEME "macro:" +#define INET_JAVASCRIPT_SCHEME "javascript:" +#define INET_IMAP_SCHEME "imap://" +#define INET_DOWNPASS_SCHEME ".." +#define INET_DATA_SCHEME "data:" +#define INET_OUT_SCHEME "out://" +#define INET_FIF_SCHEME "fif://" +#define INET_CEPT_SCHEME "cept://" +#define INET_VIM_SCHEME "vim://" +#define INET_UNO_SCHEME ".uno:" +#define INET_COMPONENT_SCHEME ".component:" +#define INET_DB_SCHEME "db:" +#define INET_BUGID_SCHEME "bugid:" +#define INET_TELNET_SCHEME "telnet://" + +#define URL_PREFIX_PRIV_SOFFICE "private:" +enum +{ + URL_PREFIX_PRIV_SOFFICE_LEN + = RTL_CONSTASCII_LENGTH(URL_PREFIX_PRIV_SOFFICE) +}; + +#define URL_PREFIX_PRIV_OBSOLETE URL_PREFIX_PRIV_SOFFICE +enum +{ + URL_PREFIX_PRIV_OBSOLETE_LEN + = RTL_CONSTASCII_LENGTH(URL_PREFIX_PRIV_OBSOLETE) +}; + +#define URL_PREFIX_PRIV_EXTERN "staroffice:" +enum +{ + URL_PREFIX_PRIV_EXTERN_LEN = RTL_CONSTASCII_LENGTH(URL_PREFIX_PRIV_EXTERN) +}; + +//============================================================================ +// Schemes: +enum INetProtocol +{ + INET_PROT_NOT_VALID = 0, + INET_PROT_FTP = 1, + INET_PROT_HTTP = 2, + INET_PROT_FILE = 3, + INET_PROT_MAILTO = 4, + INET_PROT_VND_SUN_STAR_WEBDAV = 5, + INET_PROT_NEWS = 6, + INET_PROT_PRIV_SOFFICE = 7, + INET_PROT_PRIVATE = INET_PROT_PRIV_SOFFICE, // obsolete + INET_PROT_VND_SUN_STAR_HELP = 8, + INET_PROT_HTTPS = 9, + INET_PROT_SLOT = 10, + INET_PROT_MACRO = 11, + INET_PROT_JAVASCRIPT = 12, + INET_PROT_IMAP = 13, + INET_PROT_POP3 = 14, + INET_PROT_DATA = 15, + INET_PROT_CID = 16, + INET_PROT_OUT = 17, + INET_PROT_VND_SUN_STAR_WFS = 18, + INET_PROT_VND_SUN_STAR_HIER = 19, + INET_PROT_VIM = 20, + INET_PROT_UNO = 21, + INET_PROT_COMPONENT = 22, + INET_PROT_VND_SUN_STAR_PKG = 23, + INET_PROT_LDAP = 24, + INET_PROT_DB = 25, + INET_PROT_VND_SUN_STAR_CMD = 26, + INET_PROT_VND_SUN_STAR_ODMA = 27, + INET_PROT_TELNET = 28, + INET_PROT_VND_SUN_STAR_EXPAND = 29, + INET_PROT_VND_SUN_STAR_TDOC = 30, + INET_PROT_GENERIC = 31, + INET_PROT_SMB = 32, + INET_PROT_END = 33 +}; + +//============================================================================ +class TOOLS_DLLPUBLIC INetURLObject +{ +public: + //======================================================================== + // Get- and Set-Methods: + + /** The way input strings that represent (parts of) URIs are interpreted + in set-methods. + + @descr Most set-methods accept either a ByteString or a rtl::OUString + as input. Using a ByteString, octets in the range 0x80--0xFF are + replaced by single escape sequences. Using a rtl::OUString , UTF-32 + characters in the range 0x80--0x10FFFF are replaced by sequences of + escape sequences, representing the UTF-8 coded characters. + + @descr Along with an EncodeMechanism parameter, the set-methods all + take an rtl_TextEncoding parameter, which is ignored unless the + EncodeMechanism is WAS_ENCODED. + */ + enum EncodeMechanism + { + /** All escape sequences that are already present are ignored, and are + interpreted as literal sequences of three characters. + */ + ENCODE_ALL, + + /** Sequences of escape sequences, that represent characters from the + specified character set and that can be converted to UTF-32 + characters, are first decoded. If they have to be encoded, they + are converted to UTF-8 characters and are than translated into + (sequences of) escape sequences. Other escape sequences are + copied verbatim (but using upper case hex digits). + */ + WAS_ENCODED, + + /** All escape sequences that are already present are copied verbatim + (but using upper case hex digits). + */ + NOT_CANONIC + }; + + /** The way strings that represent (parts of) URIs are returned from get- + methods. + + @descr Along with a DecodeMechanism parameter, the get-methods all + take an rtl_TextEncoding parameter, which is ignored unless the + DecodeMechanism is DECODE_WITH_CHARSET or DECODE_UNAMBIGUOUS. + */ + enum DecodeMechanism + { + /** The (part of the) URI is returned unchanged. Since URIs are + written using a subset of US-ASCII, the returned string is + guaranteed to contain only US-ASCII characters. + */ + NO_DECODE, + + /** All sequences of escape sequences that represent UTF-8 coded + UTF-32 characters with a numerical value greater than 0x7F, are + replaced by the respective UTF-16 characters. All other escape + sequences are not decoded. + */ + DECODE_TO_IURI, + + /** All (sequences of) escape sequences that represent characters from + the specified character set, and that can be converted to UTF-32, + are replaced by the respective UTF-16 characters. All other + escape sequences are not decoded. + */ + DECODE_WITH_CHARSET, + + /** All (sequences of) escape sequences that represent characters from + the specified character set, that can be converted to UTF-32, and + that (in the case of ASCII characters) can safely be decoded + without altering the meaning of the (part of the) URI, are + replaced by the respective UTF-16 characters. All other escape + sequences are not decoded. + */ + DECODE_UNAMBIGUOUS + }; + + //======================================================================== + // General Structure: + + inline INetURLObject(): + m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP) {} + + inline bool HasError() const { return m_eScheme == INET_PROT_NOT_VALID; } + + inline rtl::OUString GetMainURL(DecodeMechanism eMechanism, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return decode(m_aAbsURIRef, getEscapePrefix(), eMechanism, eCharset); } + + rtl::OUString GetURLNoPass(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + rtl::OUString GetURLNoMark(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + rtl::OUString + getAbbreviated(com::sun::star::uno::Reference< + com::sun::star::util::XStringWidth > const & + rStringWidth, + sal_Int32 nWidth, + DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + bool operator ==(INetURLObject const & rObject) const; + + inline bool operator !=(INetURLObject const & rObject) const + { return !(*this == rObject); } + + bool operator <(INetURLObject const & rObject) const; + + inline bool operator >(INetURLObject const & rObject) const + { return rObject < *this; } + + //======================================================================== + // Strict Parsing: + + inline INetURLObject(ByteString const & rTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline INetURLObject(rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline bool SetURL(ByteString const & rTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline bool SetURL(rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + bool ConcatData(INetProtocol eTheScheme, rtl::OUString const & rTheUser, + rtl::OUString const & rThePassword, + rtl::OUString const & rTheHost, sal_uInt32 nThePort, + rtl::OUString const & rThePath, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + //======================================================================== + // Smart Parsing: + + /** The supported notations for file system paths. + */ + enum FSysStyle + { + /** VOS notation (e.g., "//server/dir/file"). + */ + FSYS_VOS = 0x1, + + /** Unix notation (e.g., "/dir/file"). + */ + FSYS_UNX = 0x2, + + /** DOS notation (e.g., "a:\dir\file" and "\\server\dir\file"). + */ + FSYS_DOS = 0x4, + + /** Mac notation (e.g., "dir:file"). + */ + FSYS_MAC = 0x8, + + /** Detect the used notation. + + @descr For the following descriptions, please note that + whereas FSYS_DEFAULT includes all style bits, combinations of only + a few style bits are also possible, and are also described. + + @descr When used to translate a file system path to a file URL, + the subset of the following productions for which the appropriate + style bit is set are checked in order (using the conventions of + RFC 2234, RFC 2396, and RFC 2732; UCS4 stands for any UCS4 + character): + + Production T1 (VOS local; FSYS_VOS only): + "//." ["/" *UCS4] + becomes + "file:///" *UCS4 + + Production T2 (VOS host; FSYS_VOS only): + "//" [host] ["/" *UCS4] + becomes + "file://" host "/" *UCS4 + + Production T3 (UNC; FSYS_DOS only): + "\\" [host] ["\" *UCS4] + becomes + "file://" host "/" *UCS4 + replacing "\" by "/" within <*UCS4> + + Production T4 (Unix-like DOS; FSYS_DOS only): + ALPHA ":" ["/" *UCS4] + becomes + "file:///" ALPHA ":/" *UCS4 + replacing "\" by "/" within <*UCS4> + + Production T5 (DOS; FSYS_DOS only): + ALPHA ":" ["\" *UCS4] + becomes + "file:///" ALPHA ":/" *UCS4 + replacing "\" by "/" within <*UCS4> + + Production T6 (any): + *UCS4 + becomes + "file:///" *UCS4 + replacing the delimiter by "/" within <*UCS4>. The delimiter is + that character from the set { "/", "\", ":" } which appears most + often in <*UCS4> (if FSYS_UNX is not among the style bits, "/" + is removed from the set; if FSYS_DOS is not among the style + bits, "\" is removed from the set; if FSYS_MAC is not among the + style bits, ":" is removed from the set). If two or more + characters appear the same number of times, the character + mentioned first in that set is chosen. If the first character + of <*UCS4> is the delimiter, that character is not copied. + + @descr When used to translate a file URL to a file system path, + the following productions are checked in order (using the + conventions of RFC 2234, RFC 2396, and RFC 2732): + + Production F1 (VOS; FSYS_VOS): + "file://" host "/" fpath ["#" fragment] + becomes + "//" host "/" fpath + + Production F2 (DOS; FSYS_DOS): + "file:///" ALPHA ":" ["/" fpath] ["#" fragment] + becomes + ALPHA ":" ["\" fpath] + replacing "/" by "\" in <fpath> + + Production F3 (Unix; FSYS_UNX): + "file:///" fpath ["#" fragment] + becomes + "/" fpath + */ + FSYS_DETECT = FSYS_VOS | FSYS_UNX | FSYS_DOS + }; + + inline INetURLObject(rtl::OUString const & rTheAbsURIRef, + INetProtocol eTheSmartScheme, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT); + + inline void SetSmartProtocol(INetProtocol eTheSmartScheme) + { m_eSmartScheme = eTheSmartScheme; } + + inline bool + SetSmartURL(ByteString const & rTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT); + + inline bool + SetSmartURL(rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT); + + inline INetURLObject + smartRel2Abs(ByteString const & rTheRelURIRef, + bool & rWasAbsolute, + bool bIgnoreFragment = false, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + bool bRelativeNonURIs = false, + FSysStyle eStyle = FSYS_DETECT) const; + + inline INetURLObject + smartRel2Abs(rtl::OUString const & rTheRelURIRef, + bool & rWasAbsolute, + bool bIgnoreFragment = false, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + bool bRelativeNonURIs = false, + FSysStyle eStyle = FSYS_DETECT) const; + + //======================================================================== + // Relative URLs: + + inline bool + GetNewAbsURL(ByteString const & rTheRelURIRef, + INetURLObject * pTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT, bool bIgnoreFragment = false) + const; + + inline bool + GetNewAbsURL(rtl::OUString const & rTheRelURIRef, + INetURLObject * pTheAbsURIRef, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT, bool bIgnoreFragment = false) + const; + + /** @descr If rTheRelURIRef cannot be converted to an absolute URL + (because of syntactic reasons), either rTheRelURIRef or an empty + string is returned: If all of the parameters eEncodeMechanism, + eDecodeMechanism and eCharset have their respective default values, + then rTheRelURIRef is returned unmodified; otherwise, an empty string + is returned. + */ + static rtl::OUString + GetAbsURL(rtl::OUString const & rTheBaseURIRef, + rtl::OUString const & rTheRelURIRef, + bool bIgnoreFragment = false, + EncodeMechanism eEncodeMechanism = WAS_ENCODED, + DecodeMechanism eDecodeMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT); + + static inline rtl::OUString + GetRelURL(ByteString const & rTheBaseURIRef, + ByteString const & rTheAbsURIRef, + EncodeMechanism eEncodeMechanism = WAS_ENCODED, + DecodeMechanism eDecodeMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT); + + static inline rtl::OUString + GetRelURL(rtl::OUString const & rTheBaseURIRef, + rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eEncodeMechanism = WAS_ENCODED, + DecodeMechanism eDecodeMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8, + FSysStyle eStyle = FSYS_DETECT); + + //======================================================================== + // External URLs: + + rtl::OUString getExternalURL(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const; + + static inline bool translateToExternal(ByteString const & rTheIntURIRef, + rtl::OUString & rTheExtURIRef, + DecodeMechanism eDecodeMechanism + = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + static inline bool translateToExternal(rtl::OUString const & rTheIntURIRef, + rtl::OUString & rTheExtURIRef, + DecodeMechanism eDecodeMechanism + = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + static inline bool translateToInternal(ByteString const & rTheExtURIRef, + rtl::OUString & rTheIntURIRef, + DecodeMechanism eDecodeMechanism + = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + static inline bool translateToInternal(rtl::OUString const & rTheExtURIRef, + rtl::OUString & rTheIntURIRef, + DecodeMechanism eDecodeMechanism + = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + //======================================================================== + // Scheme: + + struct SchemeInfo; + + inline INetProtocol GetProtocol() const { return m_eScheme; } + + /** Return the URL 'prefix' for a given scheme. + + @param eTheScheme One of the supported URL schemes. + + @return The 'prefix' of URLs of the given scheme. + */ + static rtl::OUString GetScheme(INetProtocol eTheScheme); + + static inline INetProtocol CompareProtocolScheme(ByteString const & + rTheAbsURIRef) + { return CompareProtocolScheme(extend(rTheAbsURIRef)); } + + static INetProtocol CompareProtocolScheme(rtl::OUString const & + rTheAbsURIRef); + + //======================================================================== + // User Info: + + inline bool HasUserData() const { return m_aUser.isPresent(); } + + inline bool IsEmptyUser() const + { return m_aUser.isPresent() && m_aUser.isEmpty(); } + + bool hasPassword() const; + + inline bool IsEmptyPass() const + { return hasPassword() && m_aAuth.isEmpty(); } + + inline rtl::OUString GetUser(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return decode(m_aUser, getEscapePrefix(), eMechanism, eCharset); } + + inline rtl::OUString GetPass(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return decode(m_aAuth, getEscapePrefix(), eMechanism, eCharset); } + + inline bool SetUser(ByteString const & rTheUser, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return setUser(extend(rTheUser), true, eMechanism, eCharset); } + + inline bool SetUser(rtl::OUString const & rTheUser, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return setUser(rTheUser, false, eMechanism, eCharset); } + + void makeAuthCanonic(); + + inline bool SetPass(ByteString const & rThePassword, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline bool SetPass(rtl::OUString const & rThePassword, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline bool SetUserAndPass(ByteString const & rTheUser, + ByteString const & rThePassword, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + inline bool SetUserAndPass(rtl::OUString const & rTheUser, + rtl::OUString const & rThePassword, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + //======================================================================== + // Host and Port: + + inline bool HasPort() const { return m_aPort.isPresent(); } + + inline rtl::OUString GetHost(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return decode(m_aHost, getEscapePrefix(), eMechanism, eCharset); } + + rtl::OUString GetHostPort(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + sal_uInt32 GetPort() const; + + inline bool SetHost(ByteString const & rTheHost, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return setHost(extend(rTheHost), true, eMechanism, eCharset); } + + inline bool SetHost(rtl::OUString const & rTheHost, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return setHost(rTheHost, false, eMechanism, eCharset); } + + bool SetPort(sal_uInt32 nThePort); + + void makePortCanonic(); + + /** Encode the <hostport> part of a URL. + + @ATT Obsolete, because at the moment the <hostport> part of a URL may + not contain any escape sequences anyway, and because this method does + not inform the caller whether the given <hostport> part is legal. + + @param rTheHostPort The <hostport> part of a URL (for its + interpretation, see the general discussion for set-methods). + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return The <hostport> part, encoded according to the given mechanism + and charset ('forbidden' characters replaced by escape sequences). + */ + static inline rtl::OUString encodeHostPort(ByteString const & rTheHostPort, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + /** Encode the <hostport> part of a URL. + + @ATT Obsolete, because at the moment the <hostport> part of a URL may + not contain any escape sequences anyway, and because this method does + not inform the caller whether the given <hostport> part is legal. + + @param rTheHostPort The <hostport> part of a URL (for its + interpretation, see the general discussion for set-methods). + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return The <hostport> part, encoded according to the given mechanism + and charset ('forbidden' characters replaced by escape sequences). + */ + static inline rtl::OUString encodeHostPort(rtl::OUString const & rTheHostPort, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) + { return encodeHostPort(rTheHostPort, false, eMechanism, eCharset); } + + //======================================================================== + // Path: + + inline bool HasURLPath() const { return !m_aPath.isEmpty(); } + + inline rtl::OUString GetURLPath(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return decode(m_aPath, getEscapePrefix(), eMechanism, eCharset); } + + inline bool SetURLPath(ByteString const & rThePath, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return setPath(extend(rThePath), true, eMechanism, eCharset); } + + inline bool SetURLPath(rtl::OUString const & rThePath, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return setPath(rThePath, false, eMechanism, eCharset); } + + //======================================================================== + // Hierarchical Path: + + /** A constant to address the last segment in various methods dealing with + hierarchical paths. + + @descr It is often more efficient to address the last segment using + this constant, than to determine its ordinal value using + getSegmentCount(). + */ + enum { LAST_SEGMENT = -1 }; + + /** The number of segments in the hierarchical path. + + @descr Using RFC 2396 and RFC 2234, a hierarchical path is of the + form + + hierarchical-path = 1*("/" segment) + + segment = name *(";" param) + + name = [base ["." extension]] + + base = 1*pchar + + extension = *<any pchar except "."> + + param = *pchar + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @return The number of segments in the hierarchical path. If the path + is not hierarchical, 0 is returned. + */ + sal_Int32 getSegmentCount(bool bIgnoreFinalSlash = true) const; + + /** Remove a segment from the hierarchical path. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @return True if the segment has successfully been removed (and the + resulting URI is still valid). If the path is not hierarchical, or + the specified segment does not exist, false is returned. If false is + returned, the object is not modified. + */ + bool removeSegment(sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true); + + /** Insert a new segment into the hierarchical path. + + @param rTheName The name part of the new segment. The new segment + will contain no parameters. + + @param bAppendFinalSlash If the new segment is appended at the end of + the hierarchical path, this parameter specifies whether to add a final + slash after it or not. + + @param nIndex The non-negative index of the segment before which + to insert the new segment. LAST_SEGMENT or an nIndex that equals + getSegmentCount() inserts the new segment at the end of the + hierarchical path. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return True if the segment has successfully been inserted (and the + resulting URI is still valid). If the path is not hierarchical, or + the specified place to insert the new segment does not exist, false is + returned. If false is returned, the object is not modified. + */ + inline bool insertName(rtl::OUString const & rTheName, + bool bAppendFinalSlash = false, + sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + /** Get the name of a segment of the hierarchical path. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @param eMechanism See the general discussion for get-methods. + + @param eCharset See the general discussion for get-methods. + + @return The name part of the specified segment. If the path is not + hierarchical, or the specified segment does not exits, an empty string + is returned. + */ + rtl::OUString getName(sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true, + DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + /** Set the name of a segment (preserving any parameters and any query or + fragment part). + + @param rTheName The new name. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return True if the name has successfully been modified (and the + resulting URI is still valid). If the path is not hierarchical, or + the specified segment does not exist, false is returned. If false is + returned, the object is not modified. + */ + bool setName(rtl::OUString const & rTheName, + sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + /** Get the base of the name of a segment. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @param eMechanism See the general discussion for get-methods. + + @param eCharset See the general discussion for get-methods. + + @return The base part of the specified segment. If the path is + not hierarchical, or the specified segment does not exits, an empty + string is returned. + */ + rtl::OUString getBase(sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true, + DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + /** Set the base of the name of a segment (preserving the extension). + + @param rTheBase The new base. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return True if the base has successfully been modified (and the + resulting URI is still valid). If the path is not hierarchical, or + the specified segment does not exist, false is returned. If false is + returned, the object is not modified. + */ + bool setBase(rtl::OUString const & rTheBase, + sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + /** Determine whether the name of a segment has an extension. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @return True if the name of the specified segment has an extension. + If the path is not hierarchical, or the specified segment does not + exist, false is returned. + */ + bool hasExtension(sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true) const; + + /** Get the extension of the name of a segment. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @param eMechanism See the general discussion for get-methods. + + @param eCharset See the general discussion for get-methods. + + @return The extension part of the specified segment. If the path is + not hierarchical, or the specified segment does not exits, an empty + string is returned. + */ + rtl::OUString getExtension(sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true, + DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + /** Set the extension of the name of a segment (replacing an already + existing extension). + + @param rTheExtension The new extension. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return True if the extension has successfully been modified (and the + resulting URI is still valid). If the path is not hierarchical, or + the specified segment does not exist, false is returned. If false is + returned, the object is not modified. + */ + bool setExtension(rtl::OUString const & rTheExtension, + sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + /** Remove the extension of the name of a segment. + + @param nIndex The non-negative index of the segment, or LAST_SEGMENT + if addressing the last segment. + + @param bIgnoreFinalSlash If true, a final slash at the end of the + hierarchical path does not denote an empty segment, but is ignored. + + @return True if the extension has successfully been removed (and the + resulting URI is still valid), or if the name did not have an + extension. If the path is not hierarchical, or the specified segment + does not exist, false is returned. If false is returned, the object + is not modified. + */ + bool removeExtension(sal_Int32 nIndex = LAST_SEGMENT, + bool bIgnoreFinalSlash = true); + + /** Determine whether the hierarchical path ends in a final slash. + + @return True if the hierarchical path ends in a final slash. If the + path is not hierarchical, false is returned. + */ + bool hasFinalSlash() const; + + /** Make the hierarchical path end in a final slash (if it does not + already do so). + + @return True if a final slash has successfully been appended (and the + resulting URI is still valid), or if the hierarchical path already + ended in a final slash. If the path is not hierarchical, false is + returned. If false is returned, the object is not modified. + */ + bool setFinalSlash(); + + /** Remove a final slash from the hierarchical path. + + @return True if a final slash has successfully been removed (and the + resulting URI is still valid), or if the hierarchical path already did + not end in a final slash. If the path is not hierarchical, false is + returned. If false is returned, the object is not modified. + */ + bool removeFinalSlash(); + + //======================================================================== + // Query: + + inline bool HasParam() const { return m_aQuery.isPresent(); } + + inline rtl::OUString GetParam(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return decode(m_aQuery, getEscapePrefix(), eMechanism, eCharset); } + + inline bool SetParam(ByteString const & rTheQuery, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline bool SetParam(rtl::OUString const & rTheQuery, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + //======================================================================== + // Fragment: + + inline bool HasMark() const { return m_aFragment.isPresent(); } + + inline rtl::OUString GetMark(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return decode(m_aFragment, getEscapePrefix(), eMechanism, eCharset); } + + inline bool SetMark(ByteString const & rTheFragment, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline bool SetMark(rtl::OUString const & rTheFragment, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + static rtl::OUString createFragment(rtl::OUString const & rText); + + //======================================================================== + // File URLs: + + /** Create an INetURLObject from a file system path. + + @param rFSysPath A file system path. An URL is not allowed here! + + @param eStyle The notation of rFSysPath. + */ + inline INetURLObject(rtl::OUString const & rFSysPath, FSysStyle eStyle); + + /** Set this INetURLObject to a file URL constructed from a file system + path. + + @param rFSysPath A file system path. An URL is not allowed here! + + @param eStyle The notation of rFSysPath. + + @return True if this INetURLObject has successfully been changed. If + false is returned, this INetURLObject has not been modified. + */ + bool setFSysPath(rtl::OUString const & rFSysPath, FSysStyle eStyle); + + /** Return the file system path represented by a file URL (ignoring any + fragment part). + + @param eStyle The notation of the returned file system path. + + @param pDelimiter Upon successful return, this parameter can return + the character that is the 'main' delimiter within the returned file + system path (e.g., "/" for Unix, "\" for DOS, ":" for Mac). This is + especially useful for routines that later try to shorten the returned + file system path at a 'good' position, e.g. to fit it into some + limited display space. + + @return The file system path represented by this file URL. If this + file URL does not represent a file system path according to the + specified notation, or if this is not a file URL at all, an empty + string is returned. + */ + rtl::OUString getFSysPath(FSysStyle eStyle, sal_Unicode * pDelimiter = 0) + const; + + //======================================================================== + // POP3 and URLs: + + bool HasMsgId() const; + + rtl::OUString GetMsgId(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + //======================================================================== + // Coding: + + 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, + PART_VISIBLE_NONSPECIAL = 0x200000, + PART_CREATEFRAGMENT = 0x400000, + PART_UNO_PARAM_VALUE = 0x800000, + PART_UNAMBIGUOUS = 0x1000000, + PART_URIC_NO_SLASH = 0x2000000, + PART_HTTP_QUERY = 0x4000000, //TODO! unused? + PART_NEWS_ARTICLE_LOCALPART = 0x8000000, + max_part = 0x80000000 + // Do not use! Only there to allow compatible changes in the + // future. + }; + + enum EscapeType + { + ESCAPE_NO, + ESCAPE_OCTET, + ESCAPE_UTF32 + }; + + /** Encode some text as part of a URI. + + @param rText Some text (for its interpretation, see the general + discussion for set-methods). + + @param ePart The part says which characters are 'forbidden' and must + be encoded (replaced by escape sequences). Characters outside the US- + ASCII range are always 'forbidden.' + + @param cEscapePrefix The first character in an escape sequence + (normally '%'). + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return The encoded representation of the text ('forbidden' + characters replaced by escape sequences). + */ + static inline rtl::OUString encode(ByteString const & rText, Part ePart, + sal_Char cEscapePrefix, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + /** Encode some text as part of a URI. + + @param rText Some text (for its interpretation, see the general + discussion for set-methods). + + @param ePart The part says which characters are 'forbidden' and must + be encoded (replaced by escape sequences). Characters outside the US- + ASCII range are always 'forbidden.' + + @param cEscapePrefix The first character in an escape sequence + (normally '%'). + + @param eMechanism See the general discussion for set-methods. + + @param eCharset See the general discussion for set-methods. + + @return The text, encoded according to the given mechanism and + charset ('forbidden' characters replaced by escape sequences). + */ + static inline rtl::OUString encode(rtl::OUString const & rText, Part ePart, + sal_Char cEscapePrefix, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + /** Decode some text. + + @param rText Some (encoded) text. + + @param cEscapePrefix The first character in an escape sequence + (normally '%'). + + @param eMechanism See the general discussion for get-methods. + + @param eCharset See the general discussion for get-methods. + + @return The text, decoded according to the given mechanism and + charset (escape sequences replaced by 'raw' characters). + */ + static inline rtl::OUString decode(rtl::OUString const & rText, + sal_Char cEscapePrefix, + DecodeMechanism eMechanism, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + static inline rtl::OUString decode(rtl::OUStringBuffer const & rText, + sal_Char cEscapePrefix, + DecodeMechanism eMechanism, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8); + + static void appendUCS4Escape(rtl::OUStringBuffer & rTheText, + sal_Char cEscapePrefix, + sal_uInt32 nUCS4); + + static void appendUCS4(rtl::OUStringBuffer & rTheText, sal_uInt32 nUCS4, + EscapeType eEscapeType, bool bOctets, Part ePart, + sal_Char cEscapePrefix, rtl_TextEncoding eCharset, + bool bKeepVisibleEscapes); + + static sal_uInt32 getUTF32(sal_Unicode const *& rBegin, + sal_Unicode const * pEnd, bool bOctets, + sal_Char cEscapePrefix, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + EscapeType & rEscapeType); + + //======================================================================== + // Specialized helpers: + + static sal_uInt32 scanDomain(sal_Unicode const *& rBegin, + sal_Unicode const * pEnd, + bool bEager = true); + + //======================================================================== + // OBSOLETE Hierarchical Path: + + rtl::OUString GetPartBeforeLastName(DecodeMechanism eMechanism + = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const; + + /** Get the last segment in the path. + + @param eMechanism See the general discussion for get-methods. + + @param eCharset See the general discussion for get-methods. + + @return For a hierarchical URL, the last segment (everything after + the last unencoded '/'). Not that this last segment may be empty. If + the URL is not hierarchical, an empty string is returned. + */ + rtl::OUString GetLastName(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + const; + + /** Get the 'extension' of the last segment in the path. + + @param eMechanism See the general discussion for get-methods. + + @param eCharset See the general discussion for get-methods. + + @return For a hierarchical URL, everything after the first unencoded + '.' in the last segment of the path. Note that this 'extension' may + be empty. If the URL is not hierarchical, or if the last segment does + not contain an unencoded '.', an empty string is returned. + */ + rtl::OUString GetFileExtension(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const; + + inline bool Append(ByteString const & rTheSegment, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return appendSegment(extend(rTheSegment), true, eMechanism, eCharset); } + + inline bool Append(rtl::OUString const & rTheSegment, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8) + { return appendSegment(rTheSegment, false, eMechanism, eCharset); } + + bool CutLastName(); + + //======================================================================== + // OBSOLETE File URLs: + + rtl::OUString PathToFileName() const; + + rtl::OUString GetFull() const; + + rtl::OUString GetPath() const; + + void SetBase(rtl::OUString const & rTheBase); + + rtl::OUString GetBase() const; + + void SetName(rtl::OUString const & rTheName, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline rtl::OUString GetName(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return GetLastName(eMechanism, eCharset); } + + rtl::OUString CutName(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + void SetExtension(rtl::OUString const & rTheExtension, + EncodeMechanism eMechanism = WAS_ENCODED, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + inline rtl::OUString GetExtension( + DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset + = RTL_TEXTENCODING_UTF8) const + { return GetFileExtension(eMechanism, eCharset); } + + rtl::OUString CutExtension(DecodeMechanism eMechanism = DECODE_TO_IURI, + rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8); + + bool IsCaseSensitive() const; + + //======================================================================== + +private: + // General Structure: + + class SubString + { + sal_Int32 m_nBegin; + sal_Int32 m_nLength; + + public: + explicit inline SubString(sal_Int32 nTheBegin = -1, + sal_Int32 nTheLength = 0): + m_nBegin(nTheBegin), m_nLength(nTheLength) {} + + inline bool isPresent() const { return m_nBegin != -1; } + + inline bool isEmpty() const { return m_nLength == 0; } + + inline sal_Int32 getBegin() const { return m_nBegin; } + + inline sal_Int32 getLength() const { return m_nLength; } + + inline sal_Int32 getEnd() const { return m_nBegin + m_nLength; } + + inline sal_Int32 clear(); + + inline sal_Int32 set(rtl::OUStringBuffer & rString, + rtl::OUString const & rSubString, + sal_Int32 nTheBegin); + + inline sal_Int32 set(rtl::OUString & rString, + rtl::OUString const & rSubString); + + inline sal_Int32 set(rtl::OUStringBuffer & rString, + rtl::OUString const & rSubString); + + inline void operator +=(sal_Int32 nDelta); + + int compare(SubString const & rOther, + rtl::OUStringBuffer const & rThisString, + rtl::OUStringBuffer const & rOtherString) const; + }; + + rtl::OUStringBuffer m_aAbsURIRef; + SubString m_aScheme; + SubString m_aUser; + SubString m_aAuth; + SubString m_aHost; + SubString m_aPort; + SubString m_aPath; + SubString m_aQuery; + SubString m_aFragment; + INetProtocol m_eScheme; + INetProtocol m_eSmartScheme; + + TOOLS_DLLPRIVATE void setInvalid(); + + bool setAbsURIRef( + rtl::OUString const & rTheAbsURIRef, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset, bool bSmart, + FSysStyle eStyle); + + // Relative URLs: + + bool convertRelToAbs( + rtl::OUString const & rTheRelURIRef, bool bOctets, + INetURLObject & rTheAbsURIRef, bool & rWasAbsolute, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset, + bool bIgnoreFragment, bool bSmart, bool bRelativeNonURIs, + FSysStyle eStyle) const; + + bool convertAbsToRel( + rtl::OUString const & rTheAbsURIRef, bool bOctets, + rtl::OUString & rTheRelURIRef, EncodeMechanism eEncodeMechanism, + DecodeMechanism eDecodeMechanism, rtl_TextEncoding eCharset, + FSysStyle eStyle) const; + + // External URLs: + + static bool convertIntToExt( + rtl::OUString const & rTheIntURIRef, bool bOctets, + rtl::OUString & rTheExtURIRef, DecodeMechanism eDecodeMechanism, + rtl_TextEncoding eCharset); + + static bool convertExtToInt( + rtl::OUString const & rTheExtURIRef, bool bOctets, + rtl::OUString & rTheIntURIRef, DecodeMechanism eDecodeMechanism, + rtl_TextEncoding eCharset); + + // Scheme: + + struct PrefixInfo; + + TOOLS_DLLPRIVATE static inline SchemeInfo const & getSchemeInfo( + INetProtocol eTheScheme); + + TOOLS_DLLPRIVATE inline SchemeInfo const & getSchemeInfo() const; + + TOOLS_DLLPRIVATE static PrefixInfo const * getPrefix( + sal_Unicode const *& rBegin, sal_Unicode const * pEnd); + + // Authority: + + TOOLS_DLLPRIVATE sal_Int32 getAuthorityBegin() const; + + TOOLS_DLLPRIVATE SubString getAuthority() const; + + // User Info: + + bool setUser( + rtl::OUString const & rTheUser, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + bool clearPassword(); + + bool setPassword( + rtl::OUString const & rThePassword, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + // Host and Port: + + TOOLS_DLLPRIVATE static bool parseHost( + sal_Unicode const *& rBegin, sal_Unicode const * pEnd, + rtl::OUString & rCanonic); + + TOOLS_DLLPRIVATE static bool parseHostOrNetBiosName( + sal_Unicode const * pBegin, sal_Unicode const * pEnd, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset, + bool bNetBiosName, rtl::OUStringBuffer* pCanonic); + + static rtl::OUString encodeHostPort( + rtl::OUString const & rTheHostPort, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + bool setHost( + rtl::OUString const & rTheHost, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + // Path: + + TOOLS_DLLPRIVATE static bool parsePath( + INetProtocol eScheme, sal_Unicode const ** pBegin, + sal_Unicode const * pEnd, bool bOctets, EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, bool bSkippedInitialSlash, + sal_uInt32 nSegmentDelimiter, sal_uInt32 nAltSegmentDelimiter, + sal_uInt32 nQueryDelimiter, sal_uInt32 nFragmentDelimiter, + rtl::OUStringBuffer &rSynPath); + + bool setPath( + rtl::OUString const & rThePath, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + // Hierarchical Path: + + TOOLS_DLLPRIVATE bool checkHierarchical() const; + + bool appendSegment( + rtl::OUString const & rTheSegment, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + TOOLS_DLLPRIVATE SubString getSegment( + sal_Int32 nIndex, bool bIgnoreFinalSlash) const; + + bool insertName( + rtl::OUString const & rTheName, bool bOctets, bool bAppendFinalSlash, + sal_Int32 nIndex, bool bIgnoreFinalSlash, EncodeMechanism eMechanism, + rtl_TextEncoding eCharset); + + // Query: + + bool clearQuery(); + + bool setQuery( + rtl::OUString const & rTheQuery, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + // Fragment: + + bool clearFragment(); + + bool setFragment( + rtl::OUString const & rTheMark, bool bOctets, + EncodeMechanism eMechanism, rtl_TextEncoding eCharset); + + // FTP URLs: + + enum FTPType { FTP_TYPE_NONE, FTP_TYPE_A, FTP_TYPE_I, FTP_TYPE_D }; + + TOOLS_DLLPRIVATE FTPType getFTPType() const; + + // FILE URLs: + + TOOLS_DLLPRIVATE bool hasDosVolume(FSysStyle eStyle) const; + + // IMAP URLs: + + TOOLS_DLLPRIVATE sal_uInt32 getIMAPUID() const; + + // Coding: + + static inline rtl::OUString extend(ByteString const & rOctets) + { + return rtl::OUString(rOctets.GetBuffer(), rOctets.Len(), + RTL_TEXTENCODING_ISO_8859_1); + } + + static inline sal_Char getEscapePrefix(INetProtocol eTheScheme) + { return eTheScheme == INET_PROT_VIM ? '=' : '%'; } + + inline sal_Char getEscapePrefix() const + { return getEscapePrefix(m_eScheme); } + + TOOLS_DLLPRIVATE static inline void appendEscape( + rtl::OUStringBuffer & rTheText, sal_Char cEscapePrefix, + sal_uInt32 nOctet); + + 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); + + static inline rtl::OUString encodeText( + rtl::OUString const & rTheText, bool bOctets, Part ePart, + sal_Char cEscapePrefix, EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, bool bKeepVisibleEscapes); + + static rtl::OUString decode( + sal_Unicode const * pBegin, sal_Unicode const * pEnd, + sal_Char cEscapePrefix, DecodeMechanism, rtl_TextEncoding eCharset); + + inline rtl::OUString decode( + SubString const & rSubString, sal_Char cEscapePrefix, + DecodeMechanism eMechanism, rtl_TextEncoding eCharset) const; + + // Specialized helpers: + + TOOLS_DLLPRIVATE static bool scanIPv6reference( + sal_Unicode const *& rBegin, sal_Unicode const * pEnd); +}; + +// static +inline rtl::OUString INetURLObject::encodeText(rtl::OUString const & rTheText, + bool bOctets, Part ePart, + sal_Char cEscapePrefix, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + bool bKeepVisibleEscapes) +{ + return encodeText(rTheText.getStr(), + rTheText.getStr() + rTheText.getLength(), bOctets, ePart, + cEscapePrefix, eMechanism, eCharset, + bKeepVisibleEscapes); +} + +inline rtl::OUString INetURLObject::decode(SubString const & rSubString, + sal_Char cEscapePrefix, + DecodeMechanism eMechanism, + rtl_TextEncoding eCharset) const +{ + return rSubString.isPresent() ? + decode(m_aAbsURIRef.getStr() + rSubString.getBegin(), + m_aAbsURIRef.getStr() + rSubString.getEnd(), + cEscapePrefix, eMechanism, eCharset) : + rtl::OUString(); +} + +inline INetURLObject::INetURLObject(ByteString const & rTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset): + m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP) +{ + setAbsURIRef(extend(rTheAbsURIRef), true, eMechanism, eCharset, false, + FSysStyle(0)); +} + +inline INetURLObject::INetURLObject(rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset): + m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP) +{ + setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, false, + FSysStyle(0)); +} + +inline bool INetURLObject::SetURL(ByteString const & rTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return setAbsURIRef(extend(rTheAbsURIRef), true, eMechanism, eCharset, + false, FSysStyle(0)); +} + +inline bool INetURLObject::SetURL(rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, false, + FSysStyle(0)); +} + +inline INetURLObject::INetURLObject(rtl::OUString const & rTheAbsURIRef, + INetProtocol eTheSmartScheme, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + FSysStyle eStyle): + m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(eTheSmartScheme) +{ + setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, true, eStyle); +} + +inline bool INetURLObject::SetSmartURL(ByteString const & rTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + FSysStyle eStyle) +{ + return setAbsURIRef(extend(rTheAbsURIRef), true, eMechanism, eCharset, + true, eStyle); +} + +inline bool INetURLObject::SetSmartURL(rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + FSysStyle eStyle) +{ + return setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, true, + eStyle); +} + +inline INetURLObject +INetURLObject::smartRel2Abs(ByteString const & rTheRelURIRef, + bool & rWasAbsolute, + bool bIgnoreFragment, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + bool bRelativeNonURIs, + FSysStyle eStyle) const +{ + INetURLObject aTheAbsURIRef; + convertRelToAbs(extend(rTheRelURIRef), true, aTheAbsURIRef, rWasAbsolute, + eMechanism, eCharset, bIgnoreFragment, true, + bRelativeNonURIs, eStyle); + return aTheAbsURIRef; +} + +inline INetURLObject +INetURLObject::smartRel2Abs(rtl::OUString const & rTheRelURIRef, + bool & rWasAbsolute, + bool bIgnoreFragment, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + bool bRelativeNonURIs, + FSysStyle eStyle) const +{ + INetURLObject aTheAbsURIRef; + convertRelToAbs(rTheRelURIRef, false, aTheAbsURIRef, rWasAbsolute, + eMechanism, eCharset, bIgnoreFragment, true, + bRelativeNonURIs, eStyle); + return aTheAbsURIRef; +} + +inline bool INetURLObject::GetNewAbsURL(ByteString const & rTheRelURIRef, + INetURLObject * pTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + FSysStyle eStyle, bool bIgnoreFragment) + const +{ + INetURLObject aTheAbsURIRef; + bool bWasAbsolute; + if (!convertRelToAbs(extend(rTheRelURIRef), true, aTheAbsURIRef, + bWasAbsolute, eMechanism, eCharset, bIgnoreFragment, + false, false, eStyle)) + return false; + if (pTheAbsURIRef) + *pTheAbsURIRef = aTheAbsURIRef; + return true; +} + +inline bool INetURLObject::GetNewAbsURL(rtl::OUString const & rTheRelURIRef, + INetURLObject * pTheAbsURIRef, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset, + FSysStyle eStyle, bool bIgnoreFragment) + const +{ + INetURLObject aTheAbsURIRef; + bool bWasAbsolute; + if (!convertRelToAbs(rTheRelURIRef, false, aTheAbsURIRef, bWasAbsolute, + eMechanism, eCharset, bIgnoreFragment, false, false, + eStyle)) + return false; + if (pTheAbsURIRef) + *pTheAbsURIRef = aTheAbsURIRef; + return true; +} + +// static +inline rtl::OUString INetURLObject::GetRelURL(ByteString const & rTheBaseURIRef, + ByteString const & rTheAbsURIRef, + EncodeMechanism eEncodeMechanism, + DecodeMechanism eDecodeMechanism, + rtl_TextEncoding eCharset, + FSysStyle eStyle) +{ + rtl::OUString aTheRelURIRef; + INetURLObject(rTheBaseURIRef, eEncodeMechanism, eCharset). + convertAbsToRel(extend(rTheAbsURIRef), true, aTheRelURIRef, + eEncodeMechanism, eDecodeMechanism, eCharset, eStyle); + return aTheRelURIRef; +} + +// static +inline rtl::OUString INetURLObject::GetRelURL(rtl::OUString const & rTheBaseURIRef, + rtl::OUString const & rTheAbsURIRef, + EncodeMechanism eEncodeMechanism, + DecodeMechanism eDecodeMechanism, + rtl_TextEncoding eCharset, + FSysStyle eStyle) +{ + rtl::OUString aTheRelURIRef; + INetURLObject(rTheBaseURIRef, eEncodeMechanism, eCharset). + convertAbsToRel(rTheAbsURIRef, false, aTheRelURIRef, eEncodeMechanism, + eDecodeMechanism, eCharset, eStyle); + return aTheRelURIRef; +} + +// static +inline bool INetURLObject::translateToExternal(ByteString const & + rTheIntURIRef, + rtl::OUString & rTheExtURIRef, + DecodeMechanism + eDecodeMechanism, + rtl_TextEncoding eCharset) +{ + rtl::OUString aTheExtURIRef; + bool bRet = convertIntToExt(extend(rTheIntURIRef), true, aTheExtURIRef, + eDecodeMechanism, eCharset); + rTheExtURIRef = aTheExtURIRef; + return bRet; +} + +// static +inline bool INetURLObject::translateToExternal(rtl::OUString const & + rTheIntURIRef, + rtl::OUString & rTheExtURIRef, + DecodeMechanism + eDecodeMechanism, + rtl_TextEncoding eCharset) +{ + return convertIntToExt(rTheIntURIRef, false, rTheExtURIRef, + eDecodeMechanism, eCharset); +} + +// static +inline bool INetURLObject::translateToInternal(ByteString const & + rTheExtURIRef, + rtl::OUString & rTheIntURIRef, + DecodeMechanism + eDecodeMechanism, + rtl_TextEncoding eCharset) +{ + rtl::OUString aTheIntURIRef; + bool bRet = convertExtToInt(extend(rTheExtURIRef), true, aTheIntURIRef, + eDecodeMechanism, eCharset); + rTheIntURIRef = aTheIntURIRef; + return bRet; +} + +// static +inline bool INetURLObject::translateToInternal(rtl::OUString const & + rTheExtURIRef, + rtl::OUString & rTheIntURIRef, + DecodeMechanism + eDecodeMechanism, + rtl_TextEncoding eCharset) +{ + return convertExtToInt(rTheExtURIRef, false, rTheIntURIRef, + eDecodeMechanism, eCharset); +} + +inline bool INetURLObject::SetPass(ByteString const & rThePassword, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return rThePassword.Len() == 0 ? + clearPassword() : + setPassword(extend(rThePassword), true, eMechanism, eCharset); +} + +inline bool INetURLObject::SetPass(rtl::OUString const & rThePassword, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return rThePassword.getLength() == 0 ? + clearPassword() : + setPassword(rThePassword, false, eMechanism, eCharset); +} + +inline bool INetURLObject::SetUserAndPass(ByteString const & rTheUser, + ByteString const & rThePassword, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return setUser(extend(rTheUser), true, eMechanism, eCharset) + && (rThePassword.Len() == 0 ? + clearPassword() : + setPassword(extend(rThePassword), true, eMechanism, + eCharset)); +} + +inline bool INetURLObject::SetUserAndPass(rtl::OUString const & rTheUser, + rtl::OUString const & rThePassword, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return setUser(rTheUser, false, eMechanism, eCharset) + && (rThePassword.getLength() == 0 ? + clearPassword() : + setPassword(rThePassword, false, eMechanism, eCharset)); +} + +// static +inline rtl::OUString INetURLObject::encodeHostPort(ByteString const & + rTheHostPort, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return encodeHostPort(extend(rTheHostPort), true, eMechanism, eCharset); +} + +inline bool INetURLObject::insertName(rtl::OUString const & rTheName, + bool bAppendFinalSlash, + sal_Int32 nIndex, + bool bIgnoreFinalSlash, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return insertName(rTheName, false, bAppendFinalSlash, nIndex, + bIgnoreFinalSlash, eMechanism, eCharset); +} + +inline bool INetURLObject::SetParam(ByteString const & rTheQuery, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return rTheQuery.Len() == 0 ? + clearQuery() : + setQuery(extend(rTheQuery), true, eMechanism, eCharset); +} + +inline bool INetURLObject::SetParam(rtl::OUString const & rTheQuery, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return rTheQuery.getLength() == 0 ? + clearQuery() : + setQuery(rTheQuery, false, eMechanism, eCharset); +} + +inline bool INetURLObject::SetMark(ByteString const & rTheFragment, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return rTheFragment.Len() == 0 ? + clearFragment() : + setFragment(extend(rTheFragment), true, eMechanism, eCharset); +} + +inline bool INetURLObject::SetMark(rtl::OUString const & rTheFragment, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return rTheFragment.getLength() == 0 ? + clearFragment() : + setFragment(rTheFragment, false, eMechanism, eCharset); +} + +inline INetURLObject::INetURLObject(rtl::OUString const & rFSysPath, + FSysStyle eStyle): + m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP) +{ + setFSysPath(rFSysPath, eStyle); +} + +// static +inline rtl::OUString INetURLObject::encode(ByteString const & rText, Part ePart, + sal_Char cEscapePrefix, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return encodeText(extend(rText), true, ePart, cEscapePrefix, eMechanism, + eCharset, false); +} + +// static +inline rtl::OUString INetURLObject::encode(rtl::OUString const & rText, Part ePart, + sal_Char cEscapePrefix, + EncodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return encodeText(rText, false, ePart, cEscapePrefix, eMechanism, + eCharset, false); +} + +// static +inline rtl::OUString INetURLObject::decode(rtl::OUString const & rText, + sal_Char cEscapePrefix, + DecodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return decode(rText.getStr(), rText.getStr() + rText.getLength(), + cEscapePrefix, eMechanism, eCharset); +} + +inline rtl::OUString INetURLObject::decode(rtl::OUStringBuffer const & rText, + sal_Char cEscapePrefix, + DecodeMechanism eMechanism, + rtl_TextEncoding eCharset) +{ + return decode(rText.getStr(), rText.getStr() + rText.getLength(), + cEscapePrefix, eMechanism, eCharset); +} + +#endif // _URLOBJ_HXX diff --git a/tools/inc/tools/vcompat.hxx b/tools/inc/tools/vcompat.hxx new file mode 100644 index 000000000000..750429b21a86 --- /dev/null +++ b/tools/inc/tools/vcompat.hxx @@ -0,0 +1,83 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: vcompat.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: vg $ $Date: 2007-04-11 20:21:17 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef _VCOMPAT_HXX +#define _VCOMPAT_HXX + +#ifndef INCLUDED_TOOLSDLLAPI_H +#include "tools/toolsdllapi.h" +#endif + +#ifndef _SOLAR_H +#include <tools/solar.h> +#endif + +// ----------- +// - Defines - +// ----------- + +#define COMPAT_FORMAT( char1, char2, char3, char4 ) \ + ((UINT32)((((UINT32)(char)(char1)))| \ + (((UINT32)(char)(char2))<<8UL)| \ + (((UINT32)(char)(char3))<<16UL)| \ + ((UINT32)(char)(char4))<<24UL)) + +// -------------- +// - ImplCompat - +// -------------- + +class SvStream; + +class TOOLS_DLLPUBLIC VersionCompat +{ + SvStream* mpRWStm; + UINT32 mnCompatPos; + UINT32 mnTotalSize; + UINT16 mnStmMode; + UINT16 mnVersion; + + VersionCompat() {} + VersionCompat( const VersionCompat& ) {} + VersionCompat& operator=( const VersionCompat& ) { return *this; } + BOOL operator==( const VersionCompat& ) { return FALSE; } + +public: + + VersionCompat( SvStream& rStm, USHORT nStreamMode, UINT16 nVersion = 1 ); + ~VersionCompat(); + + UINT16 GetVersion() const { return mnVersion; } +}; + +#endif // _VCOMPAT_HXX |