LocalFileInputSource.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:9k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. // ---------------------------------------------------------------------------
  57. //  Includes
  58. // ---------------------------------------------------------------------------
  59. #include <xercesc/framework/LocalFileInputSource.hpp>
  60. #include <xercesc/util/BinFileInputStream.hpp>
  61. #include <xercesc/util/PlatformUtils.hpp>
  62. #include <xercesc/util/XMLString.hpp>
  63. #include <xercesc/util/XMLUniDefs.hpp>
  64. XERCES_CPP_NAMESPACE_BEGIN
  65. /***
  66.  *
  67.  * Originated by Chris larsson
  68.  *
  69.  * Issue:
  70.  *
  71.  * There is an inconsistency in URI resolution in the case where the file itself is a 
  72.  * symbolic link to another path (or the path has path segment which is a symbolic
  73.  * link to another path). So, is the base path the directory where the symbolic link resides 
  74.  * or the directory where the real file resides? I'm sure one could argue either way, 
  75.  * but I think that having the base path be the directory where the symbolic link resides 
  76.  * is more intuitive. 
  77.  *
  78.  * Defining it this way would then make the behavior consistent with using an absolute 
  79.  * path as well as with the java behavior. 
  80.  *
  81.  * Proposal:
  82.  *
  83.  * The URI is resolved within the parser code, and is somewhat independant of the OS. 
  84.  * 
  85.  * A relative path is resolved by querying the current directory and appending the 
  86.  * relative part onto the returned current directory string to obtain the base URI. 
  87.  * An absolute path is simply used as the base URI. 
  88.  * Then remove all "./" and "../" path segments using an algorithm like weavepath to obtain 
  89.  * the resolved base URI. 
  90.  *
  91.  * When you need to access another file such as a dtd, use the resolved base URI and add on
  92.  * the relative URI of the dtd file. Then resolve it using the same weavepath algorithm. 
  93.  *
  94.  * Note:
  95.  *
  96.  *   Java parser behaves differently for a path containning symbolic path segment. When 
  97.  *   it is given an absolute path, it can locate the primary instance document, while given 
  98.  *   relative path, it might not.
  99.  *
  100.  *   It is because Java parser uses URI solution where "/segment/../" is required to be removed
  101.  *   from the resultant path if a relative URI is merged to a baseURI. While this is NOT required
  102.  *   for an absolute URI. 
  103.  *   
  104.  *   So if a path segment, which is symbolic link, happen to be followed by the '/../', it is 
  105.  *   NOT removed from the path if it is given in absolute form, and the underlying file system 
  106.  *   will locate the file, if in relative form, that symbolic link path segment together with 
  107.  *   '../' is removed from the resultant path, and the file system may NOT be able to locate 
  108.  *   the file, if there is a one, it is definitely not the one expected, in fact by accident.
  109.  *
  110.  *   Therefore, to keep consistent with Java parser, for now, we do not apply removeDotDotSlash()
  111.  *   for absolute path.
  112.  *  
  113.  ***/
  114. // ---------------------------------------------------------------------------
  115. //  LocalFileInputSource: Constructors and Destructor
  116. // ---------------------------------------------------------------------------
  117. LocalFileInputSource::LocalFileInputSource( const XMLCh* const basePath
  118.                                           , const XMLCh* const relativePath
  119.                                           , MemoryManager* const manager)
  120.     : InputSource(manager)
  121. {
  122.     //
  123.     //  If the relative part is really relative, then weave it together
  124.     //  with the base path. If not, just take the relative path as the
  125.     //  entire path.
  126.     //
  127.     if (XMLPlatformUtils::isRelative(relativePath))
  128.     {
  129.         XMLCh* tmpBuf = XMLPlatformUtils::weavePaths(basePath, relativePath);
  130.         setSystemId(tmpBuf);
  131.         XMLPlatformUtils::fgMemoryManager->deallocate(tmpBuf); //delete [] tmpBuf;
  132.     }
  133.     else
  134.     {
  135.         XMLCh* tmpBuf = XMLString::replicate(relativePath, getMemoryManager());
  136.         XMLPlatformUtils::removeDotSlash(tmpBuf);
  137.         setSystemId(tmpBuf);
  138.         getMemoryManager()->deallocate(tmpBuf);//delete [] tmpBuf;
  139.     }
  140. }
  141. LocalFileInputSource::LocalFileInputSource(const XMLCh* const filePath,
  142.                                            MemoryManager* const manager)
  143.     : InputSource(manager)
  144. {
  145.     //
  146.     //  If the path is relative, then complete it acording to the current
  147.     //  working directory rules of the current platform. Else, just take
  148.     //  it as is.
  149.     //
  150.     if (XMLPlatformUtils::isRelative(filePath))
  151.     {
  152.         XMLCh* curDir = XMLPlatformUtils::getCurrentDirectory(getMemoryManager());
  153.         int    curDirLen = XMLString::stringLen(curDir);
  154.         int    filePathLen = XMLString::stringLen(filePath);
  155.         XMLCh* fullDir = (XMLCh*) getMemoryManager()->allocate
  156.         (
  157.             (curDirLen + filePathLen + 2) * sizeof(XMLCh)
  158.         );//new XMLCh [ curDirLen + filePathLen + 2];
  159.         XMLString::copyString(fullDir, curDir);
  160.         fullDir[curDirLen] = chForwardSlash;
  161.         XMLString::copyString(&fullDir[curDirLen+1], filePath);
  162.         
  163.         XMLPlatformUtils::removeDotSlash(fullDir);
  164.         XMLPlatformUtils::removeDotDotSlash(fullDir);
  165.         setSystemId(fullDir);
  166.         getMemoryManager()->deallocate(curDir);//delete [] curDir;
  167.         getMemoryManager()->deallocate(fullDir);//delete [] fullDir;
  168.     }
  169.      else
  170.     {
  171.         XMLCh* tmpBuf = XMLString::replicate(filePath, getMemoryManager());
  172.         XMLPlatformUtils::removeDotSlash(tmpBuf);
  173.         setSystemId(tmpBuf);
  174.         getMemoryManager()->deallocate(tmpBuf);//delete [] tmpBuf;
  175.     }
  176. }
  177. LocalFileInputSource::~LocalFileInputSource()
  178. {
  179. }
  180. // ---------------------------------------------------------------------------
  181. //  LocalFileInputSource: InputSource interface implementation
  182. // ---------------------------------------------------------------------------
  183. BinInputStream* LocalFileInputSource::makeStream() const
  184. {
  185.     BinFileInputStream* retStrm = new (getMemoryManager()) BinFileInputStream(getSystemId());
  186.     if (!retStrm->getIsOpen())
  187.     {
  188.         delete retStrm;
  189.         return 0;
  190.     }
  191.     return retStrm;
  192. }
  193. XERCES_CPP_NAMESPACE_END