dom_domimplementation.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 213 行
CPP
213 行
/* * Copyright 1999-2002,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: DOM_DOMImplementation.cpp,v 1.6 2004/09/08 13:55:42 peiyongz Exp $ */#include "DOM_DOMImplementation.hpp"#include "DOM_Document.hpp"#include "DOM_DocumentType.hpp"#include "DOM_DOMException.hpp"#include "DocumentImpl.hpp"#include "DocumentTypeImpl.hpp"#include "DStringPool.hpp"#include <xercesc/util/XMLChar.hpp>#include <xercesc/util/PlatformUtils.hpp>#include <xercesc/util/XMLRegisterCleanup.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 DOM_DOMImplementation *gDomimp; // Points to the singleton instance // of DOMImplementation that is returned // by any call to getImplementation().static DOMString *gXML = 0; // Points to "XML"static DOMString *g1_0 = 0; // Points to "1.0"static DOMString *g2_0 = 0; // Points to "2.0"static DOMString *gTrav = 0; // Points to "Traversal"static DOMString *gRange = 0; // Points to "Range"static DOMString *gCore = 0; // Points to "Core"//// we define only one clean up object, if any of the above// ever get initialized, then the cleanup function will be// registered to the same cleanup Obj again and again.//// that cleanup function will delete/null all the g*//static XMLRegisterCleanup DOM_DOMImplementationCleanup;// Note #1136 - There needs to be a separate implementation class for// DOMImplementation, so that the user programming model// is consistent with the rest of the C++ DOM API, and// so that hasFeature will only work on the result of// getImplementation(), and not on DOM_DOMImplemenation objects// created with the default constructor.//DOM_DOMImplementation::DOM_DOMImplementation() {};DOM_DOMImplementation::DOM_DOMImplementation(const DOM_DOMImplementation & other){};DOM_DOMImplementation::~DOM_DOMImplementation(){};DOM_DOMImplementation & DOM_DOMImplementation::operator = (const DOM_DOMImplementation & other){ return *this;};// -----------------------------------------------------------------------// Reset the singleton DOM_DOMImplementation// -----------------------------------------------------------------------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.//DOM_DOMImplementation &DOM_DOMImplementation::getImplementation() { static XMLRegisterCleanup implementationCleanup; if (gDomimp == 0) { DOM_DOMImplementation *t = new DOM_DOMImplementation; if (XMLPlatformUtils::compareAndSwap((void **)&gDomimp, t, 0) != 0) { delete t; } else { implementationCleanup.registerCleanup(reinitImplementation); } } return *gDomimp;};bool DOM_DOMImplementation::hasFeature(const DOMString &feature, const DOMString &version){ bool anyVersion = (version == null || version.length() == 0); bool version1_0 = version.equals(DStringPool::getStaticString("1.0" , &g1_0 , reinitDOM_DOMImplementation , DOM_DOMImplementationCleanup)); bool version2_0 = version.equals(DStringPool::getStaticString("2.0" , &g2_0 , reinitDOM_DOMImplementation , DOM_DOMImplementationCleanup)); // case-insensitive compare if(!XMLString::compareIString(feature.rawBuffer(), DStringPool::getStaticString("XML" , &gXML , reinitDOM_DOMImplementation , DOM_DOMImplementationCleanup).rawBuffer()) && (anyVersion || version1_0 || version2_0)) return true; if(!XMLString::compareIString(feature.rawBuffer(), DStringPool::getStaticString("Core" , &gCore , reinitDOM_DOMImplementation , DOM_DOMImplementationCleanup).rawBuffer()) && (anyVersion || version1_0 || version2_0)) return true; if(!XMLString::compareIString(feature.rawBuffer(), DStringPool::getStaticString("Traversal" , &gTrav , reinitDOM_DOMImplementation , DOM_DOMImplementationCleanup).rawBuffer()) && (anyVersion || version2_0)) return true; if(!XMLString::compareIString(feature.rawBuffer(), DStringPool::getStaticString("Range" , &gRange , reinitDOM_DOMImplementation , DOM_DOMImplementationCleanup).rawBuffer()) && (anyVersion || version2_0)) return true; return false;}//Introduced in DOM Level 2DOM_DocumentType DOM_DOMImplementation::createDocumentType(const DOMString &qualifiedName, const DOMString &publicId, const DOMString &systemId){ if(!XMLChar1_0::isValidName(qualifiedName.rawBuffer(), XMLString::stringLen(qualifiedName.rawBuffer()))) throw DOM_DOMException(DOM_DOMException::INVALID_CHARACTER_ERR,null); return DOM_DocumentType(new DocumentTypeImpl(null, qualifiedName, publicId, systemId));}DOM_Document DOM_DOMImplementation::createDocument(const DOMString &namespaceURI, const DOMString &qualifiedName, const DOM_DocumentType &doctype, MemoryManager* const manager){ return DOM_Document(new (manager) DocumentImpl(namespaceURI, qualifiedName, doctype == null ? null : (DocumentTypeImpl *) doctype.fImpl, manager));}// -----------------------------------------------------------------------// Notification that lazy data has been deleted// -----------------------------------------------------------------------void DOM_DOMImplementation::reinitDOM_DOMImplementation() { delete gXML; gXML = 0; delete g1_0; g1_0 = 0; delete g2_0; g2_0 = 0; delete gTrav; gTrav = 0; delete gRange; gRange = 0; delete gCore; gCore = 0;}XERCES_CPP_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?