tng 2002/09/23 11:41:00 Modified: c/src/xercesc/util XMLUri.cpp XMLUri.hpp Log: DOM L3: Support baseURI. Add fURIText to XMLUri. Added by Gareth Reakes and Thomas Ford. Revision Changes Path 1.4 +106 -4 xml-xerces/c/src/xercesc/util/XMLUri.cpp Index: XMLUri.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLUri.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- XMLUri.cpp 23 Aug 2002 20:45:24 -0000 1.3 +++ XMLUri.cpp 23 Sep 2002 18:41:00 -0000 1.4 @@ -247,6 +247,7 @@ ,fPath(0) ,fQueryString(0) ,fFragment(0) +,fURIText(0) { try { initialize((XMLUri *)0, uriSpec); @@ -268,6 +269,7 @@ ,fPath(0) ,fQueryString(0) ,fFragment(0) +,fURIText(0) { try { initialize(baseURI, uriSpec); @@ -303,6 +305,8 @@ if (getFragment()) delete[] fFragment; + + delete[] fURIText; } void XMLUri::initialize(const XMLUri& toCopy) @@ -327,7 +331,7 @@ // get a trimmed version of uriSpec // uriSpec will NO LONGER be used in this function. // - XMLCh* const trimedUriSpec = XMLString::replicate(uriSpec); + XMLCh* trimedUriSpec = XMLString::replicate(uriSpec); XMLString::trim(trimedUriSpec); ArrayJanitor<XMLCh> janName(trimedUriSpec); int trimedUriSpecLen = XMLString::stringLen(trimedUriSpec); @@ -353,6 +357,7 @@ // DOS drive letters ('D:'), so 1-character schemes are not allowed. int colonIdx = XMLString::indexOf(trimedUriSpec, chColon); int slashIdx = XMLString::indexOf(trimedUriSpec, chForwardSlash); + if ((colonIdx < 2) || (colonIdx > slashIdx && slashIdx != -1) ) { @@ -486,6 +491,7 @@ // if we get to this point, we need to resolve relative path // RFC 2396 5.2 #6 + XMLCh* basePath = XMLString::replicate(baseURI->getPath()); ArrayJanitor<XMLCh> basePathName(basePath); @@ -576,6 +582,7 @@ delete [] fPath; fPath = XMLString::replicate(path); + } } @@ -890,7 +897,6 @@ fScheme = XMLString::replicate(newScheme); XMLString::lowerCase(fScheme); - } // @@ -928,7 +934,11 @@ delete [] fUserInfo; } - fUserInfo = XMLString::replicate(newUserInfo); + //sometimes we get passed a empty string rather than a null. + //Other procedures rely on it being null + if(XMLString::stringLen(newUserInfo) > 0) { + fUserInfo = XMLString::replicate(newUserInfo); + } } @@ -1338,4 +1348,96 @@ return (getHost() != 0); } + +// +// This method will take the broken out parts of the URI and build up the +// full text. We don't do this unless someone asks us to, since its often +// never required. +// +void XMLUri::buildFullText() +{ + // Calculate the worst case size of the buffer required + unsigned int bufSize = XMLString::stringLen(fScheme) + 1 + + XMLString::stringLen(fFragment) + 1 + + XMLString::stringLen(fHost) + 2 + + XMLString::stringLen(fPath) + + XMLString::stringLen(fQueryString) + 1 + + XMLString::stringLen(fUserInfo) + 1 + + 32; + + // Clean up the existing buffer and allocate another + delete [] fURIText; + fURIText = new XMLCh[bufSize]; + *fURIText = 0; + + XMLCh* outPtr = fURIText; + if (fScheme != 0) + { + XMLString::catString(fURIText, getScheme()); + outPtr += XMLString::stringLen(fURIText); + *outPtr++ = chColon; + *outPtr++ = chForwardSlash; + *outPtr++ = chForwardSlash; + } + + if (fUserInfo) + { + XMLString::copyString(outPtr, fUserInfo); + outPtr += XMLString::stringLen(fUserInfo); + + + /*REVISIT dont have password field in uri - is this right?? + if (fPassword) + { + *outPtr++ = chColon; + XMLString::copyString(outPtr, fPassword); + outPtr += XMLString::stringLen(fPassword); + } + */ + *outPtr++ = chAt; + } + + if (fHost) + { + XMLString::copyString(outPtr, fHost); + outPtr += XMLString::stringLen(fHost); + + // + // If the port is -1, then we don't put it in. Else we need + // to because it was explicitly provided. + // + if (fPort != -1) + { + *outPtr++ = chColon; + + XMLCh tmpBuf[16]; + XMLString::binToText(fPort, tmpBuf, 16, 10); + XMLString::copyString(outPtr, tmpBuf); + outPtr += XMLString::stringLen(tmpBuf); + } + } + + if (fPath) + { + XMLString::copyString(outPtr, fPath); + outPtr += XMLString::stringLen(fPath); + } + + if (fQueryString) + { + *outPtr++ = chQuestion; + XMLString::copyString(outPtr, fQueryString); + outPtr += XMLString::stringLen(fQueryString); + } + + if (fFragment) + { + *outPtr++ = chPound; + XMLString::copyString(outPtr, fFragment); + outPtr += XMLString::stringLen(fFragment); + } + + // Cap it off in case the last op was not a string copy + *outPtr = 0; +} 1.4 +27 -6 xml-xerces/c/src/xercesc/util/XMLUri.hpp Index: XMLUri.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLUri.hpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- XMLUri.hpp 23 Aug 2002 20:45:24 -0000 1.3 +++ XMLUri.hpp 23 Sep 2002 18:41:00 -0000 1.4 @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.4 2002/09/23 18:41:00 tng + * DOM L3: Support baseURI. Add fURIText to XMLUri. Added by Gareth Reakes and Thomas Ford. + * * Revision 1.3 2002/08/23 20:45:24 tng * .Memory leak fix: XMLUri data not deleted if constructor failed. * @@ -148,13 +151,14 @@ virtual ~XMLUri(); // ----------------------------------------------------------------------- - // Operators - // ----------------------------------------------------------------------- - - - // ----------------------------------------------------------------------- // Getter methods // ----------------------------------------------------------------------- + /** + * Get the URI as a string specification. See RFC 2396 Section 5.2. + * + * @return the URI string specification + */ + const XMLCh* getUriText() const; /** * Get the scheme for this URI. @@ -306,6 +310,9 @@ static const XMLCh SCHEME_CHARACTERS[]; static const XMLCh USERINFO_CHARACTERS[]; + //helper method for getUriText + void buildFullText(); + /** * Unimplemented copy ctor */ @@ -455,6 +462,7 @@ XMLCh* fPath; XMLCh* fQueryString; XMLCh* fFragment; + XMLCh* fURIText; }; @@ -494,6 +502,19 @@ inline const XMLCh* XMLUri::getFragment() const { return fFragment; +} + +inline const XMLCh* XMLUri::getUriText() const +{ + // + // Fault it in if not already. Since this is a const method and we + // can't use mutable members due the compilers we have to support, + // we have to cast off the constness. + // + if (!fURIText) + ((XMLUri*)this)->buildFullText(); + + return fURIText; } // ---------------------------------------------------------------------------
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]