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 227 inline INetURLObject(): 228 m_eScheme(INET_PROT_NOT_VALID), m_eSmartScheme(INET_PROT_HTTP) {} 229 230 inline bool HasError() const { return m_eScheme == INET_PROT_NOT_VALID; } 231 232 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 256 inline bool operator !=(INetURLObject const & rObject) const 257 { return !(*this == rObject); } 258 259 bool operator <(INetURLObject const & rObject) const; 260 261 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 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 520 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 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 540 inline bool HasUserData() const { return m_aUser.isPresent(); } 541 542 inline bool IsEmptyUser() const 543 { return m_aUser.isPresent() && m_aUser.isEmpty(); } 544 545 bool hasPassword() const; 546 547 inline bool IsEmptyPass() const 548 { return hasPassword() && m_aAuth.isEmpty(); } 549 550 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 555 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 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 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 595 inline bool HasPort() const { return m_aPort.isPresent(); } 596 597 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 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 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 */ 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 667 inline bool HasURLPath() const { return !m_aPath.isEmpty(); } 668 669 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 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 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 974 inline bool HasParam() const { return m_aQuery.isPresent(); } 975 976 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 992 inline bool HasMark() const { return m_aFragment.isPresent(); } 993 994 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 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 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 1271 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 1283 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: 1305 explicit inline SubString(sal_Int32 nTheBegin = -1, 1306 sal_Int32 nTheLength = 0): 1307 m_nBegin(nTheBegin), m_nLength(nTheLength) {} 1308 1309 inline bool isPresent() const { return m_nBegin != -1; } 1310 1311 inline bool isEmpty() const { return m_nLength == 0; } 1312 1313 inline sal_Int32 getBegin() const { return m_nBegin; } 1314 1315 inline sal_Int32 getLength() const { return m_nLength; } 1316 1317 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 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 1501 static inline sal_Char getEscapePrefix(INetProtocol eTheScheme) 1502 { return eTheScheme == INET_PROT_VIM ? '=' : '%'; } 1503 1504 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 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 1549 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 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 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 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 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 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 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 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 1624 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 1640 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 1655 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 1673 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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