domimplementationimpl.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 323 行
CPP
323 行
/* * Copyright 2001-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. *//* * $Id: DOMImplementationImpl.cpp,v 1.26 2004/09/08 13:55:51 peiyongz Exp $ */#include "DOMImplementationImpl.hpp"#include "DOMDocumentImpl.hpp"#include "DOMDocumentTypeImpl.hpp"#include "DOMWriterImpl.hpp"#include <xercesc/dom/DOMDocument.hpp>#include <xercesc/dom/DOMDocumentType.hpp>#include <xercesc/dom/DOMException.hpp>#include <xercesc/util/PlatformUtils.hpp>#include <xercesc/util/XMLUniDefs.hpp>#include <xercesc/util/XMLChar.hpp>#include <xercesc/util/XMLRegisterCleanup.hpp>#include <xercesc/util/XMLStringTokenizer.hpp>#include <xercesc/util/XMLDOMMsg.hpp>#include <xercesc/util/XMLMsgLoader.hpp>#include <xercesc/parsers/DOMBuilderImpl.hpp>XERCES_CPP_NAMESPACE_BEGIN// ------------------------------------------------------------//// Static constants. These are lazily initialized on first usage.// (Static constructors can not be safely used because// of order of initialization dependencies.)// ------------------------------------------------------------static const XMLCh g1_0[] = // Points to "1.0" {chDigit_1, chPeriod, chDigit_0, chNull};static const XMLCh g2_0[] = // Points to "2.0" {chDigit_2, chPeriod, chDigit_0, chNull};static const XMLCh g3_0[] = // Points to "3.0" {chDigit_3, chPeriod, chDigit_0, chNull};static const XMLCh gTrav[] = // Points to "Traversal" {chLatin_T, chLatin_r, chLatin_a, chLatin_v, chLatin_e, chLatin_r, chLatin_s, chLatin_a, chLatin_l, chNull};static const XMLCh gCore[] = // Points to "Core" {chLatin_C, chLatin_o, chLatin_r, chLatin_e, chNull};static const XMLCh gRange[] = // Points to "Range" {chLatin_R, chLatin_a, chLatin_n, chLatin_g, chLatin_e, chNull};static const XMLCh gLS[] = // Points to "LS" {chLatin_L, chLatin_S, chNull};// -----------------------------------------------------------------------// Message Loader for DOM// -----------------------------------------------------------------------static XMLMsgLoader *sMsgLoader4DOM = 0; // Points to the singleton instancestatic XMLMutex *sMutex4DOM = 0;static XMLRegisterCleanup mutex4DOMCleanup;static XMLRegisterCleanup msgLoader4DOMCleanup;static void reinitMsgLoader4DOM(){ delete sMsgLoader4DOM; sMsgLoader4DOM = 0;}static void reinitMutex4DOM(){ delete sMutex4DOM; sMutex4DOM = 0;}static XMLMutex& getMutex4DOM(){ if (!sMutex4DOM) { XMLMutexLock lock(XMLPlatformUtils::fgAtomicMutex); // If we got here first, then register it and set the registered flag if (!sMutex4DOM) { sMutex4DOM = new XMLMutex; mutex4DOMCleanup.registerCleanup(reinitMutex4DOM); } } return *sMutex4DOM;}XMLMsgLoader* DOMImplementationImpl::getMsgLoader4DOM(){ if (!sMsgLoader4DOM) { XMLMutexLock lock(&getMutex4DOM()); if (!sMsgLoader4DOM) { sMsgLoader4DOM = XMLPlatformUtils::loadMsgSet(XMLUni::fgXMLDOMMsgDomain); if (!sMsgLoader4DOM) XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain); else msgLoader4DOMCleanup.registerCleanup(reinitMsgLoader4DOM); } } return sMsgLoader4DOM;}// -----------------------------------------------------------------------// Singleton DOMImplementationImpl// -----------------------------------------------------------------------static DOMImplementationImpl *gDomimp = 0; // Points to the singleton instance // of DOMImplementation that is returnedreturned // by any call to getImplementation().static XMLRegisterCleanup implementationCleanup;static void reinitImplementation(){ delete gDomimp; gDomimp = 0;}// getImplementation() - Always returns the same singleton instance, which// is lazily created on the first call. Note that// DOM_Implementation must be thread-safe because// it is common to all DOM documents, and while a single// document is not thread-safe within itself, we do// promise that different documents can safely be// used concurrently by different threads.//DOMImplementationImpl *DOMImplementationImpl::getDOMImplementationImpl(){ if (!gDomimp) { XMLMutexLock lock(&getMutex4DOM()); if (!gDomimp) { gDomimp = new DOMImplementationImpl; implementationCleanup.registerCleanup(reinitImplementation); } } return gDomimp;}// ------------------------------------------------------------// DOMImplementation Virtual interface// ------------------------------------------------------------bool DOMImplementationImpl::hasFeature(const XMLCh * feature, const XMLCh * version) const{ if (!feature) return false; bool anyVersion = (version == 0 || !*version); bool version1_0 = XMLString::equals(version, g1_0); bool version2_0 = XMLString::equals(version, g2_0); bool version3_0 = XMLString::equals(version, g3_0); // Currently, we support only XML Level 1 version 1.0 if (XMLString::compareIString(feature, XMLUni::fgXMLString) == 0 && (anyVersion || version1_0 || version2_0)) return true; if (XMLString::compareIString(feature, gCore) == 0 && (anyVersion || version1_0 || version2_0 || version3_0)) return true; if (XMLString::compareIString(feature, gTrav) == 0 && (anyVersion || version2_0)) return true; if (XMLString::compareIString(feature, gRange) == 0 && (anyVersion || version2_0)) return true; if (XMLString::compareIString(feature, gLS) == 0 && (anyVersion || version3_0)) return true; return false;}//Introduced in DOM Level 2DOMDocumentType *DOMImplementationImpl::createDocumentType(const XMLCh *qualifiedName, const XMLCh * publicId, const XMLCh *systemId){ // assume XML 1.0 since we do not know its version yet. if(!XMLChar1_0::isValidName(qualifiedName, XMLString::stringLen(qualifiedName))) throw DOMException(DOMException::INVALID_CHARACTER_ERR, 0); //to do: do we need to create with user's memorymanager??? DOMDocumentTypeImpl* docType = new DOMDocumentTypeImpl(0, qualifiedName, publicId, systemId, true); return docType;}DOMDocument *DOMImplementationImpl::createDocument(const XMLCh *namespaceURI, const XMLCh *qualifiedName, DOMDocumentType *doctype, MemoryManager* const manager){ return new (manager) DOMDocumentImpl(namespaceURI, qualifiedName, doctype, manager);}//Introduced in DOM Level 3DOMImplementation* DOMImplementationImpl::getInterface(const XMLCh*){ throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0); return 0;}// Non-standard extensionDOMDocument *DOMImplementationImpl::createDocument(MemoryManager* const manager){ return new (manager) DOMDocumentImpl(manager);}//// DOMImplementation::getImplementation. DOMImplementation is supposed to// be a pure interface class. This one static// function is the hook that lets things get started.DOMImplementation *DOMImplementation::getImplementation(){ return (DOMImplementation*) DOMImplementationImpl::getDOMImplementationImpl();}bool DOMImplementation::loadDOMExceptionMsg( const DOMException::ExceptionCode msgToLoad , XMLCh* const toFill , const unsigned int maxChars){ // load the text, the msgToLoad+XMLDOMMsgs::DOMEXCEPTION_ERRX+msgToLoad is the corresponding XMLDOMMsg Code return DOMImplementationImpl::getMsgLoader4DOM()->loadMsg(XMLDOMMsg::DOMEXCEPTION_ERRX+msgToLoad, toFill, maxChars);}bool DOMImplementation::loadDOMExceptionMsg( const DOMRangeException::RangeExceptionCode msgToLoad , XMLCh* const toFill , const unsigned int maxChars){ // load the text, the XMLDOMMsgs::DOMRANGEEXCEPTION_ERRX+msgToLoad is the corresponding XMLDOMMsg Code return DOMImplementationImpl::getMsgLoader4DOM()->loadMsg(XMLDOMMsg::DOMRANGEEXCEPTION_ERRX+msgToLoad, toFill, maxChars);}// ------------------------------------------------------------// DOMImplementationLS Virtual interface// ------------------------------------------------------------//Introduced in DOM Level 3DOMBuilder* DOMImplementationImpl::createDOMBuilder(const short mode, const XMLCh* const, MemoryManager* const manager, XMLGrammarPool* const gramPool){ if (mode == DOMImplementationLS::MODE_ASYNCHRONOUS) throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, manager); return new (manager) DOMBuilderImpl(0, manager, gramPool);}DOMWriter* DOMImplementationImpl::createDOMWriter(MemoryManager* const manager){ return new (manager) DOMWriterImpl(manager);}DOMInputSource* DOMImplementationImpl::createDOMInputSource(){ throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0); return 0;}// ------------------------------------------------------------// DOMImplementationSource Virtual interface// ------------------------------------------------------------DOMImplementation* DOMImplementationImpl::getDOMImplementation(const XMLCh* features) const{ DOMImplementation* impl = DOMImplementation::getImplementation(); XMLStringTokenizer tokenizer(features, XMLPlatformUtils::fgMemoryManager); const XMLCh* feature = 0; while (feature || tokenizer.hasMoreTokens()) { if (!feature) feature = tokenizer.nextToken(); const XMLCh* version = 0; const XMLCh* token = tokenizer.nextToken(); if (token && XMLString::isDigit(token[0])) version = token; if (!impl->hasFeature(feature, version)) return 0; if (!version) feature = token; } return impl;}XERCES_CPP_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?