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