dbertoni 00/05/12 11:18:16
Added: c/src/PlatformSupport URISupport.cpp URISupport.hpp Log: Initial revision. Revision Changes Path 1.1 xml-xalan/c/src/PlatformSupport/URISupport.cpp Index: URISupport.cpp =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2000 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xalan" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.ibm.com. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ #include "URISupport.hpp" #include <algorithm> #include <vector> #include <util/PlatformUtils.hpp> #include "STLHelper.hpp" URISupport::URLAutoPtrType URISupport::getURLFromString(const XalanDOMString& urlString) { #if !defined(XALAN_NO_NAMESPACES) using std::auto_ptr; #endif URLAutoPtrType url(new XMLURL); try { XalanDOMString theNormalizedURI(clone(urlString)); // Let's see what sort of URI we have... const unsigned int len = length(theNormalizedURI); const unsigned int index = indexOf(theNormalizedURI, ':'); bool protocolPresent = false; if (index != len) { // $$$ ToDo: XMLURL::lookupByName() is supposed to be static, but is not. const XMLURL::Protocols theProtocol = XMLURL().lookupByName(c_wstr(substring(theNormalizedURI, 0 , index))); if (theProtocol != XMLURL::Unknown) { protocolPresent = true; } } if (protocolPresent == true) { NormalizeURIText(theNormalizedURI); } else { // Assume it's a file specification... array_auto_ptr<XMLCh> theFullPath(XMLPlatformUtils::getFullPath(c_wstr(urlString))); assert(theFullPath.get() != 0); theNormalizedURI = theFullPath.get(); assert(length(theNormalizedURI) > 0); NormalizeURIText(theNormalizedURI); const XalanDOMString theFilePrefix(indexOf(theNormalizedURI, '/') == 0 ? XALAN_STATIC_UCODE_STRING("file://") : XALAN_STATIC_UCODE_STRING("file:///")); theNormalizedURI = theFilePrefix + theNormalizedURI; } url->setURL(c_wstr(theNormalizedURI)); } catch (...) { throw ("Error! Cannot create url for: " + urlString); } return url; } URISupport::URLAutoPtrType URISupport::getURLFromString( const XalanDOMString& urlString, const XalanDOMString& base) { XalanDOMString context(clone(base)); NormalizeURIText(context); const unsigned int theContextLength = length(context); const unsigned int indexOfSlash = lastIndexOf(context, '/'); if (indexOfSlash < theContextLength) { context = substring(context, 0, indexOfSlash + 1); } // OK, now let's look at the urlString... // Is there a colon, indicating some sort of drive spec, or protocol? const unsigned int theURLStringLength = length(urlString); const unsigned int theColonIndex = indexOf(urlString, ':'); if (theColonIndex == theURLStringLength) { // No colon, so just use the urlString as is... // Strip off file name from context... if (indexOfSlash < theContextLength) { context = substring(context, 0, indexOfSlash + 1); } context += urlString; } else { const XalanDOMString theProtocolString(substring(urlString, 0, theColonIndex)); // $$$ ToDo: XMLURL::lookupByName() is supposed to be static, but is not. const XMLURL::Protocols theProtocol = XMLURL().lookupByName(c_wstr(theProtocolString)); if (theColonIndex == 1 && theProtocol == XMLURL::Unknown) { // Ahh, it's a drive letter, so ignore the context... context = urlString; } else { // It's a protocol... if (startsWith(context, theProtocolString) == true) { // They share the same protocol... // Strip off file name from context... if (indexOfSlash < theContextLength) { context = substring(context, 0, indexOfSlash + 1); } // OK, everything looks good, so strip off the protocol and colon... context += substring(urlString, theColonIndex + 1, theURLStringLength); } else { // OK, not the same protocol, so what can we do??? context = urlString; } } } return getURLFromString(context); } XalanDOMString& URISupport::NormalizeURIText(XalanDOMString& uriString) { #if !defined(XALAN_NO_NAMESPACES) using std::vector; using std::replace; #endif // OK, look for a quick, cheap exit... const unsigned int len = length(uriString); const unsigned int index = indexOf(uriString, '\\'); if (index != len) { // Start replacing at the index point, since that's the // first one... replace(toCharArray(uriString) + index, toCharArray(uriString) + len, '\\', '/'); } return uriString; } URISupport::InvalidURIException::InvalidURIException(const XalanDOMString& theMessage) : XSLException(theMessage, XALAN_STATIC_UCODE_STRING("InvalidURIException")) { } URISupport::InvalidURIException::~InvalidURIException() { } 1.1 xml-xalan/c/src/PlatformSupport/URISupport.hpp Index: URISupport.hpp =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2000 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xalan" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.ibm.com. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ #if !defined(URISUPPORT_HEADER_GUARD_1357924680) #define URISUPPORT_HEADER_GUARD_1357924680 // Base include file. Must be first. #include <PlatformSupport/PlatformSupportDefinitions.hpp> #include <memory> #include <util/XMLURL.hpp> #include <XalanDOM/XalanDOMString.hpp> #include <PlatformSupport/XSLException.hpp> class XALAN_PLATFORMSUPPORT_EXPORT URISupport { public: #if defined(XALAN_NO_NAMESPACES) typedef auto_ptr<XMLURL> URLAutoPtrType; #else typedef std::auto_ptr<XMLURL> URLAutoPtrType; #endif /** * Determine the fully qualified URI for a string. * * @param urlString string to qualify * @return auto pointer to fully qualified URI */ static URLAutoPtrType getURLFromString(const XalanDOMString& urlString); /** * Determine the fully qualified URI for a string. * * @param urlString string to qualify * @param base base location for URI * @return auto pointer to fully qualified URI */ static URLAutoPtrType getURLFromString( const XalanDOMString& urlString, const XalanDOMString& base); /** * Normalizes the string passed in, replacing * \ with /. * * @param urlString string to qualify * @return a reference to the passed parameter */ static XalanDOMString& NormalizeURIText(XalanDOMString& uriString); class InvalidURIException : public XSLException { public: /** * Construct an InvalidURIException. * * @param theMessage the error message */ InvalidURIException(const XalanDOMString& theMessage); virtual ~InvalidURIException(); }; }; #endif // URISUPPORT_HEADER_GUARD_1357924680
