00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 #if !defined(XMLURI_HPP)
00110 #define XMLURI_HPP
00111
00112 #include <xercesc/util/XMemory.hpp>
00113 #include <xercesc/util/XMLString.hpp>
00114
00115 #include <xercesc/internal/XSerializable.hpp>
00116 #include <xercesc/framework/XMLBuffer.hpp>
00117
00118 XERCES_CPP_NAMESPACE_BEGIN
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 class XMLUri : public XSerializable, public XMemory
00130 {
00131 public:
00132
00133
00134
00135
00136
00165 XMLUri(const XMLCh* const uriSpec,
00166 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00167
00184 XMLUri(const XMLUri* const baseURI
00185 , const XMLCh* const uriSpec
00186 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00187
00191 XMLUri(const XMLUri& toCopy);
00192 XMLUri& operator=(const XMLUri& toAssign);
00193
00194 virtual ~XMLUri();
00195
00196
00197
00198
00204 const XMLCh* getUriText() const;
00205
00211 const XMLCh* getScheme() const;
00212
00218 const XMLCh* getUserInfo() const;
00219
00220
00226 const XMLCh* getHost() const;
00227
00233 int getPort() const;
00234
00240 const XMLCh* getRegBasedAuthority() const;
00241
00248 const XMLCh* getPath() const;
00249
00257 const XMLCh* getQueryString() const;
00258
00266 const XMLCh* getFragment() const;
00267
00268
00269
00270
00271
00279 void setScheme(const XMLCh* const newScheme);
00280
00288 void setUserInfo(const XMLCh* const newUserInfo);
00289
00300 void setHost(const XMLCh* const newHost);
00301
00311 void setPort(int newPort);
00312
00321 void setRegBasedAuthority(const XMLCh* const newRegAuth);
00322
00343 void setPath(const XMLCh* const newPath);
00344
00353 void setQueryString(const XMLCh* const newQueryString);
00354
00363 void setFragment(const XMLCh* const newFragment);
00364
00365
00366
00367
00368
00376 static bool isURIString(const XMLCh* const uric);
00377
00381 static bool isValidURI( const XMLUri* const baseURI
00382 , const XMLCh* const uriStr);
00386 static bool isValidURI( bool haveBaseURI
00387 , const XMLCh* const uriStr);
00388
00389
00390 static void normalizeURI(const XMLCh* const systemURI,
00391 XMLBuffer& normalizedURI);
00392
00393
00394
00395
00396 DECL_XSERIALIZABLE(XMLUri)
00397
00398 XMLUri(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00399
00400 private:
00401
00402 static const XMLCh MARK_OR_RESERVED_CHARACTERS[];
00403 static const XMLCh RESERVED_CHARACTERS[];
00404 static const XMLCh MARK_CHARACTERS[];
00405 static const XMLCh SCHEME_CHARACTERS[];
00406 static const XMLCh USERINFO_CHARACTERS[];
00407 static const XMLCh REG_NAME_CHARACTERS[];
00408 static const XMLCh PATH_CHARACTERS[];
00409
00410
00411 void buildFullText();
00412
00413
00414
00415
00416
00422 static bool isReservedCharacter(const XMLCh theChar);
00423
00429 static bool isPathCharacter(const XMLCh theChar);
00430
00436 static bool isUnreservedCharacter(const XMLCh theChar);
00437
00443 static bool isReservedOrUnreservedCharacter(const XMLCh theChar);
00444
00452 static bool isConformantSchemeName(const XMLCh* const scheme);
00453
00459 static void isConformantUserInfo(const XMLCh* const userInfo
00460 , MemoryManager* const manager);
00461
00469 static bool isValidServerBasedAuthority(const XMLCh* const host
00470 , const int hostLen
00471 , const int port
00472 , const XMLCh* const userinfo
00473 , const int userLen);
00474
00482 static bool isValidServerBasedAuthority(const XMLCh* const host
00483 , const int port
00484 , const XMLCh* const userinfo
00485 , MemoryManager* const manager);
00486
00494 static bool isValidRegistryBasedAuthority(const XMLCh* const authority
00495 , const int authLen);
00496
00504 static bool isValidRegistryBasedAuthority(const XMLCh* const authority);
00505
00523 static bool isWellFormedAddress(const XMLCh* const addr
00524 , MemoryManager* const manager);
00525
00535 static bool isWellFormedIPv4Address(const XMLCh* const addr, const int length);
00536
00550 static bool isWellFormedIPv6Reference(const XMLCh* const addr, const int length);
00551
00567 static int scanHexSequence (const XMLCh* const addr, int index, int end, int& counter);
00568
00576 bool isGenericURI();
00577
00578
00579
00580
00581
00587 void initialize(const XMLUri& toCopy);
00588
00603 void initialize(const XMLUri* const baseURI
00604 , const XMLCh* const uriSpec);
00605
00612 void initializeScheme(const XMLCh* const uriSpec);
00613
00621 void initializeAuthority(const XMLCh* const uriSpec);
00622
00629 void initializePath(const XMLCh* const uriSpec);
00630
00635 void cleanUp();
00636
00637 static bool isConformantSchemeName(const XMLCh* const scheme,
00638 const int schemeLen);
00639 static bool processScheme(const XMLCh* const uriStr, int& index);
00640 static bool processAuthority(const XMLCh* const uriStr, const int authLen);
00641 static bool isWellFormedAddress(const XMLCh* const addr, const int addrLen);
00642 static bool processPath(const XMLCh* const pathStr, const int pathStrLen,
00643 const bool isSchemePresent);
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653 XMLCh* fScheme;
00654 XMLCh* fUserInfo;
00655 XMLCh* fHost;
00656 int fPort;
00657 XMLCh* fRegAuth;
00658 XMLCh* fPath;
00659 XMLCh* fQueryString;
00660 XMLCh* fFragment;
00661 XMLCh* fURIText;
00662 MemoryManager* fMemoryManager;
00663 };
00664
00665
00666
00667
00668 inline const XMLCh* XMLUri::getScheme() const
00669 {
00670 return fScheme;
00671 }
00672
00673 inline const XMLCh* XMLUri::getUserInfo() const
00674 {
00675 return fUserInfo;
00676 }
00677
00678 inline const XMLCh* XMLUri::getHost() const
00679 {
00680 return fHost;
00681 }
00682
00683 inline int XMLUri::getPort() const
00684 {
00685 return fPort;
00686 }
00687
00688 inline const XMLCh* XMLUri::getRegBasedAuthority() const
00689 {
00690 return fRegAuth;
00691 }
00692
00693 inline const XMLCh* XMLUri::getPath() const
00694 {
00695 return fPath;
00696 }
00697
00698 inline const XMLCh* XMLUri::getQueryString() const
00699 {
00700 return fQueryString;
00701 }
00702
00703 inline const XMLCh* XMLUri::getFragment() const
00704 {
00705 return fFragment;
00706 }
00707
00708 inline const XMLCh* XMLUri::getUriText() const
00709 {
00710
00711
00712
00713
00714
00715 if (!fURIText)
00716 ((XMLUri*)this)->buildFullText();
00717
00718 return fURIText;
00719 }
00720
00721
00722
00723
00724 inline bool XMLUri::isReservedOrUnreservedCharacter(const XMLCh theChar)
00725 {
00726 return (XMLString::isAlphaNum(theChar) ||
00727 XMLString::indexOf(MARK_OR_RESERVED_CHARACTERS, theChar) != -1);
00728 }
00729
00730 inline bool XMLUri::isReservedCharacter(const XMLCh theChar)
00731 {
00732 return (XMLString::indexOf(RESERVED_CHARACTERS, theChar) != -1);
00733 }
00734
00735 inline bool XMLUri::isPathCharacter(const XMLCh theChar)
00736 {
00737 return (XMLString::indexOf(PATH_CHARACTERS, theChar) != -1);
00738 }
00739
00740 inline bool XMLUri::isUnreservedCharacter(const XMLCh theChar)
00741 {
00742 return (XMLString::isAlphaNum(theChar) ||
00743 XMLString::indexOf(MARK_CHARACTERS, theChar) != -1);
00744 }
00745
00746 XERCES_CPP_NAMESPACE_END
00747
00748 #endif