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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  *
  5.  * Copyright (c) 2003 The Apache Software Foundation.  All rights
  6.  * reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  *
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  *
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  *
  20.  * 3. The end-user documentation included with the redistribution,
  21.  *    if any, must include the following acknowledgment:
  22.  *       "This product includes software developed by the
  23.  *        Apache Software Foundation (http://www.apache.org/)."
  24.  *    Alternately, this acknowledgment may appear in the software itself,
  25.  *    if and wherever such third-party acknowledgments normally appear.
  26.  *
  27.  * 4. The names "Xerces" and "Apache Software Foundation" must
  28.  *    not be used to endorse or promote products derived from this
  29.  *    software without prior written permission. For written
  30.  *    permission, please contact apache@apache.org.
  31.  *
  32.  * 5. Products derived from this software may not be called "Apache",
  33.  *    nor may "Apache" appear in their name, without prior written
  34.  *    permission of the Apache Software Foundation.
  35.  *
  36.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  37.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  38.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  39.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  40.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  41.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  42.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  43.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  44.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  45.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  46.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  47.  * SUCH DAMAGE.
  48.  * ====================================================================
  49.  *
  50.  * This software consists of voluntary contributions made by many
  51.  * individuals on behalf of the Apache Software Foundation and was
  52.  * originally based on software copyright (c) 2001, International
  53.  * Business Machines, Inc., http://www.apache.org.  For more
  54.  * information on the Apache Software Foundation, please see
  55.  * <http://www.apache.org/>.
  56.  */
  57. #include "DOMConfigurationImpl.hpp"
  58. #include <xercesc/dom/DOMErrorHandler.hpp>
  59. #include <xercesc/util/XMLString.hpp>
  60. #include <xercesc/util/XMLUniDefs.hpp>
  61. #include <xercesc/dom/DOMException.hpp>
  62. XERCES_CPP_NAMESPACE_BEGIN
  63. /* canonical-form */
  64. const XMLCh DOMConfigurationImpl::fgCANONICAL_FORM[] = { chLatin_c, chLatin_a, chLatin_n, chLatin_o, chLatin_n, chLatin_i, chLatin_c, chLatin_a, chLatin_l, chDash, chLatin_f, chLatin_o, chLatin_r, chLatin_m, chNull };
  65. /* cdata-sections */
  66. const XMLCh DOMConfigurationImpl::fgCDATA_SECTIONS[] = { chLatin_c, chLatin_d, chLatin_a, chLatin_t, chLatin_a, chDash, chLatin_s, chLatin_e, chLatin_c, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chLatin_s, chNull };
  67. /* comments */
  68. const XMLCh DOMConfigurationImpl::fgCOMMENTS[] = { chLatin_c, chLatin_o, chLatin_m, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chLatin_s, chNull };
  69. /* datatype-normalization */
  70. const XMLCh DOMConfigurationImpl::fgDATATYPE_NORMALIZATION[] = { chLatin_d, chLatin_a, chLatin_t, chLatin_a, chLatin_t, chLatin_y, chLatin_p, chLatin_e, chDash, chLatin_n, chLatin_o, chLatin_r, chLatin_m, chLatin_a, chLatin_l, chLatin_i, chLatin_z, chLatin_a, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chNull };
  71. /* discard-default-content */
  72. const XMLCh DOMConfigurationImpl::fgDISCARD_DEFAULT_CONTENT[] = { chLatin_d, chLatin_i, chLatin_s, chLatin_c, chLatin_a, chLatin_r, chLatin_d, chDash, chLatin_d, chLatin_e, chLatin_f, chLatin_a, chLatin_u, chLatin_l, chLatin_t, chDash, chLatin_c, chLatin_o, chLatin_n, chLatin_t, chLatin_e, chLatin_n, chLatin_t, chNull };
  73. /* entities */
  74. const XMLCh DOMConfigurationImpl::fgENTITIES[] = { chLatin_e, chLatin_n, chLatin_t, chLatin_i, chLatin_t, chLatin_i, chLatin_e, chLatin_s, chNull };
  75. /* infoset */
  76. const XMLCh DOMConfigurationImpl::fgINFOSET[] = { chLatin_i, chLatin_n, chLatin_f, chLatin_o, chLatin_s, chLatin_e, chLatin_t, chNull };
  77. /* namespaces */
  78. const XMLCh DOMConfigurationImpl::fgNAMESPACES[] = { chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chLatin_p, chLatin_a, chLatin_c, chLatin_e, chLatin_s, chNull };
  79. /* namespace-declarations */
  80. const XMLCh DOMConfigurationImpl::fgNAMESPACE_DECLARATIONS[] = { chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chLatin_p, chLatin_a, chLatin_c, chLatin_e, chDash, chLatin_d, chLatin_e, chLatin_c, chLatin_l, chLatin_a, chLatin_r, chLatin_a, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chLatin_s, chNull };
  81. /* normalize-characters */
  82. const XMLCh DOMConfigurationImpl::fgNORMALIZE_CHARACTERS[] = { chLatin_n, chLatin_o, chLatin_r, chLatin_m, chLatin_a, chLatin_l, chLatin_i, chLatin_z, chLatin_e, chDash, chLatin_c, chLatin_h, chLatin_a, chLatin_r, chLatin_a, chLatin_c, chLatin_t, chLatin_e, chLatin_r, chLatin_s, chNull };
  83. /* split-cdata-sections */
  84. const XMLCh DOMConfigurationImpl::fgSPLIT_CDATA_SECTIONS[] = { chLatin_s, chLatin_p, chLatin_l, chLatin_i, chLatin_t, chDash, chLatin_c, chLatin_d, chLatin_a, chLatin_t, chLatin_a, chDash, chLatin_s, chLatin_e, chLatin_c, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chLatin_s, chNull };
  85. /* validate */
  86. const XMLCh DOMConfigurationImpl::fgVALIDATE[] = { chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, chLatin_a, chLatin_t, chLatin_e, chNull };
  87. /* validate-if-schema */
  88. const XMLCh DOMConfigurationImpl::fgVALIDATE_IF_SCHEMA[] = { chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, chLatin_a, chLatin_t, chLatin_e, chDash, chLatin_i, chLatin_f, chDash, chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chNull };
  89. /* whitespace-in-element-content */
  90. const XMLCh DOMConfigurationImpl::fgWHITESPACE_IN_ELEMENT_CONTENT[] = { chLatin_w, chLatin_h, chLatin_i, chLatin_t, chLatin_e, chLatin_s, chLatin_p, chLatin_a, chLatin_c, chLatin_e, chDash, chLatin_i, chLatin_n, chDash, chLatin_e, chLatin_l, chLatin_e, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chDash, chLatin_c, chLatin_o, chLatin_n, chLatin_t, chLatin_e, chLatin_n, chLatin_t, chNull };
  91. /* error-handler */
  92. const XMLCh DOMConfigurationImpl::fgERROR_HANDLER[] = { chLatin_e, chLatin_r, chLatin_r, chLatin_o, chLatin_r, chDash, chLatin_h, chLatin_a, chLatin_n, chLatin_d, chLatin_l, chLatin_e, chLatin_r, chNull };
  93. /* schema-type */
  94. const XMLCh DOMConfigurationImpl::fgSCHEMA_TYPE[] = { chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chDash, chLatin_t, chLatin_y, chLatin_p, chLatin_e, chNull };
  95. /* schema-location */
  96. const XMLCh DOMConfigurationImpl::fgSCHEMA_LOCATION[] = { chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chDash, chLatin_l, chLatin_o, chLatin_c, chLatin_a, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chNull };
  97. const unsigned short DOMConfigurationImpl::fDEFAULT_VALUES = 0x2596;
  98. DOMConfigurationImpl::DOMConfigurationImpl(): featureValues(fDEFAULT_VALUES), fTrue(new bool(true)), 
  99.                                               fFalse(new bool(false)),
  100.                                               fErrorHandler(0), fSchemaType(0), fSchemaLocation(0) {
  101. }
  102. DOMConfigurationImpl::~DOMConfigurationImpl() {
  103.     delete (bool*)fTrue;
  104.     delete (bool*)fFalse;
  105. }
  106.                                         
  107. void DOMConfigurationImpl::setParameter(const XMLCh* name, const void* value) {
  108.     XMLCh* lowerCaseName = XMLString::replicate(name);
  109.     XMLString::lowerCase(lowerCaseName);
  110.     if(!canSetParameter(lowerCaseName, value)) {
  111.         throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
  112.     }
  113.     bool isBooleanParameter = true;
  114.     DOMConfigurationFeature whichFlag;
  115.     try {
  116.         whichFlag = getFeatureFlag(lowerCaseName);
  117.     } catch(DOMException e) {
  118.         // must not be a boolean parameter
  119.         isBooleanParameter = false;
  120.     }
  121.     if(isBooleanParameter) {
  122.         if(*((bool*)value)) {
  123.             featureValues |= whichFlag;
  124.         } else {
  125.             featureValues &= ~whichFlag;
  126.         }
  127.     } else {
  128.         if(XMLString::equals(lowerCaseName, fgERROR_HANDLER)) {
  129.             fErrorHandler = (DOMErrorHandler*)value;
  130.         } else if (XMLString::equals(lowerCaseName, fgSCHEMA_TYPE)) {
  131.             fSchemaType = (XMLCh*)value;
  132.         } else if (XMLString::equals(lowerCaseName, fgSCHEMA_LOCATION)) {
  133.             fSchemaLocation = (XMLCh*)value;
  134.         } else {  // canSetParameter above should take care of this case
  135.             throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  136.         }
  137.     }
  138. }
  139. // --------------------------------------
  140. // Getter Methods
  141. // --------------------------------------
  142. const void* DOMConfigurationImpl::getParameter(const XMLCh* name) const {
  143.     XMLCh* lowerCaseName = XMLString::replicate(name);
  144.     XMLString::lowerCase(lowerCaseName);
  145.     bool isBooleanParameter = true;
  146.     DOMConfigurationFeature whichFlag;
  147.     try {
  148.         whichFlag = getFeatureFlag(lowerCaseName);
  149.     } catch (DOMException e) {
  150.         // must not be a boolean parameter
  151.         isBooleanParameter = false;
  152.     }
  153.     if(isBooleanParameter){
  154.         if(featureValues & whichFlag) {
  155.             return fTrue;
  156.         } else {
  157.             return fFalse;
  158.         }
  159.     } else {
  160.         if(XMLString::equals(lowerCaseName, fgERROR_HANDLER)) {
  161.             return fErrorHandler;
  162.         } else if (XMLString::equals(lowerCaseName, fgSCHEMA_TYPE)) {
  163.             return fSchemaType;
  164.         } else if (XMLString::equals(lowerCaseName, fgSCHEMA_LOCATION)) {
  165.             return fSchemaLocation;
  166.         } else {
  167.             throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  168.         }
  169.     }
  170. }
  171. // -----------------------------------------
  172. // Query Methods
  173. // -----------------------------------------
  174. bool DOMConfigurationImpl::canSetParameter(const XMLCh* name, const void* value) const {
  175.     /**
  176.      * canSetParameter(name, value) returns false in two conditions:
  177.      *  1) if a [required] feature has no supporting code, then return false in 
  178.      *     both the true and false outcomes (This is in order to be either fully 
  179.      *     spec compliant, or not at all)
  180.      *  2) if an [optional] feature has no supporting code, then return false
  181.      **/ 
  182.     
  183.     // if value is null, return true
  184.     if(value == 0) return true;
  185.     XMLCh* lowerCaseName = XMLString::replicate(name);
  186.     XMLString::lowerCase(lowerCaseName);
  187.     
  188.     bool isBooleanParameter = true;
  189.     bool booleanValue = false;
  190.     DOMConfigurationFeature whichFlag;
  191.     try {
  192.         whichFlag = getFeatureFlag(lowerCaseName);
  193.         booleanValue = *((bool*)value);
  194.     } catch (DOMException e) {
  195.         // must not be a boolean parameter
  196.         isBooleanParameter = false;
  197.     }
  198.     
  199.     if(isBooleanParameter) {
  200.         switch (whichFlag) {
  201.             case FEATURE_CANONICAL_FORM: 
  202.                 if(booleanValue) return false;      // optional //
  203.                 else             return true;       // required // 
  204.             case FEATURE_CDATA_SECTIONS: 
  205.                 return true;
  206.             case FEATURE_COMMENTS:  
  207.                 return true;
  208.             case FEATURE_DATATYPE_NORMALIZATION:  
  209.                 if(booleanValue) return false;       // required //
  210.                 else             return true;        // required //
  211.             case FEATURE_DISCARD_DEFAULT_CONTENT:  
  212.                 if(booleanValue) return false;       // required //
  213.                 else             return true;        // required //
  214.             case FEATURE_ENTITIES:  
  215.                 if(booleanValue) return true;       // required //
  216.                 else             return true;       // required //
  217.             case FEATURE_INFOSET:  
  218.                 if(booleanValue) return false;       // required //
  219.                 else             return true;       // no effect//
  220.             case FEATURE_NAMESPACES:  
  221.                 return true;       
  222.             case FEATURE_NAMESPACE_DECLARATIONS:  
  223.                 if(booleanValue) return true;      // optional //
  224.                 else             return false;       // required //
  225.             case FEATURE_NORMALIZE_CHARACTERS:  
  226.                 if(booleanValue) return false;      // optional //
  227.                 else             return true;       // required //
  228.             case FEATURE_SPLIT_CDATA_SECTIONS:  
  229.                 //we dont report an error in the false case so we cant claim we do it
  230.                 if(booleanValue) return false;       // required //
  231.                 else             return false;       // required //
  232.             case FEATURE_VALIDATE:  
  233.                 if(booleanValue) return false;      // optional //
  234.                 else             return true;       // required //
  235.             case FEATURE_VALIDATE_IF_SCHEMA:  
  236.                 if(booleanValue) return false;      // optional //
  237.                 else             return true;       // required //
  238.               
  239.             case FEATURE_WHITESPACE_IN_ELEMENT_CONTENT:  
  240.                 if(booleanValue) return true;       // required //
  241.                 else             return false;      // optional //
  242.             default: return false; // should never be here
  243.         }
  244.     } else {
  245.         if(XMLString::equals(lowerCaseName, fgERROR_HANDLER)) {
  246.             return true;                               // required //
  247.         } else if (XMLString::equals(lowerCaseName, fgSCHEMA_TYPE)) {
  248.             return false;                            // optional //
  249.         } else if (XMLString::equals(lowerCaseName, fgSCHEMA_LOCATION)) {
  250.             return false;                            // optional //
  251.         } 
  252.     }
  253.     return false;
  254. }
  255. // -------------------------------------------
  256. // Impl methods
  257. // -------------------------------------------
  258. DOMConfigurationImpl::DOMConfigurationFeature DOMConfigurationImpl::getFeatureFlag(const XMLCh* name) const {
  259.     XMLCh* lowerCaseName = XMLString::replicate(name);
  260.     XMLString::lowerCase(lowerCaseName);
  261.   
  262.     if(XMLString::equals(lowerCaseName, fgCANONICAL_FORM)) {
  263.         return FEATURE_CANONICAL_FORM;
  264.     } else if (XMLString::equals(lowerCaseName, fgCDATA_SECTIONS )) {
  265.         return FEATURE_CDATA_SECTIONS;
  266.     } else if (XMLString::equals(lowerCaseName, fgCOMMENTS)) {
  267.         return FEATURE_COMMENTS;
  268.     } else if (XMLString::equals(lowerCaseName, fgDATATYPE_NORMALIZATION))  {
  269.         return FEATURE_DATATYPE_NORMALIZATION;
  270.     } else if (XMLString::equals(lowerCaseName, fgDISCARD_DEFAULT_CONTENT)) {
  271.         return FEATURE_DISCARD_DEFAULT_CONTENT;
  272.     } else if (XMLString::equals(lowerCaseName, fgENTITIES)) {
  273.         return FEATURE_ENTITIES;
  274.     } else if (XMLString::equals(lowerCaseName, fgINFOSET))  {
  275.         return FEATURE_INFOSET;
  276.     } else if (XMLString::equals(lowerCaseName, fgNAMESPACES)) {
  277.         return FEATURE_NAMESPACES;
  278.     } else if (XMLString::equals(lowerCaseName, fgNAMESPACE_DECLARATIONS)) {
  279.         return FEATURE_NAMESPACE_DECLARATIONS;
  280.     } else if (XMLString::equals(lowerCaseName, fgNORMALIZE_CHARACTERS)) {
  281.         return FEATURE_NORMALIZE_CHARACTERS;
  282.     } else if (XMLString::equals(lowerCaseName, fgSPLIT_CDATA_SECTIONS)) {
  283.         return FEATURE_SPLIT_CDATA_SECTIONS;
  284.     } else if (XMLString::equals(lowerCaseName, fgVALIDATE)) {
  285.         return FEATURE_VALIDATE;
  286.     } else if (XMLString::equals(lowerCaseName, fgVALIDATE_IF_SCHEMA)) {
  287.         return FEATURE_VALIDATE_IF_SCHEMA;
  288.     } else if (XMLString::equals(lowerCaseName, fgWHITESPACE_IN_ELEMENT_CONTENT)) {
  289.         return FEATURE_WHITESPACE_IN_ELEMENT_CONTENT;
  290.     } else {
  291.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  292.     }
  293.         
  294. }
  295. DOMErrorHandler* DOMConfigurationImpl::getErrorHandler() const {
  296.     return fErrorHandler;
  297. }
  298. const XMLCh* DOMConfigurationImpl::getSchemaType() const {
  299.     return fSchemaType;
  300. }
  301. const XMLCh* DOMConfigurationImpl::getSchemaLocation() const {
  302.     return fSchemaLocation;
  303. }
  304. void DOMConfigurationImpl::setErrorHandler(DOMErrorHandler *erHandler) {
  305.     fErrorHandler = erHandler;
  306. }
  307. void DOMConfigurationImpl::setSchemaType(const XMLCh* st) {
  308.     fSchemaType = st;
  309. }
  310. void DOMConfigurationImpl::setSchemaLocation(const XMLCh* sl) {
  311.     fSchemaLocation = sl;
  312. }
  313. XERCES_CPP_NAMESPACE_END
  314. /**
  315.  * End of file DOMConfigurationImpl.cpp
  316.  */