00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #if !defined(XERCESC_INCLUDE_GUARD_XMLURI_HPP)
00023 #define XERCESC_INCLUDE_GUARD_XMLURI_HPP
00024
00025 #include <xercesc/util/XMemory.hpp>
00026 #include <xercesc/util/XMLString.hpp>
00027
00028 #include <xercesc/internal/XSerializable.hpp>
00029 #include <xercesc/framework/XMLBuffer.hpp>
00030
00031 XERCES_CPP_NAMESPACE_BEGIN
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 class XMLUTIL_EXPORT XMLUri : public XSerializable, public XMemory
00043 {
00044 public:
00045
00046
00047
00048
00049
00078 XMLUri(const XMLCh* const uriSpec,
00079 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00080
00097 XMLUri(const XMLUri* const baseURI
00098 , const XMLCh* const uriSpec
00099 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00100
00104 XMLUri(const XMLUri& toCopy);
00105 XMLUri& operator=(const XMLUri& toAssign);
00106
00107 virtual ~XMLUri();
00108
00109
00110
00111
00117 const XMLCh* getUriText() const;
00118
00124 const XMLCh* getScheme() const;
00125
00131 const XMLCh* getUserInfo() const;
00132
00133
00139 const XMLCh* getHost() const;
00140
00146 int getPort() const;
00147
00153 const XMLCh* getRegBasedAuthority() const;
00154
00161 const XMLCh* getPath() const;
00162
00170 const XMLCh* getQueryString() const;
00171
00179 const XMLCh* getFragment() const;
00180
00181
00182
00183
00184
00192 void setScheme(const XMLCh* const newScheme);
00193
00201 void setUserInfo(const XMLCh* const newUserInfo);
00202
00213 void setHost(const XMLCh* const newHost);
00214
00224 void setPort(int newPort);
00225
00234 void setRegBasedAuthority(const XMLCh* const newRegAuth);
00235
00256 void setPath(const XMLCh* const newPath);
00257
00266 void setQueryString(const XMLCh* const newQueryString);
00267
00276 void setFragment(const XMLCh* const newFragment);
00277
00278
00279
00280
00281
00289 static bool isURIString(const XMLCh* const uric);
00290
00294 static bool isValidURI( const XMLUri* const baseURI
00295 , const XMLCh* const uriStr
00296 , bool bAllowSpaces=false);
00300 static bool isValidURI( bool haveBaseURI
00301 , const XMLCh* const uriStr
00302 , bool bAllowSpaces=false);
00303
00304
00305 static void normalizeURI(const XMLCh* const systemURI,
00306 XMLBuffer& normalizedURI);
00307
00308
00309
00310
00311 DECL_XSERIALIZABLE(XMLUri)
00312
00313 XMLUri(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00314
00315 private:
00316
00317 static const XMLCh MARK_OR_RESERVED_CHARACTERS[];
00318 static const XMLCh RESERVED_CHARACTERS[];
00319 static const XMLCh MARK_CHARACTERS[];
00320 static const XMLCh SCHEME_CHARACTERS[];
00321 static const XMLCh USERINFO_CHARACTERS[];
00322 static const XMLCh REG_NAME_CHARACTERS[];
00323 static const XMLCh PATH_CHARACTERS[];
00324
00325
00326 void buildFullText();
00327
00328
00329
00330
00331
00337 static bool isReservedCharacter(const XMLCh theChar);
00338
00344 static bool isPathCharacter(const XMLCh theChar);
00345
00351 static bool isUnreservedCharacter(const XMLCh theChar);
00352
00358 static bool isReservedOrUnreservedCharacter(const XMLCh theChar);
00359
00367 static bool isConformantSchemeName(const XMLCh* const scheme);
00368
00374 static void isConformantUserInfo(const XMLCh* const userInfo
00375 , MemoryManager* const manager);
00376
00384 static bool isValidServerBasedAuthority(const XMLCh* const host
00385 , const XMLSize_t hostLen
00386 , const int port
00387 , const XMLCh* const userinfo
00388 , const XMLSize_t userLen);
00389
00397 static bool isValidServerBasedAuthority(const XMLCh* const host
00398 , const int port
00399 , const XMLCh* const userinfo
00400 , MemoryManager* const manager);
00401
00409 static bool isValidRegistryBasedAuthority(const XMLCh* const authority
00410 , const XMLSize_t authLen);
00411
00419 static bool isValidRegistryBasedAuthority(const XMLCh* const authority);
00420
00438 static bool isWellFormedAddress(const XMLCh* const addr
00439 , MemoryManager* const manager);
00440
00450 static bool isWellFormedIPv4Address(const XMLCh* const addr, const XMLSize_t length);
00451
00465 static bool isWellFormedIPv6Reference(const XMLCh* const addr, const XMLSize_t length);
00466
00482 static int scanHexSequence (const XMLCh* const addr, XMLSize_t index, XMLSize_t end, int& counter);
00483
00491 bool isGenericURI();
00492
00493
00494
00495
00496
00502 void initialize(const XMLUri& toCopy);
00503
00518 void initialize(const XMLUri* const baseURI
00519 , const XMLCh* const uriSpec);
00520
00527 void initializeScheme(const XMLCh* const uriSpec);
00528
00536 void initializeAuthority(const XMLCh* const uriSpec);
00537
00544 void initializePath(const XMLCh* const uriSpec);
00545
00550 void cleanUp();
00551
00552 static bool isConformantSchemeName(const XMLCh* const scheme,
00553 const XMLSize_t schemeLen);
00554 static bool processScheme(const XMLCh* const uriStr, XMLSize_t& index);
00555 static bool processAuthority(const XMLCh* const uriStr, const XMLSize_t authLen);
00556 static bool isWellFormedAddress(const XMLCh* const addr, const XMLSize_t addrLen);
00557 static bool processPath(const XMLCh* const pathStr, const XMLSize_t pathStrLen,
00558 const bool isSchemePresent, const bool bAllowSpaces=false);
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568 int fPort;
00569 XMLCh* fScheme;
00570 XMLCh* fUserInfo;
00571 XMLCh* fHost;
00572 XMLCh* fRegAuth;
00573 XMLCh* fPath;
00574 XMLCh* fQueryString;
00575 XMLCh* fFragment;
00576 XMLCh* fURIText;
00577 MemoryManager* fMemoryManager;
00578 };
00579
00580
00581
00582
00583 inline const XMLCh* XMLUri::getScheme() const
00584 {
00585 return fScheme;
00586 }
00587
00588 inline const XMLCh* XMLUri::getUserInfo() const
00589 {
00590 return fUserInfo;
00591 }
00592
00593 inline const XMLCh* XMLUri::getHost() const
00594 {
00595 return fHost;
00596 }
00597
00598 inline int XMLUri::getPort() const
00599 {
00600 return fPort;
00601 }
00602
00603 inline const XMLCh* XMLUri::getRegBasedAuthority() const
00604 {
00605 return fRegAuth;
00606 }
00607
00608 inline const XMLCh* XMLUri::getPath() const
00609 {
00610 return fPath;
00611 }
00612
00613 inline const XMLCh* XMLUri::getQueryString() const
00614 {
00615 return fQueryString;
00616 }
00617
00618 inline const XMLCh* XMLUri::getFragment() const
00619 {
00620 return fFragment;
00621 }
00622
00623 inline const XMLCh* XMLUri::getUriText() const
00624 {
00625
00626
00627
00628
00629
00630 if (!fURIText)
00631 ((XMLUri*)this)->buildFullText();
00632
00633 return fURIText;
00634 }
00635
00636
00637
00638
00639 inline bool XMLUri::isReservedOrUnreservedCharacter(const XMLCh theChar)
00640 {
00641 return (XMLString::isAlphaNum(theChar) ||
00642 XMLString::indexOf(MARK_OR_RESERVED_CHARACTERS, theChar) != -1);
00643 }
00644
00645 inline bool XMLUri::isReservedCharacter(const XMLCh theChar)
00646 {
00647 return (XMLString::indexOf(RESERVED_CHARACTERS, theChar) != -1);
00648 }
00649
00650 inline bool XMLUri::isPathCharacter(const XMLCh theChar)
00651 {
00652 return (XMLString::indexOf(PATH_CHARACTERS, theChar) != -1);
00653 }
00654
00655 inline bool XMLUri::isUnreservedCharacter(const XMLCh theChar)
00656 {
00657 return (XMLString::isAlphaNum(theChar) ||
00658 XMLString::indexOf(MARK_CHARACTERS, theChar) != -1);
00659 }
00660
00661 XERCES_CPP_NAMESPACE_END
00662
00663 #endif