blob: 394798fabd052041615e45ac18862e372922d469 [file] [log] [blame]
#ifndef IDDocumentImpl_HEADER_GUARD_
#define IDDocumentImpl_HEADER_GUARD_
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 2001, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Id$
*/
//
// This file is part of the internal implementation of the C++ XML DOM.
// It should NOT be included or used directly by application programs.
//
// Applications should include the file <dom/DOM.hpp> for the entire
// DOM API, or IDOM_*.hpp for individual DOM classes, where the class
// name is substituded for the *.
//
#include <string.h>
#include <util/XercesDefs.hpp>
#include "util/RefVectorOf.hpp"
#include "util/RefHashTableOf.hpp"
#include "IDOM_Document.hpp"
#include "IDNodeImpl.hpp"
#include "IDParentNode.hpp"
#include "IDDeepNodeListPool.hpp"
class IDAttrImpl;
class IDCDATASectionImpl;
class IDCommentImpl;
class IDDeepNodeListImpl;
class IDDocumentFragmentImpl;
class IDDocumentTypeImpl;
class IDDStringPool;
class IDElementImpl;
class IDEntityImpl;
class IDEntityReferenceImpl;
class IDNodeImpl;
class IDNotationImpl;
class IDProcessingInstructionImpl;
class IDTextImpl;
class IDNodeIteratorImpl;
class IDTreeWalkerImpl;
class IDOM_NodeFilter;
class IDNodeFilterImpl;
class IDOM_DOMImplementation;
class IDNodeIDMap;
class IDRangeImpl;
class IDParentNode;
class IDStringPool;
typedef RefVectorOf<IDNodeIteratorImpl> NodeIterators;
typedef RefVectorOf<IDTreeWalkerImpl> TreeWalkers;
typedef RefVectorOf<IDRangeImpl> Ranges;
class CDOM_EXPORT IDDocumentImpl: public IDOM_Document {
public:
// -----------------------------------------------------------------------
// Private data types
// -----------------------------------------------------------------------
IDNodeImpl fNode; // Implements common node functionality.
IDParentNode fParent; // Implements common parent node functionality
IDOM_DocumentType *fDocType;
IDOM_Element *fDocElement;
IDStringPool *fNamePool;
IDNodeIDMap *fNodeIDMap; // for use by GetElementsById().
NodeIterators *fIterators;
TreeWalkers *fTreeWalkers;
Ranges *fRanges;
RefHashTableOf<void> *fUserData;
int fChanges;
bool errorChecking; // Bypass error checking.
// Per-Document heap Variables.
// The heap consists of one or more biggish blocks which are
// sub-allocated for individual allocations of nodes, strings, etc.
// The big blocks form a linked list, allowing them to be located for deletion.
//
// There is no provision for deleting suballocated blocks, other than
// deleting the entire heap when the document is deleted.
//
// There is no header on individual sub-allocated blocks.
// The header on big blocks consists only of a single back pointer to
// the previously allocated big block (our linked list of big blocks)
//
//
// idom_revisit - this heap should be encapsulated into its own
// class, rather than hanging naked on Document.
//
void *fCurrentBlock;
char *fFreePtr;
unsigned int fFreeBytesRemaining;
friend class IDNodeImpl;
friend class IDNodeIteratorImpl;
friend class IDTreeWalkerImpl;
friend class IDRangeImpl;
friend class IDDOMParser;
void setDocumentType(IDOM_DocumentType *doctype);
public:
IDDocumentImpl();
IDDocumentImpl(const XMLCh *namespaceURI, //DOM Level 2
const XMLCh *qualifiedName,
IDOM_DocumentType *doctype);
virtual ~IDDocumentImpl();
// Add all functions that are pure virutal in IDOM_NODE
IDOM_NODE_FUNCTIONS;
virtual IDOM_Attr *createAttribute(const XMLCh *name);
virtual IDOM_CDATASection *createCDATASection(const XMLCh *data);
virtual IDOM_Comment *createComment(const XMLCh *data);
virtual IDOM_DocumentFragment *createDocumentFragment();
virtual IDOM_DocumentType *createDocumentType(const XMLCh *name);
virtual IDOM_DocumentType *createDocumentType(const XMLCh *qName,
const XMLCh *publicId,
const XMLCh *systemId);
virtual IDOM_Element *createElement(const XMLCh * tagName);
virtual IDOM_Element *createElementNoCheck(const XMLCh *tagName);
virtual IDOM_Entity *createEntity(const XMLCh * name);
virtual IDOM_EntityReference *createEntityReference(const XMLCh * name);
virtual IDOM_Notation *createNotation(const XMLCh * name);
virtual IDOM_ProcessingInstruction *createProcessingInstruction(const XMLCh * target, const XMLCh * data);
virtual IDOM_Text *createTextNode(const XMLCh * data);
virtual IDOM_DocumentType *getDoctype() const;
virtual IDOM_Element *getDocumentElement() const;
virtual IDOM_NodeList *getElementsByTagName(const XMLCh * tagname) const;
virtual IDOM_DOMImplementation *getImplementation() const;
static bool isXMLName(const XMLCh * s);
virtual IDOM_NodeIterator *createNodeIterator(IDOM_Node *root,
unsigned long whatToShow,
IDOM_NodeFilter* filter,
bool entityReferenceExpansion);
virtual IDOM_TreeWalker *createTreeWalker(IDOM_Node *root,
unsigned long whatToShow,
IDOM_NodeFilter* filter,
bool entityReferenceExpansion);
virtual void* getUserData() const;
virtual void setUserData(void* value);
virtual IDOM_Range *createRange();
virtual Ranges* getRanges() const; //non-standard api
virtual void removeRange(IDRangeImpl* range); //non-standard api
// helper functions to prevent storing userdata pointers on every node.
virtual void setUserData(IDOM_Node* n, void* data);
virtual void* getUserData(const IDOM_Node* n) const;
//
// Functions to keep track of document mutations, so that node list chached
// information can be invalidated. One global changes counter per document.
//
virtual void changed();
virtual int changes() const;
/**
* Sets whether the DOM implementation performs error checking
* upon operations. Turning off error checking only affects
* the following DOM checks:
* <ul>
* <li>Checking strings to make sure that all characters are
* legal XML characters
* <li>Hierarchy checking such as allowed children, checks for
* cycles, etc.
* </ul>
* <p>
* Turning off error checking does <em>not</em> turn off the
* following checks:
* <ul>
* <li>Read only checks
* <li>Checks related to DOM events
* </ul>
*/
inline void setErrorChecking(bool check) {
errorChecking = check;
}
/**
* Returns true if the DOM implementation performs error checking.
*/
inline bool getErrorChecking() {
return errorChecking;
}
//Introduced in DOM Level 2
virtual IDOM_Node *importNode(IDOM_Node *source, bool deep);
virtual IDOM_Element *createElementNS(const XMLCh *namespaceURI,
const XMLCh *qualifiedName);
virtual IDOM_Attr *createAttributeNS(const XMLCh *namespaceURI,
const XMLCh *qualifiedName);
virtual IDOM_NodeList *getElementsByTagNameNS(const XMLCh *namespaceURI,
const XMLCh *localName) const;
virtual IDOM_Element *getElementById(const XMLCh *elementId) const;
//Return the index > 0 of ':' in the given qualified name qName="prefix:localName".
//Return 0 if there is no ':', or -1 if qName is malformed such as ":abcd".
static int indexofQualifiedName(const XMLCh * qName);
static bool isKidOK(IDOM_Node *parent, IDOM_Node *child);
inline IDNodeIDMap * getNodeIDMap() {return fNodeIDMap;};
//
// Memory Management Functions. All memory is allocated by and owned by
// a document, and is not recovered until the
// document itself is deleted.
//
void * allocate(size_t amount);
XMLCh * cloneString(const XMLCh *src);
const XMLCh * getPooledString(const XMLCh *src);
void deleteHeap();
// Factory methods for getting/creating node lists.
// Because nothing is ever deleted, the implementation caches and recycles
// previously used instances of IDDeepNodeList
//
IDOM_NodeList *getDeepNodeList(const IDOM_Node *rootNode, const XMLCh *tagName);
IDOM_NodeList *getDeepNodeList(const IDOM_Node *rootNode, //DOM Level 2
const XMLCh *namespaceURI,
const XMLCh *localName);
private:
IDDeepNodeListPool<IDDeepNodeListImpl> *fNodeListPool;
};
//
// Operator new. Global overloaded version, lets any object be allocated on
// the heap owned by a document.
//
inline void * operator new(size_t amt, IDOM_Document *doc)
{
// idom_revist. Probably should be a checked cast.
void *p = ((IDDocumentImpl *)doc)->allocate(amt);
return p;
}
#endif