You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@locus.apache.org on 2000/05/12 20:18:17 UTC

cvs commit: xml-xalan/c/src/PlatformSupport URISupport.cpp URISupport.hpp

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 apache@apache.org.
   *
   * 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 apache@apache.org.
   *
   * 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