blob: af8750d73d91e97801405f899c4daa0644413817 [file] [log] [blame]
#ifndef IDNodeImpl_HEADER_GUARD_
#define IDNodeImpl_HEADER_GUARD_
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2002 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 DOM_*.hpp for individual DOM classes, where the class
// name is substituded for the *.
//
/**
* A IDNodeImpl doesn't have any children, and can therefore only be directly
* inherited by classes of nodes that never have any, such as Text nodes. For
* other types, such as Element, classes must inherit from ParentNode.
* <P>
* All nodes in a single document must originate
* in that document. (Note that this is much tighter than "must be
* same implementation") Nodes are all aware of their ownerDocument,
* and attempts to mismatch will throw WRONG_DOCUMENT_ERR.
* <P>
* However, to save memory not all nodes always have a direct reference
* to their ownerDocument. When a node is owned by another node it relies
* on its owner to store its ownerDocument. Parent nodes always store it
* though, so there is never more than one level of indirection.
* And when a node doesn't have an owner, ownerNode refers to its
* ownerDocument.
**/
#include <xercesc/util/XercesDefs.hpp>
class IDOM_NamedNodeMap;
class IDOM_NodeList;
class IDOM_Node;
class IDOM_Document;
class CDOM_EXPORT IDNodeImpl {
public:
// data
IDOM_Node *fOwnerNode; // typically the parent but not always!
unsigned short flags;
static const unsigned short READONLY;
static const unsigned short SYNCDATA;
static const unsigned short SYNCCHILDREN;
static const unsigned short OWNED;
static const unsigned short FIRSTCHILD;
static const unsigned short SPECIFIED;
static const unsigned short IGNORABLEWS;
static const unsigned short SETVALUE;
static const unsigned short ID_ATTR;
static const unsigned short USERDATA;
static const unsigned short LEAFNODETYPE;
static const unsigned short CHILDNODE;
public:
IDNodeImpl(IDOM_Node *ownerDocument);
IDNodeImpl(const IDNodeImpl &other);
~IDNodeImpl();
IDOM_Node *appendChild(IDOM_Node *newChild);
IDOM_NamedNodeMap * getAttributes() const;
IDOM_NodeList * getChildNodes() const;
IDOM_Node * getFirstChild() const;
IDOM_Node * getLastChild() const;
const XMLCh * getLocalName() const;
const XMLCh * getNamespaceURI() const;
IDOM_Node * getNextSibling() const;
const XMLCh * getNodeValue() const;
IDOM_Document * getOwnerDocument() const;
IDOM_Node * getParentNode() const;
const XMLCh * getPrefix() const;
IDOM_Node * getPreviousSibling() const;
void * getUserData() const;
bool hasChildNodes() const;
IDOM_Node * insertBefore(IDOM_Node *newChild, IDOM_Node *refChild);
void normalize();
IDOM_Node * removeChild(IDOM_Node *oldChild);
IDOM_Node * replaceChild(IDOM_Node *newChild, IDOM_Node *oldChild);
void setNodeValue(const XMLCh *value);
void setPrefix(const XMLCh *fPrefix);
void setReadOnly(bool readOnly, bool deep);
void setUserData(void *value);
bool isSupported(const XMLCh *feature, const XMLCh *version) const;
bool hasAttributes() const;
static bool isKidOK(IDOM_Node *parent, IDOM_Node *child);
//Utility, not part of DOM Level 2 API
static const XMLCh * mapPrefix(const XMLCh *prefix,
const XMLCh *namespaceURI, short nType);
static const XMLCh *getXmlnsString();
static const XMLCh *getXmlnsURIString();
static const XMLCh *getXmlString();
static const XMLCh *getXmlURIString();
public: // should really be protected - ALH
void setOwnerDocument(IDOM_Document *doc);
/*
* Flags setters and getters
*/
inline bool isReadOnly() const {
return (flags & READONLY) != 0;
}
inline void isReadOnly(bool value) {
flags = (value ? flags | READONLY : flags & ~READONLY);
}
inline bool needsSyncData() const {
return (flags & SYNCDATA) != 0;
}
inline void needsSyncData(bool value) {
flags = (value ? flags | SYNCDATA : flags & ~SYNCDATA);
}
inline bool needsSyncChildren() const {
return (flags & SYNCCHILDREN) != 0;
}
inline void needsSyncChildren(bool value) {
flags = (value ? flags | SYNCCHILDREN : flags & ~SYNCCHILDREN);
}
// For Attributes, true if the attr node is attached to an element.
// For all other node types, true if the node has a parent node.
inline bool isOwned() const {
return (flags & OWNED) != 0;
}
inline void isOwned(bool value) {
flags = (value ? flags | OWNED : flags & ~OWNED);
}
inline bool isFirstChild() const {
return (flags & FIRSTCHILD) != 0;
}
inline void isFirstChild(bool value) {
flags = (value ? flags | FIRSTCHILD : flags & ~FIRSTCHILD);
}
inline bool isSpecified() const {
return (flags & SPECIFIED) != 0;
}
inline void isSpecified(bool value) {
flags = (value ? flags | SPECIFIED : flags & ~SPECIFIED);
}
inline bool ignorableWhitespace() const {
return (flags & IGNORABLEWS) != 0;
}
inline void ignorableWhitespace(bool value) {
flags = (value ? flags | IGNORABLEWS : flags & ~IGNORABLEWS);
}
inline bool setValue() const {
return (flags & SETVALUE) != 0;
}
inline void setValue(bool value) {
flags = (value ? flags | SETVALUE : flags & ~SETVALUE);
}
inline bool isIdAttr() const {
return (flags & ID_ATTR) != 0;
}
inline void isIdAttr(bool value) {
flags = (value ? flags | ID_ATTR : flags & ~ID_ATTR);
}
inline bool hasUserData() const {
return (flags & USERDATA) != 0;
}
inline void hasUserData(bool value) {
flags = (value ? flags | USERDATA : flags & ~USERDATA);
}
//
// LeafNode is set true for node types that can not be ParentNodes (can't have children)
// This knowledge is used to allow casting from any unknown node type to the
// IDParentImpl or IDChildImpl parts of the node.
//
inline bool isLeafNode() const {
return (flags & LEAFNODETYPE) != 0;
}
inline void setIsLeafNode(bool value) {
flags = (value ? flags | LEAFNODETYPE : flags & ~LEAFNODETYPE);
}
//
// ChildNode is set true for node types that can be children of other nodes, and
// therefore include a IDChildNode data member. Note that all of the leaf
// node types (above flag) are also ChildNodes, but not all ChildNodes are
// leaf nodes.
inline bool isChildNode() const {
return (flags & CHILDNODE) != 0;
}
inline void setIsChildNode(bool value) {
flags = (value ? flags | CHILDNODE : flags & ~CHILDNODE);
}
};
// This macro lists all of the pure virtual functions declared in IDOM_Node that must
// be implemented by all node types. Since there is no inheritance of implementation,
// using this macro in the class declaration of the node types make it easier to
// accurately get all of the functions declared.
//
#define IDOM_NODE_FUNCTIONS \
virtual IDOM_Node *appendChild(IDOM_Node *newChild) ;\
virtual IDOM_Node *cloneNode(bool deep) const ;\
virtual IDOM_NamedNodeMap *getAttributes() const ;\
virtual IDOM_NodeList *getChildNodes() const ;\
virtual IDOM_Node *getFirstChild() const ;\
virtual IDOM_Node *getLastChild() const ;\
virtual const XMLCh * getLocalName() const ;\
virtual const XMLCh * getNamespaceURI() const ;\
virtual IDOM_Node *getNextSibling() const ;\
virtual const XMLCh *getNodeName() const ;\
virtual short getNodeType() const ;\
virtual const XMLCh *getNodeValue() const ;\
virtual IDOM_Document *getOwnerDocument() const ;\
virtual const XMLCh * getPrefix() const ;\
virtual IDOM_Node *getParentNode() const ;\
virtual IDOM_Node *getPreviousSibling() const ;\
virtual bool hasChildNodes() const ;\
virtual IDOM_Node *insertBefore(IDOM_Node *newChild, IDOM_Node *refChild) ;\
virtual void normalize() ;\
virtual IDOM_Node *removeChild(IDOM_Node *oldChild) ;\
virtual IDOM_Node *replaceChild(IDOM_Node *newChild, IDOM_Node *oldChild) ;\
virtual void setNodeValue(const XMLCh *nodeValue) ;\
virtual bool isSupported(const XMLCh *feature, const XMLCh *version) const ;\
virtual bool hasAttributes() const ;\
virtual void setPrefix(const XMLCh * prefix)
/*
* Here are dummy stubs for most of the functions introduced by IDOM_Node.
* Each subclass of IDOM_Node will have something like this that delegates each
* function to the appropriate implementation.
* Functions that must be supplied by every node class are omitted.
*
IDOM_Node *xxx::appendChild(IDOM_Node *newChild) {return fParent.appendChild (newChild); };
IDOM_NamedNodeMap *xxx::getAttributes() const {return fNode.getAttributes (); };
IDOM_NodeList *xxx::getChildNodes() const {return fParent.getChildNodes (); };
IDOM_Node *xxx::getFirstChild() const {return fParent.getFirstChild (); };
IDOM_Node *xxx::getLastChild() const {return fParent.getLastChild (); };
const XMLCh *xxx::getLocalName() const {return fNode.getLocalName (); };
const XMLCh *xxx::getNamespaceURI() const {return fNode.getNamespaceURI (); };
IDOM_Node *xxx::getNextSibling() const {return fChild.getNextSibling (); };
const XMLCh *xxx::getNodeValue() const {return fNode.getNodeValue (); };
IDOM_Document *xxx::getOwnerDocument() const {return fNode.getOwnerDocument (); };
const XMLCh *xxx::getPrefix() const {return fNode.getPrefix (); };
IDOM_Node *xxx::getParentNode() const {return fChild.getParentNode (this); };
IDOM_Node *xxx::getPreviousSibling() const {return fChild.getPreviousSibling (this); };
bool xxx::hasChildNodes() const {return fParent.hasChildNodes (); };
IDOM_Node *xxx::insertBefore(IDOM_Node *newChild, IDOM_Node *refChild)
{return fParent.insertBefore (newChild, refChild); };
void xxx::normalize() {fNode.normalize (); };
IDOM_Node *xxx::removeChild(IDOM_Node *oldChild) {return fParent.removeChild (oldChild); };
IDOM_Node *xxx::replaceChild(IDOM_Node *newChild, IDOM_Node *oldChild)
{return fParent.replaceChild (newChild, oldChild); };
void xxx::setNodeValue(const XMLCh *nodeValue) {fNode.setNodeValue (nodeValue); };
bool xxx::supports(const XMLCh *feature, const XMLCh *version) const
{return fNode.supports (feature, version); };
void xxx::setPrefix(const XMLCh *prefix) {fNode.setPrefix(prefix); };
*/
#endif