blob: bea0ddb1c2c4be63d0a0d494f16487db287e4bea [file] [log] [blame]
#ifndef NodeImpl_HEADER_GUARD_
#define NodeImpl_HEADER_GUARD_
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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: NodeImpl.hpp 568078 2007-08-21 11:43:25Z amassari $
*/
//
// 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 <xercesc/dom/deprecated/DOM.hpp> for the entire
// DOM API, or DOM_*.hpp for individual DOM classes, where the class
// name is substituded for the *.
//
/**
* A NodeImpl 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/XMemory.hpp>
#include "NodeListImpl.hpp"
#include "DOMString.hpp"
XERCES_CPP_NAMESPACE_BEGIN
class NamedNodeMapImpl;
class NodeListImpl;
class DocumentImpl;
// define 'null' is used extensively in the DOM implementation code,
// as a consequence of its Java origins.
// MSVC 5.0 compiler has problems with overloaded function resolution
// when using the const int definition.
//
#if defined(XML_CSET)
const int null = 0;
#else
#define null 0
#endif
class DEPRECATED_DOM_EXPORT NodeImpl: public NodeListImpl {
public:
NodeImpl *ownerNode; // typically the parent but not always!
// data
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 HASSTRING;
static int gLiveNodeImpls; // Counters for debug & tuning.
static int gTotalNodeImpls;
public:
NodeImpl(DocumentImpl *ownerDocument);
NodeImpl(const NodeImpl &other);
virtual ~NodeImpl();
// Dynamic Cast replacement functions.
virtual bool isAttrImpl();
virtual bool isCDATASectionImpl();
virtual bool isDocumentFragmentImpl();
virtual bool isDocumentImpl();
virtual bool isDocumentTypeImpl();
virtual bool isElementImpl();
virtual bool isEntityReference();
virtual bool isTextImpl();
virtual void changed();
virtual int changes();
virtual NodeImpl *appendChild(NodeImpl *newChild);
virtual NodeImpl * cloneNode(bool deep) = 0;
static void deleteIf(NodeImpl *thisNode);
virtual NamedNodeMapImpl * getAttributes();
virtual NodeListImpl *getChildNodes();
virtual NodeImpl * getFirstChild();
virtual NodeImpl * getLastChild();
virtual unsigned int getLength();
virtual NodeImpl * getNextSibling();
virtual DOMString getNodeName() = 0;
virtual short getNodeType() = 0;
virtual DOMString getNodeValue();
virtual DocumentImpl * getOwnerDocument();
virtual NodeImpl * getParentNode();
virtual NodeImpl* getPreviousSibling();
virtual void *getUserData();
virtual bool hasChildNodes();
virtual NodeImpl *insertBefore(NodeImpl *newChild, NodeImpl *refChild);
static bool isKidOK(NodeImpl *parent, NodeImpl *child);
virtual NodeImpl *item(unsigned int index);
virtual void referenced();
virtual NodeImpl * removeChild(NodeImpl *oldChild);
virtual NodeImpl *replaceChild(NodeImpl *newChild, NodeImpl *oldChild);
virtual void setNodeValue(const DOMString &value);
virtual void setReadOnly(bool readOnly, bool deep);
virtual void setUserData(void *value);
virtual DOMString toString();
virtual void unreferenced();
//Introduced in DOM Level 2
virtual void normalize();
virtual bool isSupported(const DOMString &feature, const DOMString &version);
virtual DOMString getNamespaceURI();
virtual DOMString getPrefix();
virtual DOMString getLocalName();
virtual void setPrefix(const DOMString &prefix);
virtual bool hasAttributes();
protected:
//Utility, not part of DOM Level 2 API
static const DOMString& mapPrefix(const DOMString &prefix,
const DOMString &namespaceURI, short nType);
static DOMString getXmlnsString();
static DOMString getXmlnsURIString();
static DOMString getXmlString();
static DOMString getXmlURIString();
public: // should really be protected - ALH
virtual void setOwnerDocument(DocumentImpl *doc);
// NON-DOM
// unlike getOwnerDocument this never returns null, even for Document nodes
virtual DocumentImpl * getDocument();
/*
* 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);
}
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 setValueCalled() const {
return (flags & SETVALUE) != 0;
}
inline void setValueCalled(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);
}
inline bool hasStringValue() const {
return (flags & HASSTRING) != 0;
}
inline void hasStringValue(bool value) {
flags = (value ? flags | HASSTRING : flags & ~HASSTRING);
}
// -----------------------------------------------------------------------
// Notification that lazy data has been deleted
// -----------------------------------------------------------------------
static void reinitNodeImpl();
};
XERCES_CPP_NAMESPACE_END
#endif