domconfigurationimpl.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 336 行

CPP
336
字号
/* * Copyright 2003,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include "DOMConfigurationImpl.hpp"#include <xercesc/dom/DOMErrorHandler.hpp>#include <xercesc/util/XMLString.hpp>#include <xercesc/util/XMLUniDefs.hpp>#include <xercesc/dom/DOMException.hpp>#include <xercesc/util/Janitor.hpp>XERCES_CPP_NAMESPACE_BEGINconst bool DOMConfigurationImpl::fFalse = false;const bool DOMConfigurationImpl::fTrue = true;/* canonical-form */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 };/* cdata-sections */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 };/* comments */const XMLCh DOMConfigurationImpl::fgCOMMENTS[] = { chLatin_c, chLatin_o, chLatin_m, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chLatin_s, chNull };/* datatype-normalization */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 };/* discard-default-content */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 };/* entities */const XMLCh DOMConfigurationImpl::fgENTITIES[] = { chLatin_e, chLatin_n, chLatin_t, chLatin_i, chLatin_t, chLatin_i, chLatin_e, chLatin_s, chNull };/* infoset */const XMLCh DOMConfigurationImpl::fgINFOSET[] = { chLatin_i, chLatin_n, chLatin_f, chLatin_o, chLatin_s, chLatin_e, chLatin_t, chNull };/* namespaces */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 };/* namespace-declarations */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 };/* normalize-characters */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 };/* split-cdata-sections */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 };/* validate */const XMLCh DOMConfigurationImpl::fgVALIDATE[] = { chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, chLatin_a, chLatin_t, chLatin_e, chNull };/* validate-if-schema */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 };/* whitespace-in-element-content */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 };/* error-handler */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 };/* schema-type */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 };/* schema-location */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 };const unsigned short DOMConfigurationImpl::fDEFAULT_VALUES = 0x2596;DOMConfigurationImpl::DOMConfigurationImpl(MemoryManager* const manager): featureValues(fDEFAULT_VALUES),                                              fErrorHandler(0), fSchemaType(0), fSchemaLocation(0), fMemoryManager(manager) {}DOMConfigurationImpl::~DOMConfigurationImpl() {}                                        void DOMConfigurationImpl::setParameter(const XMLCh* name, const void* value) {    XMLCh* lowerCaseName = XMLString::replicate(name, fMemoryManager);    ArrayJanitor<XMLCh> janName(lowerCaseName, fMemoryManager);    XMLString::lowerCase(lowerCaseName);    if(!canSetParameter(lowerCaseName, value)) {        throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, fMemoryManager);    }    bool isBooleanParameter = true;    DOMConfigurationFeature whichFlag;    try {        whichFlag = getFeatureFlag(lowerCaseName);    } catch(DOMException e) {        // must not be a boolean parameter        isBooleanParameter = false;    }    if(isBooleanParameter) {        if(*((bool*)value)) {            featureValues |= whichFlag;        } else {            featureValues &= ~whichFlag;        }    } else {        if(XMLString::equals(lowerCaseName, fgERROR_HANDLER)) {            fErrorHandler = (DOMErrorHandler*)value;        } else if (XMLString::equals(lowerCaseName, fgSCHEMA_TYPE)) {            fSchemaType = (XMLCh*)value;        } else if (XMLString::equals(lowerCaseName, fgSCHEMA_LOCATION)) {            fSchemaLocation = (XMLCh*)value;        } else {  // canSetParameter above should take care of this case            throw DOMException(DOMException::NOT_FOUND_ERR, 0, fMemoryManager);        }    }}// --------------------------------------// Getter Methods// --------------------------------------const void* DOMConfigurationImpl::getParameter(const XMLCh* name) const {    XMLCh* lowerCaseName = XMLString::replicate(name, fMemoryManager);    ArrayJanitor<XMLCh> janName(lowerCaseName, fMemoryManager);    XMLString::lowerCase(lowerCaseName);    bool isBooleanParameter = true;    DOMConfigurationFeature whichFlag;    try {        whichFlag = getFeatureFlag(lowerCaseName);    } catch (DOMException e) {        // must not be a boolean parameter        isBooleanParameter = false;    }    if(isBooleanParameter){        if(featureValues & whichFlag) {            return &fTrue;        } else {            return &fFalse;        }    } else {        if(XMLString::equals(lowerCaseName, fgERROR_HANDLER)) {            return fErrorHandler;        } else if (XMLString::equals(lowerCaseName, fgSCHEMA_TYPE)) {            return fSchemaType;        } else if (XMLString::equals(lowerCaseName, fgSCHEMA_LOCATION)) {            return fSchemaLocation;        } else {            throw DOMException(DOMException::NOT_FOUND_ERR, 0, fMemoryManager);        }    }}// -----------------------------------------// Query Methods// -----------------------------------------bool DOMConfigurationImpl::canSetParameter(const XMLCh* name, const void* value) const {    /**     * canSetParameter(name, value) returns false in two conditions:     *  1) if a [required] feature has no supporting code, then return false in      *     both the true and false outcomes (This is in order to be either fully      *     spec compliant, or not at all)     *  2) if an [optional] feature has no supporting code, then return false     **/         // if value is null, return true    if(value == 0) return true;    XMLCh* lowerCaseName = XMLString::replicate(name, fMemoryManager);    ArrayJanitor<XMLCh> janName(lowerCaseName, fMemoryManager);        XMLString::lowerCase(lowerCaseName);        bool isBooleanParameter = true;    bool booleanValue = false;    DOMConfigurationFeature whichFlag;    try {        whichFlag = getFeatureFlag(lowerCaseName);        booleanValue = *((bool*)value);    } catch (DOMException e) {        // must not be a boolean parameter        isBooleanParameter = false;    }        if(isBooleanParameter) {        switch (whichFlag) {            case FEATURE_CANONICAL_FORM:                 if(booleanValue) return false;      // optional //                else             return true;       // required //             case FEATURE_CDATA_SECTIONS:                 return true;            case FEATURE_COMMENTS:                  return true;            case FEATURE_DATATYPE_NORMALIZATION:                  if(booleanValue) return false;       // required //                else             return true;        // required //            case FEATURE_DISCARD_DEFAULT_CONTENT:                  if(booleanValue) return false;       // required //                else             return true;        // required //            case FEATURE_ENTITIES:                  if(booleanValue) return true;       // required //                else             return true;       // required //            case FEATURE_INFOSET:                  if(booleanValue) return false;       // required //                else             return true;       // no effect//            case FEATURE_NAMESPACES:                  return true;                   case FEATURE_NAMESPACE_DECLARATIONS:                  if(booleanValue) return true;      // optional //                else             return false;       // required //            case FEATURE_NORMALIZE_CHARACTERS:                  if(booleanValue) return false;      // optional //                else             return true;       // required //            case FEATURE_SPLIT_CDATA_SECTIONS:                  //we dont report an error in the false case so we cant claim we do it                if(booleanValue) return false;       // required //                else             return false;       // required //            case FEATURE_VALIDATE:                  if(booleanValue) return false;      // optional //                else             return true;       // required //            case FEATURE_VALIDATE_IF_SCHEMA:                  if(booleanValue) return false;      // optional //                else             return true;       // required //                          case FEATURE_WHITESPACE_IN_ELEMENT_CONTENT:                  if(booleanValue) return true;       // required //                else             return false;      // optional //            default: return false; // should never be here        }    } else {        if(XMLString::equals(lowerCaseName, fgERROR_HANDLER)) {            return true;                               // required //        } else if (XMLString::equals(lowerCaseName, fgSCHEMA_TYPE)) {            return false;                            // optional //        } else if (XMLString::equals(lowerCaseName, fgSCHEMA_LOCATION)) {            return false;                            // optional //        }     }    return false;}// -------------------------------------------// Impl methods// -------------------------------------------DOMConfigurationImpl::DOMConfigurationFeature DOMConfigurationImpl::getFeatureFlag(const XMLCh* name) const {    XMLCh* lowerCaseName = XMLString::replicate(name, fMemoryManager);    ArrayJanitor<XMLCh> janName(lowerCaseName, fMemoryManager);        XMLString::lowerCase(lowerCaseName);      if(XMLString::equals(lowerCaseName, fgCANONICAL_FORM)) {        return FEATURE_CANONICAL_FORM;    } else if (XMLString::equals(lowerCaseName, fgCDATA_SECTIONS )) {        return FEATURE_CDATA_SECTIONS;    } else if (XMLString::equals(lowerCaseName, fgCOMMENTS)) {        return FEATURE_COMMENTS;    } else if (XMLString::equals(lowerCaseName, fgDATATYPE_NORMALIZATION))  {        return FEATURE_DATATYPE_NORMALIZATION;    } else if (XMLString::equals(lowerCaseName, fgDISCARD_DEFAULT_CONTENT)) {        return FEATURE_DISCARD_DEFAULT_CONTENT;    } else if (XMLString::equals(lowerCaseName, fgENTITIES)) {        return FEATURE_ENTITIES;    } else if (XMLString::equals(lowerCaseName, fgINFOSET))  {        return FEATURE_INFOSET;    } else if (XMLString::equals(lowerCaseName, fgNAMESPACES)) {        return FEATURE_NAMESPACES;    } else if (XMLString::equals(lowerCaseName, fgNAMESPACE_DECLARATIONS)) {        return FEATURE_NAMESPACE_DECLARATIONS;    } else if (XMLString::equals(lowerCaseName, fgNORMALIZE_CHARACTERS)) {        return FEATURE_NORMALIZE_CHARACTERS;    } else if (XMLString::equals(lowerCaseName, fgSPLIT_CDATA_SECTIONS)) {        return FEATURE_SPLIT_CDATA_SECTIONS;    } else if (XMLString::equals(lowerCaseName, fgVALIDATE)) {        return FEATURE_VALIDATE;    } else if (XMLString::equals(lowerCaseName, fgVALIDATE_IF_SCHEMA)) {        return FEATURE_VALIDATE_IF_SCHEMA;    } else if (XMLString::equals(lowerCaseName, fgWHITESPACE_IN_ELEMENT_CONTENT)) {        return FEATURE_WHITESPACE_IN_ELEMENT_CONTENT;    } else {        throw DOMException(DOMException::NOT_FOUND_ERR, 0, fMemoryManager);    }        }DOMErrorHandler* DOMConfigurationImpl::getErrorHandler() const {    return fErrorHandler;}const XMLCh* DOMConfigurationImpl::getSchemaType() const {    return fSchemaType;}const XMLCh* DOMConfigurationImpl::getSchemaLocation() const {    return fSchemaLocation;}void DOMConfigurationImpl::setErrorHandler(DOMErrorHandler *erHandler) {    fErrorHandler = erHandler;}void DOMConfigurationImpl::setSchemaType(const XMLCh* st) {    fSchemaType = st;}void DOMConfigurationImpl::setSchemaLocation(const XMLCh* sl) {    fSchemaLocation = sl;}XERCES_CPP_NAMESPACE_END/** * End of file DOMConfigurationImpl.cpp */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?