xref: /aoo4110/main/tools/inc/tools/urlobj.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #ifndef _URLOBJ_HXX
24*b1cdbd2cSJim Jagielski #define _URLOBJ_HXX
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include "tools/toolsdllapi.h"
27*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
28*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/Reference.hxx"
29*b1cdbd2cSJim Jagielski #include "rtl/string.h"
30*b1cdbd2cSJim Jagielski #include "rtl/ustrbuf.hxx"
31*b1cdbd2cSJim Jagielski #include "rtl/textenc.h"
32*b1cdbd2cSJim Jagielski #include "sal/types.h"
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski namespace com { namespace sun { namespace star { namespace util {
35*b1cdbd2cSJim Jagielski     class XStringWidth;
36*b1cdbd2cSJim Jagielski } } } }
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski //============================================================================
39*b1cdbd2cSJim Jagielski // Special tokens:
40*b1cdbd2cSJim Jagielski #define INET_PASS_TOKEN '@'
41*b1cdbd2cSJim Jagielski #define INET_DELIM_TOKEN ':'
42*b1cdbd2cSJim Jagielski #define INET_DELIM_IMAPID ';'
43*b1cdbd2cSJim Jagielski #define INET_ENC_DELIM_TOKEN '|'
44*b1cdbd2cSJim Jagielski #define INET_DELIM_HOST_TOKEN '.'
45*b1cdbd2cSJim Jagielski #define INET_PATH_TOKEN '/'
46*b1cdbd2cSJim Jagielski #define INET_DOSPATH_TOKEN '\\'
47*b1cdbd2cSJim Jagielski #define INET_MARK_TOKEN '#'
48*b1cdbd2cSJim Jagielski #define INET_PARAM_TOKEN '?'
49*b1cdbd2cSJim Jagielski #define INET_HEX_ESCAPE '%'
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski //============================================================================
52*b1cdbd2cSJim Jagielski // Common URL prefixes for various schemes:
53*b1cdbd2cSJim Jagielski #define	INET_FTP_SCHEME "ftp://"
54*b1cdbd2cSJim Jagielski #define INET_HTTP_SCHEME "http://"
55*b1cdbd2cSJim Jagielski #define INET_HTTPS_SCHEME "https://"
56*b1cdbd2cSJim Jagielski #define INET_FILE_SCHEME "file://"
57*b1cdbd2cSJim Jagielski #define INET_GOPHER_SCHEME "gopher://"
58*b1cdbd2cSJim Jagielski #define INET_MAILTO_SCHEME "mailto:"
59*b1cdbd2cSJim Jagielski #define INET_CID_SCHEME "cid:"
60*b1cdbd2cSJim Jagielski #define INET_NEWS_SCHEME "news:"
61*b1cdbd2cSJim Jagielski #define INET_POP3_SCHEME "pop3://"
62*b1cdbd2cSJim Jagielski #define INET_LDAP_SCHEME "ldap://"
63*b1cdbd2cSJim Jagielski #define INET_PRIVATE_SCHEME "private:"
64*b1cdbd2cSJim Jagielski #define INET_BUGDOC_SCHEME "bugdoc:"
65*b1cdbd2cSJim Jagielski #define INET_SLOT_SCHEME "slot:"
66*b1cdbd2cSJim Jagielski #define INET_MACRO_SCHEME "macro:"
67*b1cdbd2cSJim Jagielski #define INET_JAVASCRIPT_SCHEME "javascript:"
68*b1cdbd2cSJim Jagielski #define INET_IMAP_SCHEME "imap://"
69*b1cdbd2cSJim Jagielski #define INET_DOWNPASS_SCHEME ".."
70*b1cdbd2cSJim Jagielski #define INET_DATA_SCHEME "data:"
71*b1cdbd2cSJim Jagielski #define INET_OUT_SCHEME "out://"
72*b1cdbd2cSJim Jagielski #define INET_FIF_SCHEME "fif://"
73*b1cdbd2cSJim Jagielski #define INET_CEPT_SCHEME "cept://"
74*b1cdbd2cSJim Jagielski #define INET_VIM_SCHEME "vim://"
75*b1cdbd2cSJim Jagielski #define INET_UNO_SCHEME ".uno:"
76*b1cdbd2cSJim Jagielski #define INET_COMPONENT_SCHEME ".component:"
77*b1cdbd2cSJim Jagielski #define INET_DB_SCHEME "db:"
78*b1cdbd2cSJim Jagielski #define INET_BUGID_SCHEME "bugid:"
79*b1cdbd2cSJim Jagielski #define INET_TELNET_SCHEME "telnet://"
80*b1cdbd2cSJim Jagielski #define INET_HID_SCHEME "hid:"
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski #define URL_PREFIX_PRIV_SOFFICE "private:"
83*b1cdbd2cSJim Jagielski enum
84*b1cdbd2cSJim Jagielski {
85*b1cdbd2cSJim Jagielski 	URL_PREFIX_PRIV_SOFFICE_LEN
86*b1cdbd2cSJim Jagielski 	    = RTL_CONSTASCII_LENGTH(URL_PREFIX_PRIV_SOFFICE)
87*b1cdbd2cSJim Jagielski };
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski #define URL_PREFIX_PRIV_OBSOLETE URL_PREFIX_PRIV_SOFFICE
90*b1cdbd2cSJim Jagielski enum
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski 	URL_PREFIX_PRIV_OBSOLETE_LEN
93*b1cdbd2cSJim Jagielski 	    = RTL_CONSTASCII_LENGTH(URL_PREFIX_PRIV_OBSOLETE)
94*b1cdbd2cSJim Jagielski };
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski #define URL_PREFIX_PRIV_EXTERN "staroffice:"
97*b1cdbd2cSJim Jagielski enum
98*b1cdbd2cSJim Jagielski {
99*b1cdbd2cSJim Jagielski 	URL_PREFIX_PRIV_EXTERN_LEN = RTL_CONSTASCII_LENGTH(URL_PREFIX_PRIV_EXTERN)
100*b1cdbd2cSJim Jagielski };
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski //============================================================================
103*b1cdbd2cSJim Jagielski // Schemes:
104*b1cdbd2cSJim Jagielski enum INetProtocol
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski 	INET_PROT_NOT_VALID = 0,
107*b1cdbd2cSJim Jagielski 	INET_PROT_FTP = 1,
108*b1cdbd2cSJim Jagielski 	INET_PROT_HTTP = 2,
109*b1cdbd2cSJim Jagielski 	INET_PROT_FILE = 3,
110*b1cdbd2cSJim Jagielski 	INET_PROT_MAILTO = 4,
111*b1cdbd2cSJim Jagielski 	INET_PROT_VND_SUN_STAR_WEBDAV = 5,
112*b1cdbd2cSJim Jagielski 	INET_PROT_NEWS = 6,
113*b1cdbd2cSJim Jagielski 	INET_PROT_PRIV_SOFFICE = 7,
114*b1cdbd2cSJim Jagielski 	INET_PROT_PRIVATE = INET_PROT_PRIV_SOFFICE, // obsolete
115*b1cdbd2cSJim Jagielski 	INET_PROT_VND_SUN_STAR_HELP = 8,
116*b1cdbd2cSJim Jagielski 	INET_PROT_HTTPS = 9,
117*b1cdbd2cSJim Jagielski 	INET_PROT_SLOT = 10,
118*b1cdbd2cSJim Jagielski 	INET_PROT_MACRO = 11,
119*b1cdbd2cSJim Jagielski 	INET_PROT_JAVASCRIPT = 12,
120*b1cdbd2cSJim Jagielski 	INET_PROT_IMAP = 13,
121*b1cdbd2cSJim Jagielski 	INET_PROT_POP3 = 14,
122*b1cdbd2cSJim Jagielski 	INET_PROT_DATA = 15,
123*b1cdbd2cSJim Jagielski 	INET_PROT_CID = 16,
124*b1cdbd2cSJim Jagielski 	INET_PROT_OUT = 17,
125*b1cdbd2cSJim Jagielski 	INET_PROT_VND_SUN_STAR_HIER = 18,
126*b1cdbd2cSJim Jagielski 	INET_PROT_VIM = 19,
127*b1cdbd2cSJim Jagielski 	INET_PROT_UNO = 20,
128*b1cdbd2cSJim Jagielski 	INET_PROT_COMPONENT = 21,
129*b1cdbd2cSJim Jagielski 	INET_PROT_VND_SUN_STAR_PKG = 22,
130*b1cdbd2cSJim Jagielski 	INET_PROT_LDAP = 23,
131*b1cdbd2cSJim Jagielski 	INET_PROT_DB = 24,
132*b1cdbd2cSJim Jagielski 	INET_PROT_VND_SUN_STAR_CMD = 25,
133*b1cdbd2cSJim Jagielski 	INET_PROT_VND_SUN_STAR_ODMA = 26,
134*b1cdbd2cSJim Jagielski     INET_PROT_TELNET = 27,
135*b1cdbd2cSJim Jagielski     INET_PROT_VND_SUN_STAR_EXPAND = 28,
136*b1cdbd2cSJim Jagielski     INET_PROT_VND_SUN_STAR_TDOC = 29,
137*b1cdbd2cSJim Jagielski     INET_PROT_GENERIC = 30,
138*b1cdbd2cSJim Jagielski     INET_PROT_SMB = 31,
139*b1cdbd2cSJim Jagielski 	INET_PROT_HID = 32,
140*b1cdbd2cSJim Jagielski 	INET_PROT_END = 33
141*b1cdbd2cSJim Jagielski };
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski //============================================================================
144*b1cdbd2cSJim Jagielski class TOOLS_DLLPUBLIC INetURLObject
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski public:
147*b1cdbd2cSJim Jagielski 	//========================================================================
148*b1cdbd2cSJim Jagielski 	// Get- and Set-Methods:
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 	/** The way input strings that represent (parts of) URIs are interpreted
151*b1cdbd2cSJim Jagielski 		in set-methods.
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 		@descr  Most set-methods accept either a ByteString or a rtl::OUString
154*b1cdbd2cSJim Jagielski 		as input.  Using a ByteString, octets in the range 0x80--0xFF are
155*b1cdbd2cSJim Jagielski 		replaced by single escape sequences.  Using a rtl::OUString , UTF-32
156*b1cdbd2cSJim Jagielski 		characters in the range 0x80--0x10FFFF are replaced by sequences of
157*b1cdbd2cSJim Jagielski 		escape sequences, representing the UTF-8 coded characters.
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 		@descr  Along with an EncodeMechanism parameter, the set-methods all
160*b1cdbd2cSJim Jagielski 		take an rtl_TextEncoding parameter, which is ignored unless the
161*b1cdbd2cSJim Jagielski 		EncodeMechanism is WAS_ENCODED.
162*b1cdbd2cSJim Jagielski 	 */
163*b1cdbd2cSJim Jagielski 	enum EncodeMechanism
164*b1cdbd2cSJim Jagielski 	{
165*b1cdbd2cSJim Jagielski 		/** All escape sequences that are already present are ignored, and are
166*b1cdbd2cSJim Jagielski 			interpreted as literal sequences of three characters.
167*b1cdbd2cSJim Jagielski 		 */
168*b1cdbd2cSJim Jagielski 		ENCODE_ALL,
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 		/** Sequences of escape sequences, that represent characters from the
171*b1cdbd2cSJim Jagielski 			specified character set and that can be converted to UTF-32
172*b1cdbd2cSJim Jagielski 			characters, are first decoded.  If they have to be encoded, they
173*b1cdbd2cSJim Jagielski 			are converted to UTF-8 characters and are than translated into
174*b1cdbd2cSJim Jagielski 			(sequences of) escape sequences.  Other escape sequences are
175*b1cdbd2cSJim Jagielski 			copied verbatim (but using upper case hex digits).
176*b1cdbd2cSJim Jagielski 		 */
177*b1cdbd2cSJim Jagielski 		WAS_ENCODED,
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 		/** All escape sequences that are already present are copied verbatim
180*b1cdbd2cSJim Jagielski 			(but using upper case hex digits).
181*b1cdbd2cSJim Jagielski 		 */
182*b1cdbd2cSJim Jagielski 		NOT_CANONIC
183*b1cdbd2cSJim Jagielski 	};
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 	/** The way strings that represent (parts of) URIs are returned from get-
186*b1cdbd2cSJim Jagielski 		methods.
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 		@descr  Along with a DecodeMechanism parameter, the get-methods all
189*b1cdbd2cSJim Jagielski 		take an rtl_TextEncoding parameter, which is ignored unless the
190*b1cdbd2cSJim Jagielski 		DecodeMechanism is DECODE_WITH_CHARSET or DECODE_UNAMBIGUOUS.
191*b1cdbd2cSJim Jagielski 	 */
192*b1cdbd2cSJim Jagielski 	enum DecodeMechanism
193*b1cdbd2cSJim Jagielski 	{
194*b1cdbd2cSJim Jagielski 		/** The (part of the) URI is returned unchanged.  Since URIs are
195*b1cdbd2cSJim Jagielski 			written using a subset of US-ASCII, the returned string is
196*b1cdbd2cSJim Jagielski 			guaranteed to contain only US-ASCII characters.
197*b1cdbd2cSJim Jagielski 		 */
198*b1cdbd2cSJim Jagielski 		NO_DECODE,
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 		/** All sequences of escape sequences that represent UTF-8 coded
201*b1cdbd2cSJim Jagielski 			UTF-32 characters with a numerical value greater than 0x7F, are
202*b1cdbd2cSJim Jagielski 			replaced by the respective UTF-16 characters.  All other escape
203*b1cdbd2cSJim Jagielski 			sequences are not decoded.
204*b1cdbd2cSJim Jagielski 		 */
205*b1cdbd2cSJim Jagielski 		DECODE_TO_IURI,
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 		/** All (sequences of) escape sequences that represent characters from
208*b1cdbd2cSJim Jagielski 			the specified character set, and that can be converted to UTF-32,
209*b1cdbd2cSJim Jagielski 			are replaced by the respective UTF-16 characters.  All other
210*b1cdbd2cSJim Jagielski 			escape sequences are not decoded.
211*b1cdbd2cSJim Jagielski 		 */
212*b1cdbd2cSJim Jagielski 		DECODE_WITH_CHARSET,
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 		/** All (sequences of) escape sequences that represent characters from
215*b1cdbd2cSJim Jagielski 			the specified character set, that can be converted to UTF-32, and
216*b1cdbd2cSJim Jagielski 			that (in the case of ASCII characters) can safely be decoded
217*b1cdbd2cSJim Jagielski 			without altering the meaning of the (part of the) URI, are
218*b1cdbd2cSJim Jagielski 			replaced by the respective UTF-16 characters.  All other escape
219*b1cdbd2cSJim Jagielski 			sequences are not decoded.
220*b1cdbd2cSJim Jagielski 		 */
221*b1cdbd2cSJim Jagielski 		DECODE_UNAMBIGUOUS
222*b1cdbd2cSJim Jagielski 	};
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	//========================================================================
225*b1cdbd2cSJim Jagielski 	// General Structure:
226*b1cdbd2cSJim Jagielski 
INetURLObject()227*b1cdbd2cSJim Jagielski 	inline INetURLObject():
228*b1cdbd2cSJim Jagielski 		m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP) {}
229*b1cdbd2cSJim Jagielski 
HasError() const230*b1cdbd2cSJim Jagielski 	inline bool HasError() const { return m_eScheme == INET_PROT_NOT_VALID; }
231*b1cdbd2cSJim Jagielski 
GetMainURL(DecodeMechanism eMechanism,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const232*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetMainURL(DecodeMechanism eMechanism,
233*b1cdbd2cSJim Jagielski 								rtl_TextEncoding eCharset
234*b1cdbd2cSJim Jagielski 								    = RTL_TEXTENCODING_UTF8) const
235*b1cdbd2cSJim Jagielski 	{ return decode(m_aAbsURIRef, getEscapePrefix(), eMechanism, eCharset); }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 	rtl::OUString GetURLNoPass(DecodeMechanism eMechanism = DECODE_TO_IURI,
238*b1cdbd2cSJim Jagielski 						   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
239*b1cdbd2cSJim Jagielski 		const;
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 	rtl::OUString GetURLNoMark(DecodeMechanism eMechanism = DECODE_TO_IURI,
242*b1cdbd2cSJim Jagielski 						   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
243*b1cdbd2cSJim Jagielski 		const;
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     rtl::OUString
246*b1cdbd2cSJim Jagielski     getAbbreviated(com::sun::star::uno::Reference<
247*b1cdbd2cSJim Jagielski                            com::sun::star::util::XStringWidth > const &
248*b1cdbd2cSJim Jagielski                        rStringWidth,
249*b1cdbd2cSJim Jagielski                    sal_Int32 nWidth,
250*b1cdbd2cSJim Jagielski                    DecodeMechanism eMechanism = DECODE_TO_IURI,
251*b1cdbd2cSJim Jagielski                    rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
252*b1cdbd2cSJim Jagielski 		const;
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	bool operator ==(INetURLObject const & rObject) const;
255*b1cdbd2cSJim Jagielski 
operator !=(INetURLObject const & rObject) const256*b1cdbd2cSJim Jagielski 	inline bool operator !=(INetURLObject const & rObject) const
257*b1cdbd2cSJim Jagielski 	{ return !(*this == rObject); }
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski 	bool operator <(INetURLObject const & rObject) const;
260*b1cdbd2cSJim Jagielski 
operator >(INetURLObject const & rObject) const261*b1cdbd2cSJim Jagielski 	inline bool operator >(INetURLObject const & rObject) const
262*b1cdbd2cSJim Jagielski 	{ return rObject < *this; }
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 	//========================================================================
265*b1cdbd2cSJim Jagielski 	// Strict Parsing:
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 	inline INetURLObject(ByteString const & rTheAbsURIRef,
268*b1cdbd2cSJim Jagielski 						 EncodeMechanism eMechanism = WAS_ENCODED,
269*b1cdbd2cSJim Jagielski 						 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 	inline INetURLObject(rtl::OUString const & rTheAbsURIRef,
272*b1cdbd2cSJim Jagielski 						 EncodeMechanism eMechanism = WAS_ENCODED,
273*b1cdbd2cSJim Jagielski 						 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski 	inline bool SetURL(ByteString const & rTheAbsURIRef,
276*b1cdbd2cSJim Jagielski 					   EncodeMechanism eMechanism = WAS_ENCODED,
277*b1cdbd2cSJim Jagielski 					   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 	inline bool SetURL(rtl::OUString const & rTheAbsURIRef,
280*b1cdbd2cSJim Jagielski 					   EncodeMechanism eMechanism = WAS_ENCODED,
281*b1cdbd2cSJim Jagielski 					   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	bool ConcatData(INetProtocol eTheScheme, rtl::OUString const & rTheUser,
284*b1cdbd2cSJim Jagielski 					rtl::OUString const & rThePassword,
285*b1cdbd2cSJim Jagielski 					rtl::OUString const & rTheHost, sal_uInt32 nThePort,
286*b1cdbd2cSJim Jagielski 					rtl::OUString const & rThePath,
287*b1cdbd2cSJim Jagielski 					EncodeMechanism eMechanism = WAS_ENCODED,
288*b1cdbd2cSJim Jagielski 					rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 	//========================================================================
291*b1cdbd2cSJim Jagielski 	// Smart Parsing:
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 	/** The supported notations for file system paths.
294*b1cdbd2cSJim Jagielski 	 */
295*b1cdbd2cSJim Jagielski 	enum FSysStyle
296*b1cdbd2cSJim Jagielski 	{
297*b1cdbd2cSJim Jagielski 		/** VOS notation (e.g., "//server/dir/file").
298*b1cdbd2cSJim Jagielski 		 */
299*b1cdbd2cSJim Jagielski 		FSYS_VOS = 0x1,
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski 		/** Unix notation (e.g., "/dir/file").
302*b1cdbd2cSJim Jagielski 		 */
303*b1cdbd2cSJim Jagielski 		FSYS_UNX = 0x2,
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 		/** DOS notation (e.g., "a:\dir\file" and "\\server\dir\file").
306*b1cdbd2cSJim Jagielski 		 */
307*b1cdbd2cSJim Jagielski 		FSYS_DOS = 0x4,
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 		/** Mac notation (e.g., "dir:file").
310*b1cdbd2cSJim Jagielski 		 */
311*b1cdbd2cSJim Jagielski 		FSYS_MAC = 0x8,
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 		/** Detect the used notation.
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 			@descr  For the following descriptions, please note that
316*b1cdbd2cSJim Jagielski 			whereas FSYS_DEFAULT includes all style bits, combinations of only
317*b1cdbd2cSJim Jagielski 			a few style bits are also possible, and are also described.
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 			@descr  When used to translate a file system path to a file URL,
320*b1cdbd2cSJim Jagielski 			the subset of the following productions for which the appropriate
321*b1cdbd2cSJim Jagielski 			style bit is set are checked in order (using the conventions of
322*b1cdbd2cSJim Jagielski 			RFC 2234, RFC 2396, and RFC 2732; UCS4 stands for any UCS4
323*b1cdbd2cSJim Jagielski 			character):
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 			 Production T1 (VOS local; FSYS_VOS only):
326*b1cdbd2cSJim Jagielski 			    "//." ["/" *UCS4]
327*b1cdbd2cSJim Jagielski 			  becomes
328*b1cdbd2cSJim Jagielski 			    "file:///" *UCS4
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski 			 Production T2 (VOS host; FSYS_VOS only):
331*b1cdbd2cSJim Jagielski 			    "//" [host] ["/" *UCS4]
332*b1cdbd2cSJim Jagielski 			  becomes
333*b1cdbd2cSJim Jagielski 			    "file://" host "/" *UCS4
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 			 Production T3 (UNC; FSYS_DOS only):
336*b1cdbd2cSJim Jagielski 			    "\\" [host] ["\" *UCS4]
337*b1cdbd2cSJim Jagielski 			  becomes
338*b1cdbd2cSJim Jagielski 			    "file://" host "/" *UCS4
339*b1cdbd2cSJim Jagielski 			  replacing "\" by "/" within <*UCS4>
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 			 Production T4 (Unix-like DOS; FSYS_DOS only):
342*b1cdbd2cSJim Jagielski 			    ALPHA ":" ["/" *UCS4]
343*b1cdbd2cSJim Jagielski 			  becomes
344*b1cdbd2cSJim Jagielski 			    "file:///" ALPHA ":/" *UCS4
345*b1cdbd2cSJim Jagielski 			  replacing "\" by "/" within <*UCS4>
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 			 Production T5 (DOS; FSYS_DOS only):
348*b1cdbd2cSJim Jagielski 			    ALPHA ":" ["\" *UCS4]
349*b1cdbd2cSJim Jagielski 			  becomes
350*b1cdbd2cSJim Jagielski 			    "file:///" ALPHA ":/" *UCS4
351*b1cdbd2cSJim Jagielski 			  replacing "\" by "/" within <*UCS4>
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 			 Production T6 (any):
354*b1cdbd2cSJim Jagielski 			    *UCS4
355*b1cdbd2cSJim Jagielski 			  becomes
356*b1cdbd2cSJim Jagielski 			    "file:///" *UCS4
357*b1cdbd2cSJim Jagielski 			  replacing the delimiter by "/" within <*UCS4>.  The delimiter is
358*b1cdbd2cSJim Jagielski 			  that character from the set { "/", "\", ":" } which appears most
359*b1cdbd2cSJim Jagielski 			  often in <*UCS4> (if FSYS_UNX is not among the style bits, "/"
360*b1cdbd2cSJim Jagielski 			  is removed from the set; if FSYS_DOS is not among the style
361*b1cdbd2cSJim Jagielski 			  bits, "\" is removed from the set; if FSYS_MAC is not among the
362*b1cdbd2cSJim Jagielski 			  style bits, ":" is removed from the set).  If two or more
363*b1cdbd2cSJim Jagielski 			  characters appear the same number of times, the character
364*b1cdbd2cSJim Jagielski 			  mentioned first in that set is chosen.  If the first character
365*b1cdbd2cSJim Jagielski 			  of <*UCS4> is the delimiter, that character is not copied.
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 			@descr  When used to translate a file URL to a file system path,
368*b1cdbd2cSJim Jagielski 			the following productions are checked in order (using the
369*b1cdbd2cSJim Jagielski 			conventions of RFC 2234, RFC 2396, and RFC 2732):
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 			 Production F1 (VOS; FSYS_VOS):
372*b1cdbd2cSJim Jagielski 			    "file://" host "/" fpath ["#" fragment]
373*b1cdbd2cSJim Jagielski 			  becomes
374*b1cdbd2cSJim Jagielski 			    "//" host "/" fpath
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 			 Production F2 (DOS; FSYS_DOS):
377*b1cdbd2cSJim Jagielski 			    "file:///" ALPHA ":" ["/" fpath] ["#" fragment]
378*b1cdbd2cSJim Jagielski 			  becomes
379*b1cdbd2cSJim Jagielski 			    ALPHA ":" ["\" fpath]
380*b1cdbd2cSJim Jagielski 			  replacing "/" by "\" in <fpath>
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 			 Production F3 (Unix; FSYS_UNX):
383*b1cdbd2cSJim Jagielski 			    "file:///" fpath ["#" fragment]
384*b1cdbd2cSJim Jagielski 			  becomes
385*b1cdbd2cSJim Jagielski 			    "/" fpath
386*b1cdbd2cSJim Jagielski 		 */
387*b1cdbd2cSJim Jagielski 		FSYS_DETECT = FSYS_VOS | FSYS_UNX | FSYS_DOS
388*b1cdbd2cSJim Jagielski 	};
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 	inline INetURLObject(rtl::OUString const & rTheAbsURIRef,
391*b1cdbd2cSJim Jagielski 						 INetProtocol eTheSmartScheme,
392*b1cdbd2cSJim Jagielski 						 EncodeMechanism eMechanism = WAS_ENCODED,
393*b1cdbd2cSJim Jagielski 						 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
394*b1cdbd2cSJim Jagielski 						 FSysStyle eStyle = FSYS_DETECT);
395*b1cdbd2cSJim Jagielski 
SetSmartProtocol(INetProtocol eTheSmartScheme)396*b1cdbd2cSJim Jagielski 	inline void SetSmartProtocol(INetProtocol eTheSmartScheme)
397*b1cdbd2cSJim Jagielski 	{ m_eSmartScheme = eTheSmartScheme; }
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 	inline bool
400*b1cdbd2cSJim Jagielski 	SetSmartURL(ByteString const & rTheAbsURIRef,
401*b1cdbd2cSJim Jagielski 				EncodeMechanism eMechanism = WAS_ENCODED,
402*b1cdbd2cSJim Jagielski 				rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
403*b1cdbd2cSJim Jagielski 				FSysStyle eStyle = FSYS_DETECT);
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	inline bool
406*b1cdbd2cSJim Jagielski 	SetSmartURL(rtl::OUString const & rTheAbsURIRef,
407*b1cdbd2cSJim Jagielski 				EncodeMechanism eMechanism = WAS_ENCODED,
408*b1cdbd2cSJim Jagielski 				rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
409*b1cdbd2cSJim Jagielski 				FSysStyle eStyle = FSYS_DETECT);
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski 	inline INetURLObject
412*b1cdbd2cSJim Jagielski 	smartRel2Abs(ByteString const & rTheRelURIRef,
413*b1cdbd2cSJim Jagielski 				 bool & rWasAbsolute,
414*b1cdbd2cSJim Jagielski 				 bool bIgnoreFragment = false,
415*b1cdbd2cSJim Jagielski 				 EncodeMechanism eMechanism = WAS_ENCODED,
416*b1cdbd2cSJim Jagielski 				 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
417*b1cdbd2cSJim Jagielski 				 bool bRelativeNonURIs = false,
418*b1cdbd2cSJim Jagielski 				 FSysStyle eStyle = FSYS_DETECT) const;
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 	inline INetURLObject
421*b1cdbd2cSJim Jagielski 	smartRel2Abs(rtl::OUString const & rTheRelURIRef,
422*b1cdbd2cSJim Jagielski 				 bool & rWasAbsolute,
423*b1cdbd2cSJim Jagielski 				 bool bIgnoreFragment = false,
424*b1cdbd2cSJim Jagielski 				 EncodeMechanism eMechanism = WAS_ENCODED,
425*b1cdbd2cSJim Jagielski 				 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
426*b1cdbd2cSJim Jagielski 				 bool bRelativeNonURIs = false,
427*b1cdbd2cSJim Jagielski 				 FSysStyle eStyle = FSYS_DETECT) const;
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 	//========================================================================
430*b1cdbd2cSJim Jagielski 	// Relative URLs:
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 	inline bool
433*b1cdbd2cSJim Jagielski 	GetNewAbsURL(ByteString const & rTheRelURIRef,
434*b1cdbd2cSJim Jagielski 				 INetURLObject * pTheAbsURIRef,
435*b1cdbd2cSJim Jagielski 				 EncodeMechanism eMechanism = WAS_ENCODED,
436*b1cdbd2cSJim Jagielski 				 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
437*b1cdbd2cSJim Jagielski 				 FSysStyle eStyle = FSYS_DETECT, bool bIgnoreFragment = false)
438*b1cdbd2cSJim Jagielski         const;
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski 	inline bool
441*b1cdbd2cSJim Jagielski 	GetNewAbsURL(rtl::OUString const & rTheRelURIRef,
442*b1cdbd2cSJim Jagielski 				 INetURLObject * pTheAbsURIRef,
443*b1cdbd2cSJim Jagielski 				 EncodeMechanism eMechanism = WAS_ENCODED,
444*b1cdbd2cSJim Jagielski 				 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
445*b1cdbd2cSJim Jagielski 				 FSysStyle eStyle = FSYS_DETECT, bool bIgnoreFragment = false)
446*b1cdbd2cSJim Jagielski         const;
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 	/** @descr  If rTheRelURIRef cannot be converted to an absolute URL
449*b1cdbd2cSJim Jagielski 		(because of syntactic reasons), either rTheRelURIRef or an empty
450*b1cdbd2cSJim Jagielski 		string is returned:  If all of the parameters eEncodeMechanism,
451*b1cdbd2cSJim Jagielski 		eDecodeMechanism and eCharset have their respective default values,
452*b1cdbd2cSJim Jagielski 		then rTheRelURIRef is returned unmodified; otherwise, an empty string
453*b1cdbd2cSJim Jagielski 		is returned.
454*b1cdbd2cSJim Jagielski 	 */
455*b1cdbd2cSJim Jagielski     static rtl::OUString
456*b1cdbd2cSJim Jagielski     GetAbsURL(rtl::OUString const & rTheBaseURIRef,
457*b1cdbd2cSJim Jagielski               rtl::OUString const & rTheRelURIRef,
458*b1cdbd2cSJim Jagielski               bool bIgnoreFragment = false,
459*b1cdbd2cSJim Jagielski               EncodeMechanism eEncodeMechanism = WAS_ENCODED,
460*b1cdbd2cSJim Jagielski               DecodeMechanism eDecodeMechanism = DECODE_TO_IURI,
461*b1cdbd2cSJim Jagielski               rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
462*b1cdbd2cSJim Jagielski               FSysStyle eStyle = FSYS_DETECT);
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	static inline rtl::OUString
465*b1cdbd2cSJim Jagielski 	GetRelURL(ByteString const & rTheBaseURIRef,
466*b1cdbd2cSJim Jagielski 			  ByteString const & rTheAbsURIRef,
467*b1cdbd2cSJim Jagielski 			  EncodeMechanism eEncodeMechanism = WAS_ENCODED,
468*b1cdbd2cSJim Jagielski 			  DecodeMechanism eDecodeMechanism = DECODE_TO_IURI,
469*b1cdbd2cSJim Jagielski 			  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
470*b1cdbd2cSJim Jagielski 			  FSysStyle eStyle = FSYS_DETECT);
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski 	static inline rtl::OUString
473*b1cdbd2cSJim Jagielski 	GetRelURL(rtl::OUString const & rTheBaseURIRef,
474*b1cdbd2cSJim Jagielski 			  rtl::OUString const & rTheAbsURIRef,
475*b1cdbd2cSJim Jagielski 			  EncodeMechanism eEncodeMechanism = WAS_ENCODED,
476*b1cdbd2cSJim Jagielski 			  DecodeMechanism eDecodeMechanism = DECODE_TO_IURI,
477*b1cdbd2cSJim Jagielski 			  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8,
478*b1cdbd2cSJim Jagielski 			  FSysStyle eStyle = FSYS_DETECT);
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski 	//========================================================================
481*b1cdbd2cSJim Jagielski 	// External URLs:
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski 	rtl::OUString getExternalURL(DecodeMechanism eMechanism = DECODE_TO_IURI,
484*b1cdbd2cSJim Jagielski 							 rtl_TextEncoding eCharset
485*b1cdbd2cSJim Jagielski 							     = RTL_TEXTENCODING_UTF8) const;
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 	static inline bool translateToExternal(ByteString const & rTheIntURIRef,
488*b1cdbd2cSJim Jagielski 										   rtl::OUString & rTheExtURIRef,
489*b1cdbd2cSJim Jagielski 										   DecodeMechanism eDecodeMechanism
490*b1cdbd2cSJim Jagielski 										       = DECODE_TO_IURI,
491*b1cdbd2cSJim Jagielski 										   rtl_TextEncoding eCharset
492*b1cdbd2cSJim Jagielski 										       = RTL_TEXTENCODING_UTF8);
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 	static inline bool translateToExternal(rtl::OUString const & rTheIntURIRef,
495*b1cdbd2cSJim Jagielski 										   rtl::OUString & rTheExtURIRef,
496*b1cdbd2cSJim Jagielski 										   DecodeMechanism eDecodeMechanism
497*b1cdbd2cSJim Jagielski 										       = DECODE_TO_IURI,
498*b1cdbd2cSJim Jagielski 										   rtl_TextEncoding eCharset
499*b1cdbd2cSJim Jagielski 										       = RTL_TEXTENCODING_UTF8);
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski 	static inline bool translateToInternal(ByteString const & rTheExtURIRef,
502*b1cdbd2cSJim Jagielski 										   rtl::OUString & rTheIntURIRef,
503*b1cdbd2cSJim Jagielski 										   DecodeMechanism eDecodeMechanism
504*b1cdbd2cSJim Jagielski 										       = DECODE_TO_IURI,
505*b1cdbd2cSJim Jagielski 										   rtl_TextEncoding eCharset
506*b1cdbd2cSJim Jagielski 										       = RTL_TEXTENCODING_UTF8);
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski     static inline bool translateToInternal(rtl::OUString const & rTheExtURIRef,
509*b1cdbd2cSJim Jagielski                                            rtl::OUString & rTheIntURIRef,
510*b1cdbd2cSJim Jagielski                                            DecodeMechanism eDecodeMechanism
511*b1cdbd2cSJim Jagielski                                                = DECODE_TO_IURI,
512*b1cdbd2cSJim Jagielski                                            rtl_TextEncoding eCharset
513*b1cdbd2cSJim Jagielski                                                = RTL_TEXTENCODING_UTF8);
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski 	//========================================================================
516*b1cdbd2cSJim Jagielski 	// Scheme:
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski 	struct SchemeInfo;
519*b1cdbd2cSJim Jagielski 
GetProtocol() const520*b1cdbd2cSJim Jagielski 	inline INetProtocol GetProtocol() const { return m_eScheme; }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski 	/** Return the URL 'prefix' for a given scheme.
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski 		@param eTheScheme  One of the supported URL schemes.
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski 		@return  The 'prefix' of URLs of the given scheme.
527*b1cdbd2cSJim Jagielski 	 */
528*b1cdbd2cSJim Jagielski 	static rtl::OUString GetScheme(INetProtocol eTheScheme);
529*b1cdbd2cSJim Jagielski 
CompareProtocolScheme(ByteString const & rTheAbsURIRef)530*b1cdbd2cSJim Jagielski 	static inline INetProtocol CompareProtocolScheme(ByteString const &
531*b1cdbd2cSJim Jagielski 													     rTheAbsURIRef)
532*b1cdbd2cSJim Jagielski 	{ return CompareProtocolScheme(extend(rTheAbsURIRef)); }
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 	static INetProtocol CompareProtocolScheme(rtl::OUString const &
535*b1cdbd2cSJim Jagielski 											      rTheAbsURIRef);
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 	//========================================================================
538*b1cdbd2cSJim Jagielski 	// User Info:
539*b1cdbd2cSJim Jagielski 
HasUserData() const540*b1cdbd2cSJim Jagielski 	inline bool HasUserData() const { return m_aUser.isPresent(); }
541*b1cdbd2cSJim Jagielski 
IsEmptyUser() const542*b1cdbd2cSJim Jagielski 	inline bool IsEmptyUser() const
543*b1cdbd2cSJim Jagielski 	{ return m_aUser.isPresent() && m_aUser.isEmpty(); }
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 	bool hasPassword() const;
546*b1cdbd2cSJim Jagielski 
IsEmptyPass() const547*b1cdbd2cSJim Jagielski 	inline bool IsEmptyPass() const
548*b1cdbd2cSJim Jagielski 	{ return hasPassword() && m_aAuth.isEmpty(); }
549*b1cdbd2cSJim Jagielski 
GetUser(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const550*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetUser(DecodeMechanism eMechanism = DECODE_TO_IURI,
551*b1cdbd2cSJim Jagielski 							 rtl_TextEncoding eCharset
552*b1cdbd2cSJim Jagielski 							     = RTL_TEXTENCODING_UTF8) const
553*b1cdbd2cSJim Jagielski 	{ return decode(m_aUser, getEscapePrefix(), eMechanism, eCharset); }
554*b1cdbd2cSJim Jagielski 
GetPass(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const555*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetPass(DecodeMechanism eMechanism = DECODE_TO_IURI,
556*b1cdbd2cSJim Jagielski 							 rtl_TextEncoding eCharset
557*b1cdbd2cSJim Jagielski 							     = RTL_TEXTENCODING_UTF8) const
558*b1cdbd2cSJim Jagielski 	{ return decode(m_aAuth, getEscapePrefix(), eMechanism, eCharset); }
559*b1cdbd2cSJim Jagielski 
SetUser(ByteString const & rTheUser,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)560*b1cdbd2cSJim Jagielski 	inline bool SetUser(ByteString const & rTheUser,
561*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
562*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
563*b1cdbd2cSJim Jagielski 	{ return setUser(extend(rTheUser), true, eMechanism, eCharset); }
564*b1cdbd2cSJim Jagielski 
SetUser(rtl::OUString const & rTheUser,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)565*b1cdbd2cSJim Jagielski 	inline bool SetUser(rtl::OUString const & rTheUser,
566*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
567*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
568*b1cdbd2cSJim Jagielski 	{ return setUser(rTheUser, false, eMechanism, eCharset); }
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski 	void makeAuthCanonic();
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski 	inline bool SetPass(ByteString const & rThePassword,
573*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
574*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 	inline bool SetPass(rtl::OUString const & rThePassword,
577*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
578*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski 	inline bool SetUserAndPass(ByteString const & rTheUser,
581*b1cdbd2cSJim Jagielski 							   ByteString const & rThePassword,
582*b1cdbd2cSJim Jagielski 							   EncodeMechanism eMechanism = WAS_ENCODED,
583*b1cdbd2cSJim Jagielski 							   rtl_TextEncoding eCharset
584*b1cdbd2cSJim Jagielski 							       = RTL_TEXTENCODING_UTF8);
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski 	inline bool SetUserAndPass(rtl::OUString const & rTheUser,
587*b1cdbd2cSJim Jagielski 							   rtl::OUString const & rThePassword,
588*b1cdbd2cSJim Jagielski 							   EncodeMechanism eMechanism = WAS_ENCODED,
589*b1cdbd2cSJim Jagielski 							   rtl_TextEncoding eCharset
590*b1cdbd2cSJim Jagielski 							       = RTL_TEXTENCODING_UTF8);
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 	//========================================================================
593*b1cdbd2cSJim Jagielski 	// Host and Port:
594*b1cdbd2cSJim Jagielski 
HasPort() const595*b1cdbd2cSJim Jagielski 	inline bool HasPort() const { return m_aPort.isPresent(); }
596*b1cdbd2cSJim Jagielski 
GetHost(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const597*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetHost(DecodeMechanism eMechanism = DECODE_TO_IURI,
598*b1cdbd2cSJim Jagielski 							 rtl_TextEncoding eCharset
599*b1cdbd2cSJim Jagielski 							     = RTL_TEXTENCODING_UTF8) const
600*b1cdbd2cSJim Jagielski 	{ return decode(m_aHost, getEscapePrefix(), eMechanism, eCharset); }
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 	rtl::OUString GetHostPort(DecodeMechanism eMechanism = DECODE_TO_IURI,
603*b1cdbd2cSJim Jagielski 						  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 	sal_uInt32 GetPort() const;
606*b1cdbd2cSJim Jagielski 
SetHost(ByteString const & rTheHost,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)607*b1cdbd2cSJim Jagielski 	inline bool SetHost(ByteString const & rTheHost,
608*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
609*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
610*b1cdbd2cSJim Jagielski 	{ return setHost(extend(rTheHost), true, eMechanism, eCharset); }
611*b1cdbd2cSJim Jagielski 
SetHost(rtl::OUString const & rTheHost,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)612*b1cdbd2cSJim Jagielski 	inline bool SetHost(rtl::OUString const & rTheHost,
613*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
614*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
615*b1cdbd2cSJim Jagielski 	{ return setHost(rTheHost, false, eMechanism, eCharset); }
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski 	bool SetPort(sal_uInt32 nThePort);
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski 	void makePortCanonic();
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski 	/** Encode the <hostport> part of a URL.
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 		@ATT  Obsolete, because at the moment the <hostport> part of a URL may
624*b1cdbd2cSJim Jagielski 		not contain any escape sequences anyway, and because this method does
625*b1cdbd2cSJim Jagielski 		not inform the caller whether the given <hostport> part is legal.
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski 		@param rTheHostPort  The <hostport> part of a URL (for its
628*b1cdbd2cSJim Jagielski 		interpretation, see the general discussion for set-methods).
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 		@return  The <hostport> part, encoded according to the given mechanism
635*b1cdbd2cSJim Jagielski 		and charset ('forbidden' characters replaced by escape sequences).
636*b1cdbd2cSJim Jagielski 	 */
637*b1cdbd2cSJim Jagielski 	static inline rtl::OUString encodeHostPort(ByteString const & rTheHostPort,
638*b1cdbd2cSJim Jagielski 										   EncodeMechanism eMechanism,
639*b1cdbd2cSJim Jagielski 										   rtl_TextEncoding eCharset
640*b1cdbd2cSJim Jagielski 										       = RTL_TEXTENCODING_UTF8);
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 	/** Encode the <hostport> part of a URL.
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski 		@ATT  Obsolete, because at the moment the <hostport> part of a URL may
645*b1cdbd2cSJim Jagielski 		not contain any escape sequences anyway, and because this method does
646*b1cdbd2cSJim Jagielski 		not inform the caller whether the given <hostport> part is legal.
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski 		@param rTheHostPort  The <hostport> part of a URL (for its
649*b1cdbd2cSJim Jagielski 		interpretation, see the general discussion for set-methods).
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski 		@return  The <hostport> part, encoded according to the given mechanism
656*b1cdbd2cSJim Jagielski 		and charset ('forbidden' characters replaced by escape sequences).
657*b1cdbd2cSJim Jagielski 	 */
encodeHostPort(rtl::OUString const & rTheHostPort,EncodeMechanism eMechanism,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)658*b1cdbd2cSJim Jagielski 	static inline rtl::OUString encodeHostPort(rtl::OUString const & rTheHostPort,
659*b1cdbd2cSJim Jagielski 										   EncodeMechanism eMechanism,
660*b1cdbd2cSJim Jagielski 										   rtl_TextEncoding eCharset
661*b1cdbd2cSJim Jagielski 										       = RTL_TEXTENCODING_UTF8)
662*b1cdbd2cSJim Jagielski 	{ return encodeHostPort(rTheHostPort, false, eMechanism, eCharset); }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski 	//========================================================================
665*b1cdbd2cSJim Jagielski 	// Path:
666*b1cdbd2cSJim Jagielski 
HasURLPath() const667*b1cdbd2cSJim Jagielski 	inline bool HasURLPath() const { return !m_aPath.isEmpty(); }
668*b1cdbd2cSJim Jagielski 
GetURLPath(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const669*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetURLPath(DecodeMechanism eMechanism = DECODE_TO_IURI,
670*b1cdbd2cSJim Jagielski 								rtl_TextEncoding eCharset
671*b1cdbd2cSJim Jagielski 								    = RTL_TEXTENCODING_UTF8) const
672*b1cdbd2cSJim Jagielski 	{ return decode(m_aPath, getEscapePrefix(), eMechanism, eCharset); }
673*b1cdbd2cSJim Jagielski 
SetURLPath(ByteString const & rThePath,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)674*b1cdbd2cSJim Jagielski 	inline bool SetURLPath(ByteString const & rThePath,
675*b1cdbd2cSJim Jagielski 						   EncodeMechanism eMechanism = WAS_ENCODED,
676*b1cdbd2cSJim Jagielski 						   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
677*b1cdbd2cSJim Jagielski 	{ return setPath(extend(rThePath), true, eMechanism, eCharset); }
678*b1cdbd2cSJim Jagielski 
SetURLPath(rtl::OUString const & rThePath,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)679*b1cdbd2cSJim Jagielski 	inline bool SetURLPath(rtl::OUString const & rThePath,
680*b1cdbd2cSJim Jagielski 						   EncodeMechanism eMechanism = WAS_ENCODED,
681*b1cdbd2cSJim Jagielski 						   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
682*b1cdbd2cSJim Jagielski 	{ return setPath(rThePath, false, eMechanism, eCharset); }
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	//========================================================================
685*b1cdbd2cSJim Jagielski 	// Hierarchical Path:
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski 	/** A constant to address the last segment in various methods dealing with
688*b1cdbd2cSJim Jagielski 		hierarchical paths.
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski 		@descr  It is often more efficient to address the last segment using
691*b1cdbd2cSJim Jagielski 		this constant, than to determine its ordinal value using
692*b1cdbd2cSJim Jagielski 		getSegmentCount().
693*b1cdbd2cSJim Jagielski 	 */
694*b1cdbd2cSJim Jagielski 	enum { LAST_SEGMENT = -1 };
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski 	/** The number of segments in the hierarchical path.
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski 		@descr  Using RFC 2396 and RFC 2234, a hierarchical path is of the
699*b1cdbd2cSJim Jagielski 		form
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski 		  hierarchical-path = 1*("/" segment)
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski 		  segment = name *(";" param)
704*b1cdbd2cSJim Jagielski 
705*b1cdbd2cSJim Jagielski 		  name = [base ["." extension]]
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski 		  base = 1*pchar
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski 		  extension = *<any pchar except ".">
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 		  param = *pchar
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
714*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski 		@return  The number of segments in the hierarchical path.  If the path
717*b1cdbd2cSJim Jagielski 		is not hierarchical, 0 is returned.
718*b1cdbd2cSJim Jagielski 	 */
719*b1cdbd2cSJim Jagielski 	sal_Int32 getSegmentCount(bool bIgnoreFinalSlash = true) const;
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 	/** Remove a segment from the hierarchical path.
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
724*b1cdbd2cSJim Jagielski 		if addressing the last segment.
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
727*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski 		@return  True if the segment has successfully been removed (and the
730*b1cdbd2cSJim Jagielski 		resulting URI is still valid).  If the path is not hierarchical, or
731*b1cdbd2cSJim Jagielski 		the specified segment does not exist, false is returned.  If false is
732*b1cdbd2cSJim Jagielski 		returned, the object is not modified.
733*b1cdbd2cSJim Jagielski 	 */
734*b1cdbd2cSJim Jagielski 	bool removeSegment(sal_Int32 nIndex = LAST_SEGMENT,
735*b1cdbd2cSJim Jagielski 					   bool bIgnoreFinalSlash = true);
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski 	/** Insert a new segment into the hierarchical path.
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski 		@param rTheName  The name part of the new segment.  The new segment
740*b1cdbd2cSJim Jagielski 		will contain no parameters.
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski 		@param bAppendFinalSlash  If the new segment is appended at the end of
743*b1cdbd2cSJim Jagielski 		the hierarchical path, this parameter specifies whether to add a final
744*b1cdbd2cSJim Jagielski 		slash after it or not.
745*b1cdbd2cSJim Jagielski 
746*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment before which
747*b1cdbd2cSJim Jagielski 		to insert the new segment.  LAST_SEGMENT or an nIndex that equals
748*b1cdbd2cSJim Jagielski 		getSegmentCount() inserts the new segment at the end of the
749*b1cdbd2cSJim Jagielski 		hierarchical path.
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
752*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
755*b1cdbd2cSJim Jagielski 
756*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 		@return  True if the segment has successfully been inserted (and the
759*b1cdbd2cSJim Jagielski 		resulting URI is still valid).  If the path is not hierarchical, or
760*b1cdbd2cSJim Jagielski 		the specified place to insert the new segment does not exist, false is
761*b1cdbd2cSJim Jagielski 		returned.  If false is returned, the object is not modified.
762*b1cdbd2cSJim Jagielski 	 */
763*b1cdbd2cSJim Jagielski 	inline bool insertName(rtl::OUString const & rTheName,
764*b1cdbd2cSJim Jagielski 						   bool bAppendFinalSlash = false,
765*b1cdbd2cSJim Jagielski 						   sal_Int32 nIndex = LAST_SEGMENT,
766*b1cdbd2cSJim Jagielski 						   bool bIgnoreFinalSlash = true,
767*b1cdbd2cSJim Jagielski 						   EncodeMechanism eMechanism = WAS_ENCODED,
768*b1cdbd2cSJim Jagielski 						   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski 	/** Get the name of a segment of the hierarchical path.
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
773*b1cdbd2cSJim Jagielski 		if addressing the last segment.
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
776*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for get-methods.
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for get-methods.
781*b1cdbd2cSJim Jagielski 
782*b1cdbd2cSJim Jagielski 		@return  The name part of the specified segment.  If the path is not
783*b1cdbd2cSJim Jagielski 		hierarchical, or the specified segment does not exits, an empty string
784*b1cdbd2cSJim Jagielski 		is returned.
785*b1cdbd2cSJim Jagielski 	 */
786*b1cdbd2cSJim Jagielski 	rtl::OUString getName(sal_Int32 nIndex = LAST_SEGMENT,
787*b1cdbd2cSJim Jagielski 					  bool bIgnoreFinalSlash = true,
788*b1cdbd2cSJim Jagielski 					  DecodeMechanism eMechanism = DECODE_TO_IURI,
789*b1cdbd2cSJim Jagielski 					  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
790*b1cdbd2cSJim Jagielski 		const;
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski 	/** Set the name of a segment (preserving any parameters and any query or
793*b1cdbd2cSJim Jagielski 		fragment part).
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski 		@param rTheName  The new name.
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
798*b1cdbd2cSJim Jagielski 		if addressing the last segment.
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
801*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski 		@return  True if the name has successfully been modified (and the
808*b1cdbd2cSJim Jagielski 		resulting URI is still valid).  If the path is not hierarchical, or
809*b1cdbd2cSJim Jagielski 		the specified segment does not exist, false is returned.  If false is
810*b1cdbd2cSJim Jagielski 		returned, the object is not modified.
811*b1cdbd2cSJim Jagielski 	 */
812*b1cdbd2cSJim Jagielski 	bool setName(rtl::OUString const & rTheName,
813*b1cdbd2cSJim Jagielski 				 sal_Int32 nIndex = LAST_SEGMENT,
814*b1cdbd2cSJim Jagielski 				 bool bIgnoreFinalSlash = true,
815*b1cdbd2cSJim Jagielski 				 EncodeMechanism eMechanism = WAS_ENCODED,
816*b1cdbd2cSJim Jagielski 				 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 	/** Get the base of the name of a segment.
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
821*b1cdbd2cSJim Jagielski 		if addressing the last segment.
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
824*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for get-methods.
827*b1cdbd2cSJim Jagielski 
828*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for get-methods.
829*b1cdbd2cSJim Jagielski 
830*b1cdbd2cSJim Jagielski 		@return  The base part of the specified segment.  If the path is
831*b1cdbd2cSJim Jagielski 		not hierarchical, or the specified segment does not exits, an empty
832*b1cdbd2cSJim Jagielski 		string is returned.
833*b1cdbd2cSJim Jagielski 	 */
834*b1cdbd2cSJim Jagielski 	rtl::OUString getBase(sal_Int32 nIndex = LAST_SEGMENT,
835*b1cdbd2cSJim Jagielski 					  bool bIgnoreFinalSlash = true,
836*b1cdbd2cSJim Jagielski 					  DecodeMechanism eMechanism = DECODE_TO_IURI,
837*b1cdbd2cSJim Jagielski 					  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
838*b1cdbd2cSJim Jagielski 		const;
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 	/** Set the base of the name of a segment (preserving the extension).
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski 		@param rTheBase  The new base.
843*b1cdbd2cSJim Jagielski 
844*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
845*b1cdbd2cSJim Jagielski 		if addressing the last segment.
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
848*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
851*b1cdbd2cSJim Jagielski 
852*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski 		@return  True if the base has successfully been modified (and the
855*b1cdbd2cSJim Jagielski 		resulting URI is still valid).  If the path is not hierarchical, or
856*b1cdbd2cSJim Jagielski 		the specified segment does not exist, false is returned.  If false is
857*b1cdbd2cSJim Jagielski 		returned, the object is not modified.
858*b1cdbd2cSJim Jagielski 	 */
859*b1cdbd2cSJim Jagielski 	bool setBase(rtl::OUString const & rTheBase,
860*b1cdbd2cSJim Jagielski 				 sal_Int32 nIndex = LAST_SEGMENT,
861*b1cdbd2cSJim Jagielski 				 bool bIgnoreFinalSlash = true,
862*b1cdbd2cSJim Jagielski 				 EncodeMechanism eMechanism = WAS_ENCODED,
863*b1cdbd2cSJim Jagielski 				 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski 	/** Determine whether the name of a segment has an extension.
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
868*b1cdbd2cSJim Jagielski 		if addressing the last segment.
869*b1cdbd2cSJim Jagielski 
870*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
871*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski 		@return  True if the name of the specified segment has an extension.
874*b1cdbd2cSJim Jagielski 		If the path is not hierarchical, or the specified segment does not
875*b1cdbd2cSJim Jagielski 		exist, false is returned.
876*b1cdbd2cSJim Jagielski 	 */
877*b1cdbd2cSJim Jagielski 	bool hasExtension(sal_Int32 nIndex = LAST_SEGMENT,
878*b1cdbd2cSJim Jagielski 					  bool bIgnoreFinalSlash = true) const;
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski 	/** Get the extension of the name of a segment.
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
883*b1cdbd2cSJim Jagielski 		if addressing the last segment.
884*b1cdbd2cSJim Jagielski 
885*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
886*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
887*b1cdbd2cSJim Jagielski 
888*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for get-methods.
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for get-methods.
891*b1cdbd2cSJim Jagielski 
892*b1cdbd2cSJim Jagielski 		@return  The extension part of the specified segment.  If the path is
893*b1cdbd2cSJim Jagielski 		not hierarchical, or the specified segment does not exits, an empty
894*b1cdbd2cSJim Jagielski 		string is returned.
895*b1cdbd2cSJim Jagielski 	 */
896*b1cdbd2cSJim Jagielski 	rtl::OUString getExtension(sal_Int32 nIndex = LAST_SEGMENT,
897*b1cdbd2cSJim Jagielski 						   bool bIgnoreFinalSlash = true,
898*b1cdbd2cSJim Jagielski 						   DecodeMechanism eMechanism = DECODE_TO_IURI,
899*b1cdbd2cSJim Jagielski 						   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
900*b1cdbd2cSJim Jagielski 		const;
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski 	/** Set the extension of the name of a segment (replacing an already
903*b1cdbd2cSJim Jagielski 		existing extension).
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski 		@param rTheExtension  The new extension.
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
908*b1cdbd2cSJim Jagielski 		if addressing the last segment.
909*b1cdbd2cSJim Jagielski 
910*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
911*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
912*b1cdbd2cSJim Jagielski 
913*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski 		@return  True if the extension has successfully been modified (and the
918*b1cdbd2cSJim Jagielski 		resulting URI is still valid).  If the path is not hierarchical, or
919*b1cdbd2cSJim Jagielski 		the specified segment does not exist, false is returned.  If false is
920*b1cdbd2cSJim Jagielski 		returned, the object is not modified.
921*b1cdbd2cSJim Jagielski 	 */
922*b1cdbd2cSJim Jagielski 	bool setExtension(rtl::OUString const & rTheExtension,
923*b1cdbd2cSJim Jagielski 					  sal_Int32 nIndex = LAST_SEGMENT,
924*b1cdbd2cSJim Jagielski 					  bool bIgnoreFinalSlash = true,
925*b1cdbd2cSJim Jagielski 					  EncodeMechanism eMechanism = WAS_ENCODED,
926*b1cdbd2cSJim Jagielski 					  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski 	/** Remove the extension of the name of a segment.
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski 		@param nIndex  The non-negative index of the segment, or LAST_SEGMENT
931*b1cdbd2cSJim Jagielski 		if addressing the last segment.
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski 		@param bIgnoreFinalSlash  If true, a final slash at the end of the
934*b1cdbd2cSJim Jagielski 		hierarchical path does not denote an empty segment, but is ignored.
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski 		@return  True if the extension has successfully been removed (and the
937*b1cdbd2cSJim Jagielski 		resulting URI is still valid), or if the name did not have an
938*b1cdbd2cSJim Jagielski 		extension.  If the path is not hierarchical, or the specified segment
939*b1cdbd2cSJim Jagielski 		does not exist, false is returned.  If false is returned, the object
940*b1cdbd2cSJim Jagielski 		is not modified.
941*b1cdbd2cSJim Jagielski 	 */
942*b1cdbd2cSJim Jagielski 	bool removeExtension(sal_Int32 nIndex = LAST_SEGMENT,
943*b1cdbd2cSJim Jagielski 						 bool bIgnoreFinalSlash = true);
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski 	/** Determine whether the hierarchical path ends in a final slash.
946*b1cdbd2cSJim Jagielski 
947*b1cdbd2cSJim Jagielski 		@return  True if the hierarchical path ends in a final slash.  If the
948*b1cdbd2cSJim Jagielski 		path is not hierarchical, false is returned.
949*b1cdbd2cSJim Jagielski 	 */
950*b1cdbd2cSJim Jagielski 	bool hasFinalSlash() const;
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski 	/** Make the hierarchical path end in a final slash (if it does not
953*b1cdbd2cSJim Jagielski 		already do so).
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski 		@return  True if a final slash has successfully been appended (and the
956*b1cdbd2cSJim Jagielski 		resulting URI is still valid), or if the hierarchical path already
957*b1cdbd2cSJim Jagielski 		ended in a final slash.  If the path is not hierarchical, false is
958*b1cdbd2cSJim Jagielski 		returned.  If false is returned, the object is not modified.
959*b1cdbd2cSJim Jagielski 	 */
960*b1cdbd2cSJim Jagielski 	bool setFinalSlash();
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski 	/** Remove a final slash from the hierarchical path.
963*b1cdbd2cSJim Jagielski 
964*b1cdbd2cSJim Jagielski 		@return  True if a final slash has successfully been removed (and the
965*b1cdbd2cSJim Jagielski 		resulting URI is still valid), or if the hierarchical path already did
966*b1cdbd2cSJim Jagielski 		not end in a final slash.  If the path is not hierarchical, false is
967*b1cdbd2cSJim Jagielski 		returned.  If false is returned, the object is not modified.
968*b1cdbd2cSJim Jagielski 	 */
969*b1cdbd2cSJim Jagielski 	bool removeFinalSlash();
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski 	//========================================================================
972*b1cdbd2cSJim Jagielski 	// Query:
973*b1cdbd2cSJim Jagielski 
HasParam() const974*b1cdbd2cSJim Jagielski 	inline bool HasParam() const { return m_aQuery.isPresent(); }
975*b1cdbd2cSJim Jagielski 
GetParam(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const976*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetParam(DecodeMechanism eMechanism = DECODE_TO_IURI,
977*b1cdbd2cSJim Jagielski 							  rtl_TextEncoding eCharset
978*b1cdbd2cSJim Jagielski 							      = RTL_TEXTENCODING_UTF8) const
979*b1cdbd2cSJim Jagielski 	{ return decode(m_aQuery, getEscapePrefix(), eMechanism, eCharset); }
980*b1cdbd2cSJim Jagielski 
981*b1cdbd2cSJim Jagielski 	inline bool SetParam(ByteString const & rTheQuery,
982*b1cdbd2cSJim Jagielski 						 EncodeMechanism eMechanism = WAS_ENCODED,
983*b1cdbd2cSJim Jagielski 						 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
984*b1cdbd2cSJim Jagielski 
985*b1cdbd2cSJim Jagielski 	inline bool SetParam(rtl::OUString const & rTheQuery,
986*b1cdbd2cSJim Jagielski 						 EncodeMechanism eMechanism = WAS_ENCODED,
987*b1cdbd2cSJim Jagielski 						 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski 	//========================================================================
990*b1cdbd2cSJim Jagielski 	// Fragment:
991*b1cdbd2cSJim Jagielski 
HasMark() const992*b1cdbd2cSJim Jagielski 	inline bool HasMark() const { return m_aFragment.isPresent(); }
993*b1cdbd2cSJim Jagielski 
GetMark(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const994*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetMark(DecodeMechanism eMechanism = DECODE_TO_IURI,
995*b1cdbd2cSJim Jagielski 							 rtl_TextEncoding eCharset
996*b1cdbd2cSJim Jagielski 							     = RTL_TEXTENCODING_UTF8) const
997*b1cdbd2cSJim Jagielski 	{ return decode(m_aFragment, getEscapePrefix(), eMechanism, eCharset); }
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski 	inline bool SetMark(ByteString const & rTheFragment,
1000*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
1001*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
1002*b1cdbd2cSJim Jagielski 
1003*b1cdbd2cSJim Jagielski 	inline bool SetMark(rtl::OUString const & rTheFragment,
1004*b1cdbd2cSJim Jagielski 						EncodeMechanism eMechanism = WAS_ENCODED,
1005*b1cdbd2cSJim Jagielski 						rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski 	static rtl::OUString createFragment(rtl::OUString const & rText);
1008*b1cdbd2cSJim Jagielski 
1009*b1cdbd2cSJim Jagielski 	//========================================================================
1010*b1cdbd2cSJim Jagielski 	// File URLs:
1011*b1cdbd2cSJim Jagielski 
1012*b1cdbd2cSJim Jagielski 	/** Create an INetURLObject from a file system path.
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski 		@param rFSysPath  A file system path.  An URL is not allowed here!
1015*b1cdbd2cSJim Jagielski 
1016*b1cdbd2cSJim Jagielski 		@param eStyle  The notation of rFSysPath.
1017*b1cdbd2cSJim Jagielski 	 */
1018*b1cdbd2cSJim Jagielski 	inline INetURLObject(rtl::OUString const & rFSysPath, FSysStyle eStyle);
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski 	/** Set this INetURLObject to a file URL constructed from a file system
1021*b1cdbd2cSJim Jagielski 		path.
1022*b1cdbd2cSJim Jagielski 
1023*b1cdbd2cSJim Jagielski 		@param rFSysPath  A file system path.  An URL is not allowed here!
1024*b1cdbd2cSJim Jagielski 
1025*b1cdbd2cSJim Jagielski 		@param eStyle  The notation of rFSysPath.
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski 		@return  True if this INetURLObject has successfully been changed.  If
1028*b1cdbd2cSJim Jagielski 		false is returned, this INetURLObject has not been modified.
1029*b1cdbd2cSJim Jagielski 	 */
1030*b1cdbd2cSJim Jagielski 	bool setFSysPath(rtl::OUString const & rFSysPath, FSysStyle eStyle);
1031*b1cdbd2cSJim Jagielski 
1032*b1cdbd2cSJim Jagielski 	/** Return the file system path represented by a file URL (ignoring any
1033*b1cdbd2cSJim Jagielski 		fragment part).
1034*b1cdbd2cSJim Jagielski 
1035*b1cdbd2cSJim Jagielski 		@param eStyle  The notation of the returned file system path.
1036*b1cdbd2cSJim Jagielski 
1037*b1cdbd2cSJim Jagielski 		@param pDelimiter  Upon successful return, this parameter can return
1038*b1cdbd2cSJim Jagielski 		the character that is the 'main' delimiter within the returned file
1039*b1cdbd2cSJim Jagielski 		system path (e.g., "/" for Unix, "\" for DOS, ":" for Mac).  This is
1040*b1cdbd2cSJim Jagielski 		especially useful for routines that later try to shorten the returned
1041*b1cdbd2cSJim Jagielski 		file system path at a 'good' position, e.g. to fit it into some
1042*b1cdbd2cSJim Jagielski 		limited display space.
1043*b1cdbd2cSJim Jagielski 
1044*b1cdbd2cSJim Jagielski 		@return  The file system path represented by this file URL.  If this
1045*b1cdbd2cSJim Jagielski 		file URL does not represent a file system path according to the
1046*b1cdbd2cSJim Jagielski 		specified notation, or if this is not a file URL at all, an empty
1047*b1cdbd2cSJim Jagielski 		string is returned.
1048*b1cdbd2cSJim Jagielski 	 */
1049*b1cdbd2cSJim Jagielski 	rtl::OUString getFSysPath(FSysStyle eStyle, sal_Unicode * pDelimiter = 0)
1050*b1cdbd2cSJim Jagielski 		const;
1051*b1cdbd2cSJim Jagielski 
1052*b1cdbd2cSJim Jagielski 	//========================================================================
1053*b1cdbd2cSJim Jagielski 	// POP3 and URLs:
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski 	bool HasMsgId() const;
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski 	rtl::OUString GetMsgId(DecodeMechanism eMechanism = DECODE_TO_IURI,
1058*b1cdbd2cSJim Jagielski 					   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
1059*b1cdbd2cSJim Jagielski 		const;
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski 	//========================================================================
1062*b1cdbd2cSJim Jagielski 	// Coding:
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski 	enum Part
1065*b1cdbd2cSJim Jagielski 	{
1066*b1cdbd2cSJim Jagielski 		PART_OBSOLETE_NORMAL = 0x001, // Obsolete, do not use!
1067*b1cdbd2cSJim Jagielski 		PART_OBSOLETE_FILE = 0x002, // Obsolete, do not use!
1068*b1cdbd2cSJim Jagielski 		PART_OBSOLETE_PARAM = 0x004, // Obsolete, do not use!
1069*b1cdbd2cSJim Jagielski 		PART_USER_PASSWORD = 0x008,
1070*b1cdbd2cSJim Jagielski 		PART_IMAP_ACHAR = 0x010,
1071*b1cdbd2cSJim Jagielski 		PART_VIM = 0x020,
1072*b1cdbd2cSJim Jagielski 		PART_HOST_EXTRA = 0x040,
1073*b1cdbd2cSJim Jagielski 		PART_FPATH = 0x080,
1074*b1cdbd2cSJim Jagielski 		PART_AUTHORITY = 0x100,
1075*b1cdbd2cSJim Jagielski 		PART_PATH_SEGMENTS_EXTRA = 0x200,
1076*b1cdbd2cSJim Jagielski 		PART_REL_SEGMENT_EXTRA = 0x400,
1077*b1cdbd2cSJim Jagielski 		PART_URIC = 0x800,
1078*b1cdbd2cSJim Jagielski 		PART_HTTP_PATH = 0x1000,
1079*b1cdbd2cSJim Jagielski 		PART_FILE_SEGMENT_EXTRA = 0x2000, // Obsolete, do not use!
1080*b1cdbd2cSJim Jagielski 		PART_MESSAGE_ID = 0x4000,
1081*b1cdbd2cSJim Jagielski 		PART_MESSAGE_ID_PATH = 0x8000,
1082*b1cdbd2cSJim Jagielski 		PART_MAILTO = 0x10000,
1083*b1cdbd2cSJim Jagielski 		PART_PATH_BEFORE_QUERY = 0x20000,
1084*b1cdbd2cSJim Jagielski 		PART_PCHAR = 0x40000,
1085*b1cdbd2cSJim Jagielski 		PART_FRAGMENT = 0x80000, // Obsolete, do not use!
1086*b1cdbd2cSJim Jagielski 		PART_VISIBLE = 0x100000,
1087*b1cdbd2cSJim Jagielski 		PART_VISIBLE_NONSPECIAL = 0x200000,
1088*b1cdbd2cSJim Jagielski 		PART_CREATEFRAGMENT = 0x400000,
1089*b1cdbd2cSJim Jagielski 		PART_UNO_PARAM_VALUE = 0x800000,
1090*b1cdbd2cSJim Jagielski 		PART_UNAMBIGUOUS = 0x1000000,
1091*b1cdbd2cSJim Jagielski 		PART_URIC_NO_SLASH = 0x2000000,
1092*b1cdbd2cSJim Jagielski         PART_HTTP_QUERY = 0x4000000, //TODO! unused?
1093*b1cdbd2cSJim Jagielski         PART_NEWS_ARTICLE_LOCALPART = 0x8000000,
1094*b1cdbd2cSJim Jagielski 		max_part = 0x80000000
1095*b1cdbd2cSJim Jagielski 			// Do not use!  Only there to allow compatible changes in the
1096*b1cdbd2cSJim Jagielski 			// future.
1097*b1cdbd2cSJim Jagielski 	};
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski 	enum EscapeType
1100*b1cdbd2cSJim Jagielski 	{
1101*b1cdbd2cSJim Jagielski 		ESCAPE_NO,
1102*b1cdbd2cSJim Jagielski 		ESCAPE_OCTET,
1103*b1cdbd2cSJim Jagielski 		ESCAPE_UTF32
1104*b1cdbd2cSJim Jagielski 	};
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski 	/** Encode some text as part of a URI.
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski 		@param rText  Some text (for its interpretation, see the general
1109*b1cdbd2cSJim Jagielski 		discussion for set-methods).
1110*b1cdbd2cSJim Jagielski 
1111*b1cdbd2cSJim Jagielski 		@param ePart  The part says which characters are 'forbidden' and must
1112*b1cdbd2cSJim Jagielski 		be encoded (replaced by escape sequences).  Characters outside the US-
1113*b1cdbd2cSJim Jagielski 		ASCII range are always 'forbidden.'
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski 		@param cEscapePrefix  The first character in an escape sequence
1116*b1cdbd2cSJim Jagielski 		(normally '%').
1117*b1cdbd2cSJim Jagielski 
1118*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
1119*b1cdbd2cSJim Jagielski 
1120*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
1121*b1cdbd2cSJim Jagielski 
1122*b1cdbd2cSJim Jagielski 		@return  The encoded representation of the text ('forbidden'
1123*b1cdbd2cSJim Jagielski 		characters replaced by escape sequences).
1124*b1cdbd2cSJim Jagielski 	 */
1125*b1cdbd2cSJim Jagielski 	static inline rtl::OUString encode(ByteString const & rText, Part ePart,
1126*b1cdbd2cSJim Jagielski 								   sal_Char cEscapePrefix,
1127*b1cdbd2cSJim Jagielski 								   EncodeMechanism eMechanism,
1128*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset
1129*b1cdbd2cSJim Jagielski 								       = RTL_TEXTENCODING_UTF8);
1130*b1cdbd2cSJim Jagielski 
1131*b1cdbd2cSJim Jagielski 	/** Encode some text as part of a URI.
1132*b1cdbd2cSJim Jagielski 
1133*b1cdbd2cSJim Jagielski 		@param rText  Some text (for its interpretation, see the general
1134*b1cdbd2cSJim Jagielski 		discussion for set-methods).
1135*b1cdbd2cSJim Jagielski 
1136*b1cdbd2cSJim Jagielski 		@param ePart  The part says which characters are 'forbidden' and must
1137*b1cdbd2cSJim Jagielski 		be encoded (replaced by escape sequences).  Characters outside the US-
1138*b1cdbd2cSJim Jagielski 		ASCII range are always 'forbidden.'
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski 		@param cEscapePrefix  The first character in an escape sequence
1141*b1cdbd2cSJim Jagielski 		(normally '%').
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for set-methods.
1144*b1cdbd2cSJim Jagielski 
1145*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for set-methods.
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski 		@return  The text, encoded according to the given mechanism and
1148*b1cdbd2cSJim Jagielski 		charset ('forbidden' characters replaced by escape sequences).
1149*b1cdbd2cSJim Jagielski 	 */
1150*b1cdbd2cSJim Jagielski 	static inline rtl::OUString encode(rtl::OUString const & rText, Part ePart,
1151*b1cdbd2cSJim Jagielski 								   sal_Char cEscapePrefix,
1152*b1cdbd2cSJim Jagielski 								   EncodeMechanism eMechanism,
1153*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset
1154*b1cdbd2cSJim Jagielski 								       = RTL_TEXTENCODING_UTF8);
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski 	/** Decode some text.
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 		@param rText  Some (encoded) text.
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski 		@param cEscapePrefix  The first character in an escape sequence
1161*b1cdbd2cSJim Jagielski 		(normally '%').
1162*b1cdbd2cSJim Jagielski 
1163*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for get-methods.
1164*b1cdbd2cSJim Jagielski 
1165*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for get-methods.
1166*b1cdbd2cSJim Jagielski 
1167*b1cdbd2cSJim Jagielski 		@return  The text, decoded according to the given mechanism and
1168*b1cdbd2cSJim Jagielski 		charset (escape sequences replaced by 'raw' characters).
1169*b1cdbd2cSJim Jagielski 	 */
1170*b1cdbd2cSJim Jagielski 	static inline rtl::OUString decode(rtl::OUString const & rText,
1171*b1cdbd2cSJim Jagielski 								   sal_Char cEscapePrefix,
1172*b1cdbd2cSJim Jagielski 								   DecodeMechanism eMechanism,
1173*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset
1174*b1cdbd2cSJim Jagielski 								       = RTL_TEXTENCODING_UTF8);
1175*b1cdbd2cSJim Jagielski 
1176*b1cdbd2cSJim Jagielski 	static inline rtl::OUString decode(rtl::OUStringBuffer const & rText,
1177*b1cdbd2cSJim Jagielski 								   sal_Char cEscapePrefix,
1178*b1cdbd2cSJim Jagielski 								   DecodeMechanism eMechanism,
1179*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset
1180*b1cdbd2cSJim Jagielski 								       = RTL_TEXTENCODING_UTF8);
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski 	static void appendUCS4Escape(rtl::OUStringBuffer & rTheText,
1183*b1cdbd2cSJim Jagielski 								 sal_Char cEscapePrefix,
1184*b1cdbd2cSJim Jagielski 								 sal_uInt32 nUCS4);
1185*b1cdbd2cSJim Jagielski 
1186*b1cdbd2cSJim Jagielski 	static void appendUCS4(rtl::OUStringBuffer & rTheText, sal_uInt32 nUCS4,
1187*b1cdbd2cSJim Jagielski 						   EscapeType eEscapeType, bool bOctets, Part ePart,
1188*b1cdbd2cSJim Jagielski 						   sal_Char cEscapePrefix, rtl_TextEncoding eCharset,
1189*b1cdbd2cSJim Jagielski 						   bool bKeepVisibleEscapes);
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski 	static sal_uInt32 getUTF32(sal_Unicode const *& rBegin,
1192*b1cdbd2cSJim Jagielski 							   sal_Unicode const * pEnd, bool bOctets,
1193*b1cdbd2cSJim Jagielski 							   sal_Char cEscapePrefix,
1194*b1cdbd2cSJim Jagielski 							   EncodeMechanism eMechanism,
1195*b1cdbd2cSJim Jagielski 							   rtl_TextEncoding eCharset,
1196*b1cdbd2cSJim Jagielski 							   EscapeType & rEscapeType);
1197*b1cdbd2cSJim Jagielski 
1198*b1cdbd2cSJim Jagielski 	//========================================================================
1199*b1cdbd2cSJim Jagielski 	// Specialized helpers:
1200*b1cdbd2cSJim Jagielski 
1201*b1cdbd2cSJim Jagielski 	static sal_uInt32 scanDomain(sal_Unicode const *& rBegin,
1202*b1cdbd2cSJim Jagielski 								 sal_Unicode const * pEnd,
1203*b1cdbd2cSJim Jagielski 								 bool bEager = true);
1204*b1cdbd2cSJim Jagielski 
1205*b1cdbd2cSJim Jagielski 	//========================================================================
1206*b1cdbd2cSJim Jagielski 	// OBSOLETE Hierarchical Path:
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski 	rtl::OUString GetPartBeforeLastName(DecodeMechanism eMechanism
1209*b1cdbd2cSJim Jagielski 									    = DECODE_TO_IURI,
1210*b1cdbd2cSJim Jagielski 									rtl_TextEncoding eCharset
1211*b1cdbd2cSJim Jagielski 									    = RTL_TEXTENCODING_UTF8) const;
1212*b1cdbd2cSJim Jagielski 
1213*b1cdbd2cSJim Jagielski 	/** Get the last segment in the path.
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for get-methods.
1216*b1cdbd2cSJim Jagielski 
1217*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for get-methods.
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski 		@return  For a hierarchical URL, the last segment (everything after
1220*b1cdbd2cSJim Jagielski 		the last unencoded '/').  Not that this last segment may be empty.  If
1221*b1cdbd2cSJim Jagielski 		the URL is not hierarchical, an empty string is returned.
1222*b1cdbd2cSJim Jagielski 	 */
1223*b1cdbd2cSJim Jagielski 	rtl::OUString GetLastName(DecodeMechanism eMechanism = DECODE_TO_IURI,
1224*b1cdbd2cSJim Jagielski 						  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
1225*b1cdbd2cSJim Jagielski 		const;
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski 	/** Get the 'extension' of the last segment in the path.
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski 		@param eMechanism  See the general discussion for get-methods.
1230*b1cdbd2cSJim Jagielski 
1231*b1cdbd2cSJim Jagielski 		@param eCharset  See the general discussion for get-methods.
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski 		@return  For a hierarchical URL, everything after the first unencoded
1234*b1cdbd2cSJim Jagielski 		'.' in the last segment of the path.  Note that this 'extension' may
1235*b1cdbd2cSJim Jagielski 		be empty.  If the URL is not hierarchical, or if the last segment does
1236*b1cdbd2cSJim Jagielski 		not contain an unencoded '.', an empty string is returned.
1237*b1cdbd2cSJim Jagielski 	 */
1238*b1cdbd2cSJim Jagielski 	rtl::OUString GetFileExtension(DecodeMechanism eMechanism = DECODE_TO_IURI,
1239*b1cdbd2cSJim Jagielski 							   rtl_TextEncoding eCharset
1240*b1cdbd2cSJim Jagielski 							       = RTL_TEXTENCODING_UTF8) const;
1241*b1cdbd2cSJim Jagielski 
Append(ByteString const & rTheSegment,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)1242*b1cdbd2cSJim Jagielski 	inline bool Append(ByteString const & rTheSegment,
1243*b1cdbd2cSJim Jagielski 					   EncodeMechanism eMechanism = WAS_ENCODED,
1244*b1cdbd2cSJim Jagielski 					   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
1245*b1cdbd2cSJim Jagielski 	{ return appendSegment(extend(rTheSegment), true, eMechanism, eCharset); }
1246*b1cdbd2cSJim Jagielski 
Append(rtl::OUString const & rTheSegment,EncodeMechanism eMechanism=WAS_ENCODED,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)1247*b1cdbd2cSJim Jagielski 	inline bool Append(rtl::OUString const & rTheSegment,
1248*b1cdbd2cSJim Jagielski 					   EncodeMechanism eMechanism = WAS_ENCODED,
1249*b1cdbd2cSJim Jagielski 					   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8)
1250*b1cdbd2cSJim Jagielski 	{ return appendSegment(rTheSegment, false, eMechanism, eCharset); }
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 	bool CutLastName();
1253*b1cdbd2cSJim Jagielski 
1254*b1cdbd2cSJim Jagielski 	//========================================================================
1255*b1cdbd2cSJim Jagielski 	// OBSOLETE File URLs:
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski 	rtl::OUString PathToFileName() const;
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski 	rtl::OUString GetFull() const;
1260*b1cdbd2cSJim Jagielski 
1261*b1cdbd2cSJim Jagielski 	rtl::OUString GetPath() const;
1262*b1cdbd2cSJim Jagielski 
1263*b1cdbd2cSJim Jagielski 	void SetBase(rtl::OUString const & rTheBase);
1264*b1cdbd2cSJim Jagielski 
1265*b1cdbd2cSJim Jagielski 	rtl::OUString GetBase() const;
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski 	void SetName(rtl::OUString const & rTheName,
1268*b1cdbd2cSJim Jagielski 				 EncodeMechanism eMechanism = WAS_ENCODED,
1269*b1cdbd2cSJim Jagielski 				 rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
1270*b1cdbd2cSJim Jagielski 
GetName(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const1271*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetName(DecodeMechanism eMechanism = DECODE_TO_IURI,
1272*b1cdbd2cSJim Jagielski 							 rtl_TextEncoding eCharset
1273*b1cdbd2cSJim Jagielski 							     = RTL_TEXTENCODING_UTF8) const
1274*b1cdbd2cSJim Jagielski 	{ return GetLastName(eMechanism, eCharset); }
1275*b1cdbd2cSJim Jagielski 
1276*b1cdbd2cSJim Jagielski 	rtl::OUString CutName(DecodeMechanism eMechanism = DECODE_TO_IURI,
1277*b1cdbd2cSJim Jagielski 					  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
1278*b1cdbd2cSJim Jagielski 
1279*b1cdbd2cSJim Jagielski 	void SetExtension(rtl::OUString const & rTheExtension,
1280*b1cdbd2cSJim Jagielski 					  EncodeMechanism eMechanism = WAS_ENCODED,
1281*b1cdbd2cSJim Jagielski 					  rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
1282*b1cdbd2cSJim Jagielski 
GetExtension(DecodeMechanism eMechanism=DECODE_TO_IURI,rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const1283*b1cdbd2cSJim Jagielski 	inline rtl::OUString GetExtension(
1284*b1cdbd2cSJim Jagielski 								  DecodeMechanism eMechanism = DECODE_TO_IURI,
1285*b1cdbd2cSJim Jagielski 								  rtl_TextEncoding eCharset
1286*b1cdbd2cSJim Jagielski 								      = RTL_TEXTENCODING_UTF8) const
1287*b1cdbd2cSJim Jagielski 	{ return GetFileExtension(eMechanism, eCharset); }
1288*b1cdbd2cSJim Jagielski 
1289*b1cdbd2cSJim Jagielski 	rtl::OUString CutExtension(DecodeMechanism eMechanism = DECODE_TO_IURI,
1290*b1cdbd2cSJim Jagielski 						   rtl_TextEncoding eCharset = RTL_TEXTENCODING_UTF8);
1291*b1cdbd2cSJim Jagielski 
1292*b1cdbd2cSJim Jagielski 	bool IsCaseSensitive() const;
1293*b1cdbd2cSJim Jagielski 
1294*b1cdbd2cSJim Jagielski 	//========================================================================
1295*b1cdbd2cSJim Jagielski 
1296*b1cdbd2cSJim Jagielski private:
1297*b1cdbd2cSJim Jagielski 	// General Structure:
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski 	class SubString
1300*b1cdbd2cSJim Jagielski 	{
1301*b1cdbd2cSJim Jagielski 		sal_Int32 m_nBegin;
1302*b1cdbd2cSJim Jagielski 		sal_Int32 m_nLength;
1303*b1cdbd2cSJim Jagielski 
1304*b1cdbd2cSJim Jagielski 	public:
SubString(sal_Int32 nTheBegin=-1,sal_Int32 nTheLength=0)1305*b1cdbd2cSJim Jagielski 		explicit inline SubString(sal_Int32 nTheBegin = -1,
1306*b1cdbd2cSJim Jagielski 								  sal_Int32 nTheLength = 0):
1307*b1cdbd2cSJim Jagielski 			m_nBegin(nTheBegin), m_nLength(nTheLength) {}
1308*b1cdbd2cSJim Jagielski 
isPresent() const1309*b1cdbd2cSJim Jagielski 		inline bool isPresent() const { return m_nBegin != -1; }
1310*b1cdbd2cSJim Jagielski 
isEmpty() const1311*b1cdbd2cSJim Jagielski 		inline bool isEmpty() const { return m_nLength == 0; }
1312*b1cdbd2cSJim Jagielski 
getBegin() const1313*b1cdbd2cSJim Jagielski 		inline sal_Int32 getBegin() const { return m_nBegin; }
1314*b1cdbd2cSJim Jagielski 
getLength() const1315*b1cdbd2cSJim Jagielski 		inline sal_Int32 getLength() const { return m_nLength; }
1316*b1cdbd2cSJim Jagielski 
getEnd() const1317*b1cdbd2cSJim Jagielski 		inline sal_Int32 getEnd() const { return m_nBegin + m_nLength; }
1318*b1cdbd2cSJim Jagielski 
1319*b1cdbd2cSJim Jagielski 		inline sal_Int32 clear();
1320*b1cdbd2cSJim Jagielski 
1321*b1cdbd2cSJim Jagielski 		inline sal_Int32 set(rtl::OUStringBuffer & rString,
1322*b1cdbd2cSJim Jagielski 						     rtl::OUString const & rSubString,
1323*b1cdbd2cSJim Jagielski 						     sal_Int32 nTheBegin);
1324*b1cdbd2cSJim Jagielski 
1325*b1cdbd2cSJim Jagielski 		inline sal_Int32 set(rtl::OUString & rString,
1326*b1cdbd2cSJim Jagielski 						     rtl::OUString const & rSubString);
1327*b1cdbd2cSJim Jagielski 
1328*b1cdbd2cSJim Jagielski 		inline sal_Int32 set(rtl::OUStringBuffer & rString,
1329*b1cdbd2cSJim Jagielski 						     rtl::OUString const & rSubString);
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski 		inline void operator +=(sal_Int32 nDelta);
1332*b1cdbd2cSJim Jagielski 
1333*b1cdbd2cSJim Jagielski 		int compare(SubString const & rOther,
1334*b1cdbd2cSJim Jagielski 			rtl::OUStringBuffer const & rThisString,
1335*b1cdbd2cSJim Jagielski 			rtl::OUStringBuffer const & rOtherString) const;
1336*b1cdbd2cSJim Jagielski 	};
1337*b1cdbd2cSJim Jagielski 
1338*b1cdbd2cSJim Jagielski 	rtl::OUStringBuffer m_aAbsURIRef;
1339*b1cdbd2cSJim Jagielski 	SubString m_aScheme;
1340*b1cdbd2cSJim Jagielski 	SubString m_aUser;
1341*b1cdbd2cSJim Jagielski 	SubString m_aAuth;
1342*b1cdbd2cSJim Jagielski 	SubString m_aHost;
1343*b1cdbd2cSJim Jagielski 	SubString m_aPort;
1344*b1cdbd2cSJim Jagielski 	SubString m_aPath;
1345*b1cdbd2cSJim Jagielski 	SubString m_aQuery;
1346*b1cdbd2cSJim Jagielski 	SubString m_aFragment;
1347*b1cdbd2cSJim Jagielski 	INetProtocol m_eScheme;
1348*b1cdbd2cSJim Jagielski 	INetProtocol m_eSmartScheme;
1349*b1cdbd2cSJim Jagielski 
1350*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE void setInvalid();
1351*b1cdbd2cSJim Jagielski 
1352*b1cdbd2cSJim Jagielski     bool setAbsURIRef(
1353*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheAbsURIRef, bool bOctets,
1354*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset, bool bSmart,
1355*b1cdbd2cSJim Jagielski         FSysStyle eStyle);
1356*b1cdbd2cSJim Jagielski 
1357*b1cdbd2cSJim Jagielski     // Relative URLs:
1358*b1cdbd2cSJim Jagielski 
1359*b1cdbd2cSJim Jagielski     bool convertRelToAbs(
1360*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheRelURIRef, bool bOctets,
1361*b1cdbd2cSJim Jagielski         INetURLObject & rTheAbsURIRef, bool & rWasAbsolute,
1362*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset,
1363*b1cdbd2cSJim Jagielski         bool bIgnoreFragment, bool bSmart, bool bRelativeNonURIs,
1364*b1cdbd2cSJim Jagielski         FSysStyle eStyle) const;
1365*b1cdbd2cSJim Jagielski 
1366*b1cdbd2cSJim Jagielski     bool convertAbsToRel(
1367*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheAbsURIRef, bool bOctets,
1368*b1cdbd2cSJim Jagielski         rtl::OUString & rTheRelURIRef, EncodeMechanism eEncodeMechanism,
1369*b1cdbd2cSJim Jagielski         DecodeMechanism eDecodeMechanism, rtl_TextEncoding eCharset,
1370*b1cdbd2cSJim Jagielski         FSysStyle eStyle) const;
1371*b1cdbd2cSJim Jagielski 
1372*b1cdbd2cSJim Jagielski     // External URLs:
1373*b1cdbd2cSJim Jagielski 
1374*b1cdbd2cSJim Jagielski     static bool convertIntToExt(
1375*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheIntURIRef, bool bOctets,
1376*b1cdbd2cSJim Jagielski         rtl::OUString & rTheExtURIRef, DecodeMechanism eDecodeMechanism,
1377*b1cdbd2cSJim Jagielski         rtl_TextEncoding eCharset);
1378*b1cdbd2cSJim Jagielski 
1379*b1cdbd2cSJim Jagielski     static bool convertExtToInt(
1380*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheExtURIRef, bool bOctets,
1381*b1cdbd2cSJim Jagielski         rtl::OUString & rTheIntURIRef, DecodeMechanism eDecodeMechanism,
1382*b1cdbd2cSJim Jagielski         rtl_TextEncoding eCharset);
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski     // Scheme:
1385*b1cdbd2cSJim Jagielski 
1386*b1cdbd2cSJim Jagielski     struct PrefixInfo;
1387*b1cdbd2cSJim Jagielski 
1388*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE static inline SchemeInfo const & getSchemeInfo(
1389*b1cdbd2cSJim Jagielski         INetProtocol eTheScheme);
1390*b1cdbd2cSJim Jagielski 
1391*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE inline SchemeInfo const & getSchemeInfo() const;
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE static PrefixInfo const * getPrefix(
1394*b1cdbd2cSJim Jagielski         sal_Unicode const *& rBegin, sal_Unicode const * pEnd);
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski     // Authority:
1397*b1cdbd2cSJim Jagielski 
1398*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE sal_Int32 getAuthorityBegin() const;
1399*b1cdbd2cSJim Jagielski 
1400*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE SubString getAuthority() const;
1401*b1cdbd2cSJim Jagielski 
1402*b1cdbd2cSJim Jagielski     // User Info:
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski     bool setUser(
1405*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheUser, bool bOctets,
1406*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1407*b1cdbd2cSJim Jagielski 
1408*b1cdbd2cSJim Jagielski     bool clearPassword();
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski     bool setPassword(
1411*b1cdbd2cSJim Jagielski         rtl::OUString const & rThePassword, bool bOctets,
1412*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1413*b1cdbd2cSJim Jagielski 
1414*b1cdbd2cSJim Jagielski     // Host and Port:
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE static bool parseHost(
1417*b1cdbd2cSJim Jagielski         sal_Unicode const *& rBegin, sal_Unicode const * pEnd,
1418*b1cdbd2cSJim Jagielski         rtl::OUString & rCanonic);
1419*b1cdbd2cSJim Jagielski 
1420*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE static bool parseHostOrNetBiosName(
1421*b1cdbd2cSJim Jagielski         sal_Unicode const * pBegin, sal_Unicode const * pEnd, bool bOctets,
1422*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset,
1423*b1cdbd2cSJim Jagielski         bool bNetBiosName, rtl::OUStringBuffer* pCanonic);
1424*b1cdbd2cSJim Jagielski 
1425*b1cdbd2cSJim Jagielski     static rtl::OUString encodeHostPort(
1426*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheHostPort, bool bOctets,
1427*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1428*b1cdbd2cSJim Jagielski 
1429*b1cdbd2cSJim Jagielski     bool setHost(
1430*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheHost, bool bOctets,
1431*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski     // Path:
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE static bool parsePath(
1436*b1cdbd2cSJim Jagielski         INetProtocol eScheme, sal_Unicode const ** pBegin,
1437*b1cdbd2cSJim Jagielski         sal_Unicode const * pEnd, bool bOctets, EncodeMechanism eMechanism,
1438*b1cdbd2cSJim Jagielski         rtl_TextEncoding eCharset, bool bSkippedInitialSlash,
1439*b1cdbd2cSJim Jagielski         sal_uInt32 nSegmentDelimiter, sal_uInt32 nAltSegmentDelimiter,
1440*b1cdbd2cSJim Jagielski         sal_uInt32 nQueryDelimiter, sal_uInt32 nFragmentDelimiter,
1441*b1cdbd2cSJim Jagielski         rtl::OUStringBuffer &rSynPath);
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski     bool setPath(
1444*b1cdbd2cSJim Jagielski         rtl::OUString const & rThePath, bool bOctets,
1445*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1446*b1cdbd2cSJim Jagielski 
1447*b1cdbd2cSJim Jagielski     // Hierarchical Path:
1448*b1cdbd2cSJim Jagielski 
1449*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE bool checkHierarchical() const;
1450*b1cdbd2cSJim Jagielski 
1451*b1cdbd2cSJim Jagielski     bool appendSegment(
1452*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheSegment, bool bOctets,
1453*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1454*b1cdbd2cSJim Jagielski 
1455*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE SubString getSegment(
1456*b1cdbd2cSJim Jagielski         sal_Int32 nIndex, bool bIgnoreFinalSlash) const;
1457*b1cdbd2cSJim Jagielski 
1458*b1cdbd2cSJim Jagielski     bool insertName(
1459*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheName, bool bOctets, bool bAppendFinalSlash,
1460*b1cdbd2cSJim Jagielski         sal_Int32 nIndex, bool bIgnoreFinalSlash, EncodeMechanism eMechanism,
1461*b1cdbd2cSJim Jagielski         rtl_TextEncoding eCharset);
1462*b1cdbd2cSJim Jagielski 
1463*b1cdbd2cSJim Jagielski     // Query:
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski     bool clearQuery();
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski     bool setQuery(
1468*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheQuery, bool bOctets,
1469*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1470*b1cdbd2cSJim Jagielski 
1471*b1cdbd2cSJim Jagielski     // Fragment:
1472*b1cdbd2cSJim Jagielski 
1473*b1cdbd2cSJim Jagielski     bool clearFragment();
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski     bool setFragment(
1476*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheMark, bool bOctets,
1477*b1cdbd2cSJim Jagielski         EncodeMechanism eMechanism, rtl_TextEncoding eCharset);
1478*b1cdbd2cSJim Jagielski 
1479*b1cdbd2cSJim Jagielski     // FTP URLs:
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski     enum FTPType { FTP_TYPE_NONE, FTP_TYPE_A, FTP_TYPE_I, FTP_TYPE_D };
1482*b1cdbd2cSJim Jagielski 
1483*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE FTPType getFTPType() const;
1484*b1cdbd2cSJim Jagielski 
1485*b1cdbd2cSJim Jagielski     // FILE URLs:
1486*b1cdbd2cSJim Jagielski 
1487*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE bool hasDosVolume(FSysStyle eStyle) const;
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski     // IMAP URLs:
1490*b1cdbd2cSJim Jagielski 
1491*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE sal_uInt32 getIMAPUID() const;
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski     // Coding:
1494*b1cdbd2cSJim Jagielski 
extend(ByteString const & rOctets)1495*b1cdbd2cSJim Jagielski     static inline rtl::OUString extend(ByteString const & rOctets)
1496*b1cdbd2cSJim Jagielski     {
1497*b1cdbd2cSJim Jagielski         return rtl::OUString(rOctets.GetBuffer(), rOctets.Len(),
1498*b1cdbd2cSJim Jagielski             RTL_TEXTENCODING_ISO_8859_1);
1499*b1cdbd2cSJim Jagielski     }
1500*b1cdbd2cSJim Jagielski 
getEscapePrefix(INetProtocol eTheScheme)1501*b1cdbd2cSJim Jagielski     static inline sal_Char getEscapePrefix(INetProtocol eTheScheme)
1502*b1cdbd2cSJim Jagielski     { return eTheScheme == INET_PROT_VIM ? '=' : '%'; }
1503*b1cdbd2cSJim Jagielski 
getEscapePrefix() const1504*b1cdbd2cSJim Jagielski     inline sal_Char getEscapePrefix() const
1505*b1cdbd2cSJim Jagielski     { return getEscapePrefix(m_eScheme); }
1506*b1cdbd2cSJim Jagielski 
1507*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE static inline void appendEscape(
1508*b1cdbd2cSJim Jagielski         rtl::OUStringBuffer & rTheText, sal_Char cEscapePrefix,
1509*b1cdbd2cSJim Jagielski         sal_uInt32 nOctet);
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski     static rtl::OUString encodeText(
1512*b1cdbd2cSJim Jagielski         sal_Unicode const * pBegin, sal_Unicode const * pEnd, bool bOctets,
1513*b1cdbd2cSJim Jagielski         Part ePart, sal_Char cEscapePrefix, EncodeMechanism eMechanism,
1514*b1cdbd2cSJim Jagielski         rtl_TextEncoding eCharset, bool bKeepVisibleEscapes);
1515*b1cdbd2cSJim Jagielski 
1516*b1cdbd2cSJim Jagielski     static inline rtl::OUString encodeText(
1517*b1cdbd2cSJim Jagielski         rtl::OUString const & rTheText, bool bOctets, Part ePart,
1518*b1cdbd2cSJim Jagielski         sal_Char cEscapePrefix, EncodeMechanism eMechanism,
1519*b1cdbd2cSJim Jagielski         rtl_TextEncoding eCharset, bool bKeepVisibleEscapes);
1520*b1cdbd2cSJim Jagielski 
1521*b1cdbd2cSJim Jagielski     static rtl::OUString decode(
1522*b1cdbd2cSJim Jagielski         sal_Unicode const * pBegin, sal_Unicode const * pEnd,
1523*b1cdbd2cSJim Jagielski         sal_Char cEscapePrefix, DecodeMechanism, rtl_TextEncoding eCharset);
1524*b1cdbd2cSJim Jagielski 
1525*b1cdbd2cSJim Jagielski     inline rtl::OUString decode(
1526*b1cdbd2cSJim Jagielski         SubString const & rSubString, sal_Char cEscapePrefix,
1527*b1cdbd2cSJim Jagielski         DecodeMechanism eMechanism, rtl_TextEncoding eCharset) const;
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski     // Specialized helpers:
1530*b1cdbd2cSJim Jagielski 
1531*b1cdbd2cSJim Jagielski     TOOLS_DLLPRIVATE static bool scanIPv6reference(
1532*b1cdbd2cSJim Jagielski         sal_Unicode const *& rBegin, sal_Unicode const * pEnd);
1533*b1cdbd2cSJim Jagielski };
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski // static
encodeText(rtl::OUString const & rTheText,bool bOctets,Part ePart,sal_Char cEscapePrefix,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,bool bKeepVisibleEscapes)1536*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::encodeText(rtl::OUString const & rTheText,
1537*b1cdbd2cSJim Jagielski 										   bool bOctets, Part ePart,
1538*b1cdbd2cSJim Jagielski 										   sal_Char cEscapePrefix,
1539*b1cdbd2cSJim Jagielski 										   EncodeMechanism eMechanism,
1540*b1cdbd2cSJim Jagielski 										   rtl_TextEncoding eCharset,
1541*b1cdbd2cSJim Jagielski 										   bool bKeepVisibleEscapes)
1542*b1cdbd2cSJim Jagielski {
1543*b1cdbd2cSJim Jagielski 	return encodeText(rTheText.getStr(),
1544*b1cdbd2cSJim Jagielski 					  rTheText.getStr() + rTheText.getLength(), bOctets, ePart,
1545*b1cdbd2cSJim Jagielski 					  cEscapePrefix, eMechanism, eCharset,
1546*b1cdbd2cSJim Jagielski 					  bKeepVisibleEscapes);
1547*b1cdbd2cSJim Jagielski }
1548*b1cdbd2cSJim Jagielski 
decode(SubString const & rSubString,sal_Char cEscapePrefix,DecodeMechanism eMechanism,rtl_TextEncoding eCharset) const1549*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::decode(SubString const & rSubString,
1550*b1cdbd2cSJim Jagielski 									   sal_Char cEscapePrefix,
1551*b1cdbd2cSJim Jagielski 									   DecodeMechanism eMechanism,
1552*b1cdbd2cSJim Jagielski 									   rtl_TextEncoding eCharset) const
1553*b1cdbd2cSJim Jagielski {
1554*b1cdbd2cSJim Jagielski     return rSubString.isPresent() ?
1555*b1cdbd2cSJim Jagielski                decode(m_aAbsURIRef.getStr() + rSubString.getBegin(),
1556*b1cdbd2cSJim Jagielski                       m_aAbsURIRef.getStr() + rSubString.getEnd(),
1557*b1cdbd2cSJim Jagielski                       cEscapePrefix, eMechanism, eCharset) :
1558*b1cdbd2cSJim Jagielski                rtl::OUString();
1559*b1cdbd2cSJim Jagielski }
1560*b1cdbd2cSJim Jagielski 
INetURLObject(ByteString const & rTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1561*b1cdbd2cSJim Jagielski inline INetURLObject::INetURLObject(ByteString const & rTheAbsURIRef,
1562*b1cdbd2cSJim Jagielski 									EncodeMechanism eMechanism,
1563*b1cdbd2cSJim Jagielski 									rtl_TextEncoding eCharset):
1564*b1cdbd2cSJim Jagielski 	m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP)
1565*b1cdbd2cSJim Jagielski {
1566*b1cdbd2cSJim Jagielski 	setAbsURIRef(extend(rTheAbsURIRef), true, eMechanism, eCharset, false,
1567*b1cdbd2cSJim Jagielski 				 FSysStyle(0));
1568*b1cdbd2cSJim Jagielski }
1569*b1cdbd2cSJim Jagielski 
INetURLObject(rtl::OUString const & rTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1570*b1cdbd2cSJim Jagielski inline INetURLObject::INetURLObject(rtl::OUString const & rTheAbsURIRef,
1571*b1cdbd2cSJim Jagielski 									EncodeMechanism eMechanism,
1572*b1cdbd2cSJim Jagielski 									rtl_TextEncoding eCharset):
1573*b1cdbd2cSJim Jagielski 	m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP)
1574*b1cdbd2cSJim Jagielski {
1575*b1cdbd2cSJim Jagielski 	setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, false,
1576*b1cdbd2cSJim Jagielski 				 FSysStyle(0));
1577*b1cdbd2cSJim Jagielski }
1578*b1cdbd2cSJim Jagielski 
SetURL(ByteString const & rTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1579*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetURL(ByteString const & rTheAbsURIRef,
1580*b1cdbd2cSJim Jagielski 								  EncodeMechanism eMechanism,
1581*b1cdbd2cSJim Jagielski 								  rtl_TextEncoding eCharset)
1582*b1cdbd2cSJim Jagielski {
1583*b1cdbd2cSJim Jagielski 	return setAbsURIRef(extend(rTheAbsURIRef), true, eMechanism, eCharset,
1584*b1cdbd2cSJim Jagielski 						false, FSysStyle(0));
1585*b1cdbd2cSJim Jagielski }
1586*b1cdbd2cSJim Jagielski 
SetURL(rtl::OUString const & rTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1587*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetURL(rtl::OUString const & rTheAbsURIRef,
1588*b1cdbd2cSJim Jagielski 								  EncodeMechanism eMechanism,
1589*b1cdbd2cSJim Jagielski 								  rtl_TextEncoding eCharset)
1590*b1cdbd2cSJim Jagielski {
1591*b1cdbd2cSJim Jagielski 	return setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, false,
1592*b1cdbd2cSJim Jagielski 						FSysStyle(0));
1593*b1cdbd2cSJim Jagielski }
1594*b1cdbd2cSJim Jagielski 
INetURLObject(rtl::OUString const & rTheAbsURIRef,INetProtocol eTheSmartScheme,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,FSysStyle eStyle)1595*b1cdbd2cSJim Jagielski inline INetURLObject::INetURLObject(rtl::OUString const & rTheAbsURIRef,
1596*b1cdbd2cSJim Jagielski 									INetProtocol eTheSmartScheme,
1597*b1cdbd2cSJim Jagielski 									EncodeMechanism eMechanism,
1598*b1cdbd2cSJim Jagielski 									rtl_TextEncoding eCharset,
1599*b1cdbd2cSJim Jagielski 									FSysStyle eStyle):
1600*b1cdbd2cSJim Jagielski 	m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(eTheSmartScheme)
1601*b1cdbd2cSJim Jagielski {
1602*b1cdbd2cSJim Jagielski 	setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, true, eStyle);
1603*b1cdbd2cSJim Jagielski }
1604*b1cdbd2cSJim Jagielski 
SetSmartURL(ByteString const & rTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,FSysStyle eStyle)1605*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetSmartURL(ByteString const & rTheAbsURIRef,
1606*b1cdbd2cSJim Jagielski 									   EncodeMechanism eMechanism,
1607*b1cdbd2cSJim Jagielski 									   rtl_TextEncoding eCharset,
1608*b1cdbd2cSJim Jagielski 									   FSysStyle eStyle)
1609*b1cdbd2cSJim Jagielski {
1610*b1cdbd2cSJim Jagielski 	return setAbsURIRef(extend(rTheAbsURIRef), true, eMechanism, eCharset,
1611*b1cdbd2cSJim Jagielski 						true, eStyle);
1612*b1cdbd2cSJim Jagielski }
1613*b1cdbd2cSJim Jagielski 
SetSmartURL(rtl::OUString const & rTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,FSysStyle eStyle)1614*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetSmartURL(rtl::OUString const & rTheAbsURIRef,
1615*b1cdbd2cSJim Jagielski 									   EncodeMechanism eMechanism,
1616*b1cdbd2cSJim Jagielski 									   rtl_TextEncoding eCharset,
1617*b1cdbd2cSJim Jagielski 									   FSysStyle eStyle)
1618*b1cdbd2cSJim Jagielski {
1619*b1cdbd2cSJim Jagielski 	return setAbsURIRef(rTheAbsURIRef, false, eMechanism, eCharset, true,
1620*b1cdbd2cSJim Jagielski 						eStyle);
1621*b1cdbd2cSJim Jagielski }
1622*b1cdbd2cSJim Jagielski 
1623*b1cdbd2cSJim Jagielski inline INetURLObject
smartRel2Abs(ByteString const & rTheRelURIRef,bool & rWasAbsolute,bool bIgnoreFragment,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,bool bRelativeNonURIs,FSysStyle eStyle) const1624*b1cdbd2cSJim Jagielski INetURLObject::smartRel2Abs(ByteString const & rTheRelURIRef,
1625*b1cdbd2cSJim Jagielski 							bool & rWasAbsolute,
1626*b1cdbd2cSJim Jagielski 							bool bIgnoreFragment,
1627*b1cdbd2cSJim Jagielski 							EncodeMechanism eMechanism,
1628*b1cdbd2cSJim Jagielski 							rtl_TextEncoding eCharset,
1629*b1cdbd2cSJim Jagielski 							bool bRelativeNonURIs,
1630*b1cdbd2cSJim Jagielski 							FSysStyle eStyle) const
1631*b1cdbd2cSJim Jagielski {
1632*b1cdbd2cSJim Jagielski 	INetURLObject aTheAbsURIRef;
1633*b1cdbd2cSJim Jagielski 	convertRelToAbs(extend(rTheRelURIRef), true, aTheAbsURIRef, rWasAbsolute,
1634*b1cdbd2cSJim Jagielski 					eMechanism, eCharset, bIgnoreFragment, true,
1635*b1cdbd2cSJim Jagielski 					bRelativeNonURIs, eStyle);
1636*b1cdbd2cSJim Jagielski 	return aTheAbsURIRef;
1637*b1cdbd2cSJim Jagielski }
1638*b1cdbd2cSJim Jagielski 
1639*b1cdbd2cSJim Jagielski inline INetURLObject
smartRel2Abs(rtl::OUString const & rTheRelURIRef,bool & rWasAbsolute,bool bIgnoreFragment,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,bool bRelativeNonURIs,FSysStyle eStyle) const1640*b1cdbd2cSJim Jagielski INetURLObject::smartRel2Abs(rtl::OUString const & rTheRelURIRef,
1641*b1cdbd2cSJim Jagielski 							bool & rWasAbsolute,
1642*b1cdbd2cSJim Jagielski 							bool bIgnoreFragment,
1643*b1cdbd2cSJim Jagielski 							EncodeMechanism eMechanism,
1644*b1cdbd2cSJim Jagielski 							rtl_TextEncoding eCharset,
1645*b1cdbd2cSJim Jagielski 							bool bRelativeNonURIs,
1646*b1cdbd2cSJim Jagielski 							FSysStyle eStyle) const
1647*b1cdbd2cSJim Jagielski {
1648*b1cdbd2cSJim Jagielski 	INetURLObject aTheAbsURIRef;
1649*b1cdbd2cSJim Jagielski 	convertRelToAbs(rTheRelURIRef, false, aTheAbsURIRef, rWasAbsolute,
1650*b1cdbd2cSJim Jagielski 					eMechanism, eCharset, bIgnoreFragment, true,
1651*b1cdbd2cSJim Jagielski 					bRelativeNonURIs, eStyle);
1652*b1cdbd2cSJim Jagielski 	return aTheAbsURIRef;
1653*b1cdbd2cSJim Jagielski }
1654*b1cdbd2cSJim Jagielski 
GetNewAbsURL(ByteString const & rTheRelURIRef,INetURLObject * pTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,FSysStyle eStyle,bool bIgnoreFragment) const1655*b1cdbd2cSJim Jagielski inline bool INetURLObject::GetNewAbsURL(ByteString const & rTheRelURIRef,
1656*b1cdbd2cSJim Jagielski 										INetURLObject * pTheAbsURIRef,
1657*b1cdbd2cSJim Jagielski 										EncodeMechanism eMechanism,
1658*b1cdbd2cSJim Jagielski 										rtl_TextEncoding eCharset,
1659*b1cdbd2cSJim Jagielski 										FSysStyle eStyle, bool bIgnoreFragment)
1660*b1cdbd2cSJim Jagielski     const
1661*b1cdbd2cSJim Jagielski {
1662*b1cdbd2cSJim Jagielski 	INetURLObject aTheAbsURIRef;
1663*b1cdbd2cSJim Jagielski 	bool bWasAbsolute;
1664*b1cdbd2cSJim Jagielski 	if (!convertRelToAbs(extend(rTheRelURIRef), true, aTheAbsURIRef,
1665*b1cdbd2cSJim Jagielski 						 bWasAbsolute, eMechanism, eCharset, bIgnoreFragment,
1666*b1cdbd2cSJim Jagielski                          false, false, eStyle))
1667*b1cdbd2cSJim Jagielski 		return false;
1668*b1cdbd2cSJim Jagielski 	if (pTheAbsURIRef)
1669*b1cdbd2cSJim Jagielski 		*pTheAbsURIRef = aTheAbsURIRef;
1670*b1cdbd2cSJim Jagielski 	return true;
1671*b1cdbd2cSJim Jagielski }
1672*b1cdbd2cSJim Jagielski 
GetNewAbsURL(rtl::OUString const & rTheRelURIRef,INetURLObject * pTheAbsURIRef,EncodeMechanism eMechanism,rtl_TextEncoding eCharset,FSysStyle eStyle,bool bIgnoreFragment) const1673*b1cdbd2cSJim Jagielski inline bool INetURLObject::GetNewAbsURL(rtl::OUString const & rTheRelURIRef,
1674*b1cdbd2cSJim Jagielski 										INetURLObject * pTheAbsURIRef,
1675*b1cdbd2cSJim Jagielski 										EncodeMechanism eMechanism,
1676*b1cdbd2cSJim Jagielski 										rtl_TextEncoding eCharset,
1677*b1cdbd2cSJim Jagielski 										FSysStyle eStyle, bool bIgnoreFragment)
1678*b1cdbd2cSJim Jagielski     const
1679*b1cdbd2cSJim Jagielski {
1680*b1cdbd2cSJim Jagielski 	INetURLObject aTheAbsURIRef;
1681*b1cdbd2cSJim Jagielski 	bool bWasAbsolute;
1682*b1cdbd2cSJim Jagielski 	if (!convertRelToAbs(rTheRelURIRef, false, aTheAbsURIRef, bWasAbsolute,
1683*b1cdbd2cSJim Jagielski 						 eMechanism, eCharset, bIgnoreFragment, false, false,
1684*b1cdbd2cSJim Jagielski                          eStyle))
1685*b1cdbd2cSJim Jagielski 		return false;
1686*b1cdbd2cSJim Jagielski 	if (pTheAbsURIRef)
1687*b1cdbd2cSJim Jagielski 		*pTheAbsURIRef = aTheAbsURIRef;
1688*b1cdbd2cSJim Jagielski 	return true;
1689*b1cdbd2cSJim Jagielski }
1690*b1cdbd2cSJim Jagielski 
1691*b1cdbd2cSJim Jagielski // static
GetRelURL(ByteString const & rTheBaseURIRef,ByteString const & rTheAbsURIRef,EncodeMechanism eEncodeMechanism,DecodeMechanism eDecodeMechanism,rtl_TextEncoding eCharset,FSysStyle eStyle)1692*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::GetRelURL(ByteString const & rTheBaseURIRef,
1693*b1cdbd2cSJim Jagielski 										  ByteString const & rTheAbsURIRef,
1694*b1cdbd2cSJim Jagielski 										  EncodeMechanism eEncodeMechanism,
1695*b1cdbd2cSJim Jagielski 										  DecodeMechanism eDecodeMechanism,
1696*b1cdbd2cSJim Jagielski 										  rtl_TextEncoding eCharset,
1697*b1cdbd2cSJim Jagielski 										  FSysStyle eStyle)
1698*b1cdbd2cSJim Jagielski {
1699*b1cdbd2cSJim Jagielski 	rtl::OUString aTheRelURIRef;
1700*b1cdbd2cSJim Jagielski 	INetURLObject(rTheBaseURIRef, eEncodeMechanism, eCharset).
1701*b1cdbd2cSJim Jagielski 		convertAbsToRel(extend(rTheAbsURIRef), true, aTheRelURIRef,
1702*b1cdbd2cSJim Jagielski 						eEncodeMechanism, eDecodeMechanism, eCharset, eStyle);
1703*b1cdbd2cSJim Jagielski 	return aTheRelURIRef;
1704*b1cdbd2cSJim Jagielski }
1705*b1cdbd2cSJim Jagielski 
1706*b1cdbd2cSJim Jagielski // static
GetRelURL(rtl::OUString const & rTheBaseURIRef,rtl::OUString const & rTheAbsURIRef,EncodeMechanism eEncodeMechanism,DecodeMechanism eDecodeMechanism,rtl_TextEncoding eCharset,FSysStyle eStyle)1707*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::GetRelURL(rtl::OUString const & rTheBaseURIRef,
1708*b1cdbd2cSJim Jagielski 										  rtl::OUString const & rTheAbsURIRef,
1709*b1cdbd2cSJim Jagielski 										  EncodeMechanism eEncodeMechanism,
1710*b1cdbd2cSJim Jagielski 										  DecodeMechanism eDecodeMechanism,
1711*b1cdbd2cSJim Jagielski 										  rtl_TextEncoding eCharset,
1712*b1cdbd2cSJim Jagielski 										  FSysStyle eStyle)
1713*b1cdbd2cSJim Jagielski {
1714*b1cdbd2cSJim Jagielski 	rtl::OUString aTheRelURIRef;
1715*b1cdbd2cSJim Jagielski 	INetURLObject(rTheBaseURIRef, eEncodeMechanism, eCharset).
1716*b1cdbd2cSJim Jagielski 		convertAbsToRel(rTheAbsURIRef, false, aTheRelURIRef, eEncodeMechanism,
1717*b1cdbd2cSJim Jagielski 						eDecodeMechanism, eCharset, eStyle);
1718*b1cdbd2cSJim Jagielski 	return aTheRelURIRef;
1719*b1cdbd2cSJim Jagielski }
1720*b1cdbd2cSJim Jagielski 
1721*b1cdbd2cSJim Jagielski // static
translateToExternal(ByteString const & rTheIntURIRef,rtl::OUString & rTheExtURIRef,DecodeMechanism eDecodeMechanism,rtl_TextEncoding eCharset)1722*b1cdbd2cSJim Jagielski inline bool INetURLObject::translateToExternal(ByteString const &
1723*b1cdbd2cSJim Jagielski 											       rTheIntURIRef,
1724*b1cdbd2cSJim Jagielski 											   rtl::OUString & rTheExtURIRef,
1725*b1cdbd2cSJim Jagielski 											   DecodeMechanism
1726*b1cdbd2cSJim Jagielski 											       eDecodeMechanism,
1727*b1cdbd2cSJim Jagielski 											   rtl_TextEncoding eCharset)
1728*b1cdbd2cSJim Jagielski {
1729*b1cdbd2cSJim Jagielski 	rtl::OUString aTheExtURIRef;
1730*b1cdbd2cSJim Jagielski 	bool bRet = convertIntToExt(extend(rTheIntURIRef), true, aTheExtURIRef,
1731*b1cdbd2cSJim Jagielski                                 eDecodeMechanism, eCharset);
1732*b1cdbd2cSJim Jagielski 	rTheExtURIRef = aTheExtURIRef;
1733*b1cdbd2cSJim Jagielski 	return bRet;
1734*b1cdbd2cSJim Jagielski }
1735*b1cdbd2cSJim Jagielski 
1736*b1cdbd2cSJim Jagielski // static
translateToExternal(rtl::OUString const & rTheIntURIRef,rtl::OUString & rTheExtURIRef,DecodeMechanism eDecodeMechanism,rtl_TextEncoding eCharset)1737*b1cdbd2cSJim Jagielski inline bool INetURLObject::translateToExternal(rtl::OUString const &
1738*b1cdbd2cSJim Jagielski 											       rTheIntURIRef,
1739*b1cdbd2cSJim Jagielski 											   rtl::OUString & rTheExtURIRef,
1740*b1cdbd2cSJim Jagielski 											   DecodeMechanism
1741*b1cdbd2cSJim Jagielski 											       eDecodeMechanism,
1742*b1cdbd2cSJim Jagielski 											   rtl_TextEncoding eCharset)
1743*b1cdbd2cSJim Jagielski {
1744*b1cdbd2cSJim Jagielski 	return convertIntToExt(rTheIntURIRef, false, rTheExtURIRef,
1745*b1cdbd2cSJim Jagielski 						   eDecodeMechanism, eCharset);
1746*b1cdbd2cSJim Jagielski }
1747*b1cdbd2cSJim Jagielski 
1748*b1cdbd2cSJim Jagielski // static
translateToInternal(ByteString const & rTheExtURIRef,rtl::OUString & rTheIntURIRef,DecodeMechanism eDecodeMechanism,rtl_TextEncoding eCharset)1749*b1cdbd2cSJim Jagielski inline bool INetURLObject::translateToInternal(ByteString const &
1750*b1cdbd2cSJim Jagielski 											       rTheExtURIRef,
1751*b1cdbd2cSJim Jagielski 											   rtl::OUString & rTheIntURIRef,
1752*b1cdbd2cSJim Jagielski 											   DecodeMechanism
1753*b1cdbd2cSJim Jagielski 											       eDecodeMechanism,
1754*b1cdbd2cSJim Jagielski 											   rtl_TextEncoding eCharset)
1755*b1cdbd2cSJim Jagielski {
1756*b1cdbd2cSJim Jagielski 	rtl::OUString aTheIntURIRef;
1757*b1cdbd2cSJim Jagielski 	bool bRet = convertExtToInt(extend(rTheExtURIRef), true, aTheIntURIRef,
1758*b1cdbd2cSJim Jagielski 						   eDecodeMechanism, eCharset);
1759*b1cdbd2cSJim Jagielski 	rTheIntURIRef = aTheIntURIRef;
1760*b1cdbd2cSJim Jagielski 	return bRet;
1761*b1cdbd2cSJim Jagielski }
1762*b1cdbd2cSJim Jagielski 
1763*b1cdbd2cSJim Jagielski // static
translateToInternal(rtl::OUString const & rTheExtURIRef,rtl::OUString & rTheIntURIRef,DecodeMechanism eDecodeMechanism,rtl_TextEncoding eCharset)1764*b1cdbd2cSJim Jagielski inline bool INetURLObject::translateToInternal(rtl::OUString const &
1765*b1cdbd2cSJim Jagielski                                                    rTheExtURIRef,
1766*b1cdbd2cSJim Jagielski                                                rtl::OUString & rTheIntURIRef,
1767*b1cdbd2cSJim Jagielski                                                DecodeMechanism
1768*b1cdbd2cSJim Jagielski                                                    eDecodeMechanism,
1769*b1cdbd2cSJim Jagielski                                                rtl_TextEncoding eCharset)
1770*b1cdbd2cSJim Jagielski {
1771*b1cdbd2cSJim Jagielski     return convertExtToInt(rTheExtURIRef, false, rTheIntURIRef,
1772*b1cdbd2cSJim Jagielski                            eDecodeMechanism, eCharset);
1773*b1cdbd2cSJim Jagielski }
1774*b1cdbd2cSJim Jagielski 
SetPass(ByteString const & rThePassword,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1775*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetPass(ByteString const & rThePassword,
1776*b1cdbd2cSJim Jagielski 								   EncodeMechanism eMechanism,
1777*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset)
1778*b1cdbd2cSJim Jagielski {
1779*b1cdbd2cSJim Jagielski 	return rThePassword.Len() == 0 ?
1780*b1cdbd2cSJim Jagielski 		       clearPassword() :
1781*b1cdbd2cSJim Jagielski 		       setPassword(extend(rThePassword), true, eMechanism, eCharset);
1782*b1cdbd2cSJim Jagielski }
1783*b1cdbd2cSJim Jagielski 
SetPass(rtl::OUString const & rThePassword,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1784*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetPass(rtl::OUString const & rThePassword,
1785*b1cdbd2cSJim Jagielski 								   EncodeMechanism eMechanism,
1786*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset)
1787*b1cdbd2cSJim Jagielski {
1788*b1cdbd2cSJim Jagielski 	return rThePassword.getLength() == 0 ?
1789*b1cdbd2cSJim Jagielski 		       clearPassword() :
1790*b1cdbd2cSJim Jagielski 		       setPassword(rThePassword, false, eMechanism, eCharset);
1791*b1cdbd2cSJim Jagielski }
1792*b1cdbd2cSJim Jagielski 
SetUserAndPass(ByteString const & rTheUser,ByteString const & rThePassword,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1793*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetUserAndPass(ByteString const & rTheUser,
1794*b1cdbd2cSJim Jagielski 										  ByteString const & rThePassword,
1795*b1cdbd2cSJim Jagielski 										  EncodeMechanism eMechanism,
1796*b1cdbd2cSJim Jagielski 										  rtl_TextEncoding eCharset)
1797*b1cdbd2cSJim Jagielski {
1798*b1cdbd2cSJim Jagielski 	return setUser(extend(rTheUser), true, eMechanism, eCharset)
1799*b1cdbd2cSJim Jagielski 		   && (rThePassword.Len() == 0 ?
1800*b1cdbd2cSJim Jagielski 			       clearPassword() :
1801*b1cdbd2cSJim Jagielski 			       setPassword(extend(rThePassword), true, eMechanism,
1802*b1cdbd2cSJim Jagielski 							   eCharset));
1803*b1cdbd2cSJim Jagielski }
1804*b1cdbd2cSJim Jagielski 
SetUserAndPass(rtl::OUString const & rTheUser,rtl::OUString const & rThePassword,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1805*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetUserAndPass(rtl::OUString const & rTheUser,
1806*b1cdbd2cSJim Jagielski 										  rtl::OUString const & rThePassword,
1807*b1cdbd2cSJim Jagielski 										  EncodeMechanism eMechanism,
1808*b1cdbd2cSJim Jagielski 										  rtl_TextEncoding eCharset)
1809*b1cdbd2cSJim Jagielski {
1810*b1cdbd2cSJim Jagielski 	return setUser(rTheUser, false, eMechanism, eCharset)
1811*b1cdbd2cSJim Jagielski 		   && (rThePassword.getLength() == 0 ?
1812*b1cdbd2cSJim Jagielski 			       clearPassword() :
1813*b1cdbd2cSJim Jagielski 			       setPassword(rThePassword, false, eMechanism, eCharset));
1814*b1cdbd2cSJim Jagielski }
1815*b1cdbd2cSJim Jagielski 
1816*b1cdbd2cSJim Jagielski // static
encodeHostPort(ByteString const & rTheHostPort,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1817*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::encodeHostPort(ByteString const &
1818*b1cdbd2cSJim Jagielski 											       rTheHostPort,
1819*b1cdbd2cSJim Jagielski 											   EncodeMechanism eMechanism,
1820*b1cdbd2cSJim Jagielski 											   rtl_TextEncoding eCharset)
1821*b1cdbd2cSJim Jagielski {
1822*b1cdbd2cSJim Jagielski 	return encodeHostPort(extend(rTheHostPort), true, eMechanism, eCharset);
1823*b1cdbd2cSJim Jagielski }
1824*b1cdbd2cSJim Jagielski 
insertName(rtl::OUString const & rTheName,bool bAppendFinalSlash,sal_Int32 nIndex,bool bIgnoreFinalSlash,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1825*b1cdbd2cSJim Jagielski inline bool INetURLObject::insertName(rtl::OUString const & rTheName,
1826*b1cdbd2cSJim Jagielski 									  bool bAppendFinalSlash,
1827*b1cdbd2cSJim Jagielski 									  sal_Int32 nIndex,
1828*b1cdbd2cSJim Jagielski 									  bool bIgnoreFinalSlash,
1829*b1cdbd2cSJim Jagielski 									  EncodeMechanism eMechanism,
1830*b1cdbd2cSJim Jagielski 									  rtl_TextEncoding eCharset)
1831*b1cdbd2cSJim Jagielski {
1832*b1cdbd2cSJim Jagielski 	return insertName(rTheName, false, bAppendFinalSlash, nIndex,
1833*b1cdbd2cSJim Jagielski 					  bIgnoreFinalSlash, eMechanism, eCharset);
1834*b1cdbd2cSJim Jagielski }
1835*b1cdbd2cSJim Jagielski 
SetParam(ByteString const & rTheQuery,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1836*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetParam(ByteString const & rTheQuery,
1837*b1cdbd2cSJim Jagielski 									EncodeMechanism eMechanism,
1838*b1cdbd2cSJim Jagielski 									rtl_TextEncoding eCharset)
1839*b1cdbd2cSJim Jagielski {
1840*b1cdbd2cSJim Jagielski 	return rTheQuery.Len() == 0 ?
1841*b1cdbd2cSJim Jagielski 		       clearQuery() :
1842*b1cdbd2cSJim Jagielski 		       setQuery(extend(rTheQuery), true, eMechanism, eCharset);
1843*b1cdbd2cSJim Jagielski }
1844*b1cdbd2cSJim Jagielski 
SetParam(rtl::OUString const & rTheQuery,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1845*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetParam(rtl::OUString const & rTheQuery,
1846*b1cdbd2cSJim Jagielski 									EncodeMechanism eMechanism,
1847*b1cdbd2cSJim Jagielski 									rtl_TextEncoding eCharset)
1848*b1cdbd2cSJim Jagielski {
1849*b1cdbd2cSJim Jagielski 	return rTheQuery.getLength() == 0 ?
1850*b1cdbd2cSJim Jagielski 		       clearQuery() :
1851*b1cdbd2cSJim Jagielski 		       setQuery(rTheQuery, false, eMechanism, eCharset);
1852*b1cdbd2cSJim Jagielski }
1853*b1cdbd2cSJim Jagielski 
SetMark(ByteString const & rTheFragment,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1854*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetMark(ByteString const & rTheFragment,
1855*b1cdbd2cSJim Jagielski 								   EncodeMechanism eMechanism,
1856*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset)
1857*b1cdbd2cSJim Jagielski {
1858*b1cdbd2cSJim Jagielski 	return rTheFragment.Len() == 0 ?
1859*b1cdbd2cSJim Jagielski 		       clearFragment() :
1860*b1cdbd2cSJim Jagielski 		       setFragment(extend(rTheFragment), true, eMechanism, eCharset);
1861*b1cdbd2cSJim Jagielski }
1862*b1cdbd2cSJim Jagielski 
SetMark(rtl::OUString const & rTheFragment,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1863*b1cdbd2cSJim Jagielski inline bool INetURLObject::SetMark(rtl::OUString const & rTheFragment,
1864*b1cdbd2cSJim Jagielski 								   EncodeMechanism eMechanism,
1865*b1cdbd2cSJim Jagielski 								   rtl_TextEncoding eCharset)
1866*b1cdbd2cSJim Jagielski {
1867*b1cdbd2cSJim Jagielski 	return rTheFragment.getLength() == 0 ?
1868*b1cdbd2cSJim Jagielski 		       clearFragment() :
1869*b1cdbd2cSJim Jagielski 		       setFragment(rTheFragment, false, eMechanism, eCharset);
1870*b1cdbd2cSJim Jagielski }
1871*b1cdbd2cSJim Jagielski 
INetURLObject(rtl::OUString const & rFSysPath,FSysStyle eStyle)1872*b1cdbd2cSJim Jagielski inline INetURLObject::INetURLObject(rtl::OUString const & rFSysPath,
1873*b1cdbd2cSJim Jagielski 									FSysStyle eStyle):
1874*b1cdbd2cSJim Jagielski 	m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP)
1875*b1cdbd2cSJim Jagielski {
1876*b1cdbd2cSJim Jagielski 	setFSysPath(rFSysPath, eStyle);
1877*b1cdbd2cSJim Jagielski }
1878*b1cdbd2cSJim Jagielski 
1879*b1cdbd2cSJim Jagielski // static
encode(ByteString const & rText,Part ePart,sal_Char cEscapePrefix,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1880*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::encode(ByteString const & rText, Part ePart,
1881*b1cdbd2cSJim Jagielski 									   sal_Char cEscapePrefix,
1882*b1cdbd2cSJim Jagielski 									   EncodeMechanism eMechanism,
1883*b1cdbd2cSJim Jagielski 									   rtl_TextEncoding eCharset)
1884*b1cdbd2cSJim Jagielski {
1885*b1cdbd2cSJim Jagielski 	return encodeText(extend(rText), true, ePart, cEscapePrefix, eMechanism,
1886*b1cdbd2cSJim Jagielski 					  eCharset, false);
1887*b1cdbd2cSJim Jagielski }
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski // static
encode(rtl::OUString const & rText,Part ePart,sal_Char cEscapePrefix,EncodeMechanism eMechanism,rtl_TextEncoding eCharset)1890*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::encode(rtl::OUString const & rText, Part ePart,
1891*b1cdbd2cSJim Jagielski 									   sal_Char cEscapePrefix,
1892*b1cdbd2cSJim Jagielski 									   EncodeMechanism eMechanism,
1893*b1cdbd2cSJim Jagielski 									   rtl_TextEncoding eCharset)
1894*b1cdbd2cSJim Jagielski {
1895*b1cdbd2cSJim Jagielski 	return encodeText(rText, false, ePart, cEscapePrefix, eMechanism,
1896*b1cdbd2cSJim Jagielski 					  eCharset, false);
1897*b1cdbd2cSJim Jagielski }
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski // static
decode(rtl::OUString const & rText,sal_Char cEscapePrefix,DecodeMechanism eMechanism,rtl_TextEncoding eCharset)1900*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::decode(rtl::OUString const & rText,
1901*b1cdbd2cSJim Jagielski 									   sal_Char cEscapePrefix,
1902*b1cdbd2cSJim Jagielski 									   DecodeMechanism eMechanism,
1903*b1cdbd2cSJim Jagielski 									   rtl_TextEncoding eCharset)
1904*b1cdbd2cSJim Jagielski {
1905*b1cdbd2cSJim Jagielski 	return decode(rText.getStr(), rText.getStr() + rText.getLength(),
1906*b1cdbd2cSJim Jagielski 				  cEscapePrefix, eMechanism, eCharset);
1907*b1cdbd2cSJim Jagielski }
1908*b1cdbd2cSJim Jagielski 
decode(rtl::OUStringBuffer const & rText,sal_Char cEscapePrefix,DecodeMechanism eMechanism,rtl_TextEncoding eCharset)1909*b1cdbd2cSJim Jagielski inline rtl::OUString INetURLObject::decode(rtl::OUStringBuffer const & rText,
1910*b1cdbd2cSJim Jagielski 									   sal_Char cEscapePrefix,
1911*b1cdbd2cSJim Jagielski 									   DecodeMechanism eMechanism,
1912*b1cdbd2cSJim Jagielski 									   rtl_TextEncoding eCharset)
1913*b1cdbd2cSJim Jagielski {
1914*b1cdbd2cSJim Jagielski 	return decode(rText.getStr(), rText.getStr() + rText.getLength(),
1915*b1cdbd2cSJim Jagielski 				  cEscapePrefix, eMechanism, eCharset);
1916*b1cdbd2cSJim Jagielski }
1917*b1cdbd2cSJim Jagielski 
1918*b1cdbd2cSJim Jagielski #endif // _URLOBJ_HXX
1919