?? domconfigurationimpl.cpp
字號:
/* * 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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -