/* * 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 #include #include #include #include XERCES_CPP_NAMESPACE_BEGIN const 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 janName(lowerCaseName, fMemoryManager); XMLString::lowerCaseASCII(lowerCaseName); if(!canSetParameter(lowerCaseName, value)) { throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, fMemoryManager); } DOMConfigurationFeature whichFlag; try { whichFlag = getFeatureFlag(lowerCaseName); if(*((bool*)value)) { featureValues |= whichFlag; } else { featureValues &= ~whichFlag; } } catch(DOMException&) { // must not be a boolean parameter 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 janName(lowerCaseName, fMemoryManager); XMLString::lowerCaseASCII(lowerCaseName); DOMConfigurationFeature whichFlag; try { whichFlag = getFeatureFlag(lowerCaseName); if(featureValues & whichFlag) { return &fTrue; } else { return &fFalse; } } catch (DOMException&) { // must not be a boolean parameter 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 janName(lowerCaseName, fMemoryManager); XMLString::lowerCaseASCII(lowerCaseName); DOMConfigurationFeature whichFlag; try { whichFlag = getFeatureFlag(lowerCaseName); bool booleanValue = *((bool*)value); 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 } } catch (DOMException&) { // must not be a boolean parameter 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 janName(lowerCaseName, fMemoryManager); XMLString::lowerCaseASCII(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 */