diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2006-04-12 13:25:21 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2006-04-12 13:25:21 +0000 |
| commit | 6fd9af13a8614a4b95e8be1518e745915ef8bb56 (patch) | |
| tree | bf94fa5f7c3a7b2f581f3e7cf2522bf7c2d4b6c9 /src/dom/domimpl.cpp | |
| parent | Removed file/folder for ishmal (diff) | |
| download | inkscape-6fd9af13a8614a4b95e8be1518e745915ef8bb56.tar.gz inkscape-6fd9af13a8614a4b95e8be1518e745915ef8bb56.zip | |
Add new rearranged /dom directory
(bzr r479)
Diffstat (limited to 'src/dom/domimpl.cpp')
| -rw-r--r-- | src/dom/domimpl.cpp | 2984 |
1 files changed, 2984 insertions, 0 deletions
diff --git a/src/dom/domimpl.cpp b/src/dom/domimpl.cpp new file mode 100644 index 000000000..b3197c948 --- /dev/null +++ b/src/dom/domimpl.cpp @@ -0,0 +1,2984 @@ +/** + * Phoebe DOM Implementation. + * + * This is a C++ approximation of the W3C DOM model, which follows + * fairly closely the specifications in the various .idl files, copies of + * which are provided for reference. Most important is this one: + * + * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html + * + * Authors: + * Bob Jamison + * + * Copyright (C) 2005 Bob Jamison + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "domimpl.h" + +namespace org +{ +namespace w3c +{ +namespace dom +{ + + +/** + * Test if the given substring exists for the length of the string + * in a given buffer + */ +/* +static bool match(const DOMString &buf, char *str) +{ + int pos = 0; + while (*str) + { + if (buf[pos++] != *str++) + return false; + } + return true; +} +*/ + + + +/*######################################################################### +## DOMImplementationSourceImpl +#########################################################################*/ + + +/** + * + */ +DOMImplementationSourceImpl::DOMImplementationSourceImpl() +{ + domImpl = new DOMImplementationImpl(); +} + +/** + * + */ +DOMImplementationSourceImpl::~DOMImplementationSourceImpl() +{ + delete domImpl; +} + +/** + * + */ +DOMImplementation *DOMImplementationSourceImpl::getDOMImplementation( + const DOMString &features) +{ + return domImpl; +} + +/** + * + */ +DOMImplementationList DOMImplementationSourceImpl::getDOMImplementationList( + const DOMString &features) +{ + return domImplList; +} + + + + + + + +/*######################################################################### +## DOMImplementationImpl +#########################################################################*/ + + +/** + * + */ +DOMImplementationImpl::DOMImplementationImpl() +{ +} + +/** + * + */ +DOMImplementationImpl::~DOMImplementationImpl() +{ +} + +/** + * + */ +bool DOMImplementationImpl::hasFeature(const DOMString& feature, + const DOMString& version) +{ + return false; +} + + +/** + * + */ +DocumentType *DOMImplementationImpl::createDocumentType(const DOMString& qualifiedName, + const DOMString& publicId, + const DOMString& systemId) + throw(DOMException) +{ + DocumentTypeImpl *typeImpl = new DocumentTypeImpl(qualifiedName, + publicId, systemId); + return typeImpl; +} + +/** + * + */ +Document *DOMImplementationImpl::createDocument( + const DOMString& namespaceURI, + const DOMString& qualifiedName, + DocumentType *doctype) + throw(DOMException) +{ + DocumentImpl *doc = new DocumentImpl(this, + namespaceURI, + qualifiedName, + doctype); + return doc; +} + +/** + * + */ +DOMObject *DOMImplementationImpl::getFeature(const DOMString& feature, + const DOMString& version) + +{ + return NULL; +} + + + + + +/*######################################################################### +## NodeImpl +#########################################################################*/ + +/** + * Utility for finding the first Element above + * a given node. Used by several methods below + */ +static Node *getAncestorElement(Node *node) +{ + if (!node) + return NULL; + node = node->getParentNode(); + //Either quit because I am an element, or because I am null + while (node) + { + if (node->getNodeType() == Node::ELEMENT_NODE) + return node; + node = node->getParentNode(); + } + return node; +} + +/** + * + */ +DOMString NodeImpl::getNodeName() +{ + return nodeName; +} + +/** + * + */ +DOMString NodeImpl::getNodeValue() throw (DOMException) +{ + return nodeValue; +} + +/** + * + */ +void NodeImpl::setNodeValue(const DOMString& val) throw (DOMException) +{ + nodeValue = val; +} + +/** + * + */ +unsigned short NodeImpl::getNodeType() +{ + return nodeType; +} + +/** + * + */ +Node *NodeImpl::getParentNode() +{ + return parent; +} + +/** + * + */ +NodeList NodeImpl::getChildNodes() +{ + NodeList list; + for (NodeImpl *node = firstChild ; node ; node=node->next) + list.add(node); + return list; +} + +/** + * + */ +Node *NodeImpl::getFirstChild() +{ + return firstChild; +} + +/** + * + */ +Node *NodeImpl::getLastChild() +{ + return lastChild; +} + +/** + * + */ +Node *NodeImpl::getPreviousSibling() +{ + return prev; +} + +/** + * + */ +Node *NodeImpl::getNextSibling() +{ + return next; +} + +/** + * + */ +NamedNodeMap &NodeImpl::getAttributes() +{ + NamedNodeMap &attrs = attributes; + return attrs; +} + + +/** + * + */ +Document *NodeImpl::getOwnerDocument() +{ + return ownerDocument; +} + +/** + * + */ +Node *NodeImpl::insertBefore(const Node *newChild, + const Node *refChild) + throw(DOMException) +{ + Node *node = NULL; + return node; +} + +/** + * + */ +Node *NodeImpl::replaceChild(const Node *newChild, + const Node *oldChild) + throw(DOMException) +{ + Node *node = NULL; + return node; +} + +/** + * + */ +Node *NodeImpl::removeChild(const Node *oldChild) + throw(DOMException) +{ + Node *node = NULL; + return node; +} + +/** + * + */ +Node *NodeImpl::appendChild(const Node *newChild) + throw(DOMException) +{ + if (!newChild) + return NULL; + + Node *child = (Node *)newChild; + NodeImpl *childImpl = dynamic_cast<NodeImpl *> (child); + + childImpl->parent = this; + childImpl->ownerDocument = ownerDocument; + + if (!firstChild || !lastChild) + { + //Set up our first member + firstChild = childImpl; + lastChild = childImpl; + } + else + { + //link at the last position + lastChild->next = childImpl; + childImpl->prev = lastChild; + lastChild = childImpl; + } + + return child; +} + +/** + * + */ +bool NodeImpl::hasChildNodes() +{ + return (firstChild != NULL); +} + +/** + * + */ +Node *NodeImpl::cloneNode(bool deep) +{ + NodeImpl *node = new NodeImpl(ownerDocument, nodeName); + node->parent = parent; + node->prev = prev; + node->next = next; + node->userData = userData; + node->nodeValue = nodeValue; + + if (deep) + { + node->firstChild = node->lastChild = NULL; + for (NodeImpl *child = firstChild ; child ; child=child->next) + { + node->appendChild(child->cloneNode(deep)); + } + } + else + { + node->firstChild = firstChild; + node->lastChild = lastChild; + } + + return node; +} + +/** + * Concatenate adjoining text subnodes, remove null-length nodes + */ +void NodeImpl::normalize() +{ + //First, concatenate adjoining text nodes + NodeImpl *next = NULL; + for (NodeImpl *child = firstChild ; child ; child=next) + { + if (child->getNodeType() != Node::TEXT_NODE) + continue; + next = NULL; + DOMString sval = child->getNodeValue(); + for (NodeImpl *sibling = child->next ; sibling ; sibling=next) + { + next = sibling->next; + if (sibling->getNodeType() != Node::TEXT_NODE) + break; + sval.append(sibling->getNodeValue()); + //unlink and delete + child->next = sibling->next; + if (sibling->next) + sibling->next->prev = child; + delete sibling; + } + child->setNodeValue(sval); + } + + //Next, we remove zero-length text subnodes + next = NULL; + for (NodeImpl *child = firstChild ; child ; child=next) + { + next = child->next; + if (child->getNodeType() != Node::TEXT_NODE) + continue; + if (child->getNodeValue().size() == 0) + { + //unlink and delete + if (child->prev) + child->prev->next = child->next; + if (child->next) + child->next->prev = child->prev; + delete child; + } + } + +} + +/** + * + */ +bool NodeImpl::isSupported(const DOMString& feature, + const DOMString& version) +{ + //again, no idea + return false; +} + +/** + * + */ +DOMString NodeImpl::getNamespaceURI() +{ + return namespaceURI; +} + +/** + * + */ +DOMString NodeImpl::getPrefix() +{ + return prefix; +} + +/** + * + */ +void NodeImpl::setPrefix(const DOMString& val) throw(DOMException) +{ + prefix = val; + if (prefix.size()>0) + nodeName = prefix + ":" + localName; + else + nodeName = localName; +} + +/** + * + */ +DOMString NodeImpl::getLocalName() +{ + return localName; +} + +/** + * + */ +bool NodeImpl::hasAttributes() +{ + return (attributes.getLength() > 0); +} + +/** + * + */ +DOMString NodeImpl::getBaseURI() +{ + return baseURI; +} + +/** + * + */ +unsigned short NodeImpl::compareDocumentPosition(const Node *otherArg) +{ + if (!otherArg || this == otherArg) + return 0;//no flags + + Node *node; + Node *other = (Node *)otherArg; + + //Look above me + for (node=getParentNode() ; node ; node=node->getParentNode()) + if (node == other) + return DOCUMENT_POSITION_CONTAINED_BY; + + //Look above the other guy. See me? + for (node=other->getParentNode() ; node ; node=node->getParentNode()) + if (node == this) + return DOCUMENT_POSITION_CONTAINS; + + + return DOCUMENT_POSITION_DISCONNECTED | + DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; +} + +/** + * + */ +DOMString NodeImpl::getTextContext() throw(DOMException) +{ + //no idea + return DOMString(""); +} + + +/** + * + */ +void NodeImpl::setTextContext(const DOMString &val) throw(DOMException) +{ + //no idea +} + + +/** + * From DOM3 Namespace algorithms + */ +DOMString NodeImpl::lookupPrefix(const DOMString &theNamespaceURI) +{ + + if (theNamespaceURI.size()==0) + { + return DOMString(""); + } + + switch (nodeType) + { + case Node::ELEMENT_NODE: + { + ElementImpl *elem = (ElementImpl *)this; + return lookupNamespacePrefix(theNamespaceURI, elem); + } + case Node::DOCUMENT_NODE: + { + Document *doc = (Document *)this; + Element *elem = doc->getDocumentElement(); + return elem->lookupPrefix(theNamespaceURI); + } + case Node::ENTITY_NODE : + case Node::NOTATION_NODE: + case Node::DOCUMENT_FRAGMENT_NODE: + case Node::DOCUMENT_TYPE_NODE: + return DOMString(""); // type is unknown + case Node::ATTRIBUTE_NODE: + { + Attr *attr = (Attr *)this; + Element *elem = (Element *)attr->getOwnerElement(); + if ( elem ) + { + return elem->lookupPrefix(theNamespaceURI); + } + return DOMString(""); + } + default: + { + //Get ancestor element, if any + if ( Node *ancestor = getAncestorElement(this) ) + { + return ancestor->lookupPrefix(theNamespaceURI); + } + return DOMString(""); + } + }//switch + return DOMString(""); +} + + +/** + * + */ +bool NodeImpl::isDefaultNamespace(const DOMString &theNamespaceURI) +{ + switch (nodeType) + { + case ELEMENT_NODE: + if ( namespaceURI.size()>0 && prefix.size()==0 ) + { + return (namespaceURI == theNamespaceURI); + } + if ( Node *attr = attributes.getNamedItem("xmlns")) + { + return (attr->getNodeValue() == theNamespaceURI); + } + + + if ( Node *ancestor = getAncestorElement(this) ) + { + return ancestor->isDefaultNamespace(theNamespaceURI); + } + else + { + return false; + } + case DOCUMENT_NODE: + { //just use braces for local declaration + Document *doc = (Document *)this; + Element *elem = doc->getDocumentElement(); + return elem->isDefaultNamespace(theNamespaceURI); + } + case ENTITY_NODE: + case NOTATION_NODE: + case DOCUMENT_TYPE_NODE: + case DOCUMENT_FRAGMENT_NODE: + return false; + case ATTRIBUTE_NODE: + {//braces only for scope + Attr *attr = (Attr *)this; + Element *ownerElement = attr->getOwnerElement(); + if ( ownerElement ) + { + return ownerElement->isDefaultNamespace(theNamespaceURI); + } + else + { + return false; + } + } + default: + if ( Node *ancestor = getAncestorElement(this) ) + { + return ancestor->isDefaultNamespace(theNamespaceURI); + } + else + { + return false; + } + }//switch + + return false; +} + + +/** + * + */ +DOMString NodeImpl::lookupNamespaceURI(const DOMString &thePrefix) +{ + switch (nodeType) + { + case ELEMENT_NODE: + { + if ( namespaceURI.size()>0 && prefix == thePrefix ) + { + DOMString nsURI = namespaceURI; + return (nsURI); + } + if ( hasAttributes() ) + { + NamedNodeMap attributes = getAttributes(); + int nrAttrs = attributes.getLength(); + for (int i=0 ; i<nrAttrs ; i++) + { + Node *attr = attributes.item(i); + if (attr->getPrefix() == "xmlns" && attr->getLocalName() == thePrefix ) + { // non default namespace + if (attr->getNodeValue().size()>0) + { + return (attr->getNodeValue()); + } + return DOMString(""); + } + else if (attr->getLocalName() == "xmlns" && thePrefix.size()==0) + { // default namespace + if (attr->getNodeValue().size()>0) + { + return (attr->getNodeValue()); + } + return DOMString(""); + } + } + } + + if ( Node *ancestor = getAncestorElement(this) ) + { + return ancestor->lookupNamespaceURI(thePrefix); + } + return DOMString(""); + } + case DOCUMENT_NODE: + { + Document *doc = (Document *)this; + Element *elem = doc->getDocumentElement(); + return elem->lookupNamespaceURI(thePrefix); + } + case ENTITY_NODE: + case NOTATION_NODE: + case DOCUMENT_TYPE_NODE: + case DOCUMENT_FRAGMENT_NODE: + return DOMString(""); + + case ATTRIBUTE_NODE: + { + if (Element *ownerElement = ((Attr *)this)->getOwnerElement()) + { + return ownerElement->lookupNamespaceURI(thePrefix); + } + else + { + return DOMString(""); + } + } + default: + if ( Node *ancestor = getAncestorElement(this) ) + { + return ancestor->lookupNamespaceURI(thePrefix); + } + else + { + return DOMString(""); + } + }//switch +} + + +/** + * + */ +bool NodeImpl::isEqualNode(const Node *nodeArg) +{ + if (!nodeArg) + return false; + + if (this == nodeArg) + return true; + + Node *node = (Node *)nodeArg; + + if (getNodeType() != node->getNodeType() || + getNodeName() != node->getNodeName() || + getLocalName() != node->getLocalName() || + getNamespaceURI() != node->getNamespaceURI() || + getPrefix() != node->getPrefix() || + getNodeValue() != node->getNodeValue() || + getBaseURI() != node->getBaseURI() ) + return false; + + return true; +} + + + +/** + * + */ +DOMObject *NodeImpl::getFeature(const DOMString &feature, + const DOMString &version) +{ + //dont know + return NULL; +} + +/** + * + */ +DOMUserData *NodeImpl::setUserData(const DOMString &key, + const DOMUserData *data, + const UserDataHandler *handler) +{ + UserDataEntry *entry = userDataEntries; + UserDataEntry *prev = NULL; + while (entry) + { + if (entry->key == key) + { + DOMUserData *oldData = entry->data; + entry->data = (DOMUserData *)data; + entry->handler = (UserDataHandler *)handler; + return oldData; + } + prev = entry; + entry = entry->next; + } + + //Make a new one + UserDataEntry *newEntry = new UserDataEntry(key, data, handler); + if (!prev) + userDataEntries = newEntry; + else + prev->next = newEntry; + + return NULL; +} + +/** + * + */ +DOMUserData *NodeImpl::getUserData(const DOMString &key) +{ + UserDataEntry *entry = userDataEntries; + while (entry) + { + if (entry->key == key) + return entry->data; + entry = entry->next; + } + return NULL; +} + + + +//################## +//# Non-API methods +//################## + +/** + * + */ +void NodeImpl::setNodeName(const DOMString &qualifiedName) +{ + nodeName = qualifiedName; + prefix = ""; + localName = ""; + for (unsigned int i=0 ; i<qualifiedName.size() ; i++) + { + int ch = qualifiedName[i]; + if (ch == ':') + { + prefix = localName; + localName = ""; + } + else + { + localName.push_back(ch); + } + } +} + +/** + * + */ +void NodeImpl::setNamespaceURI(const DOMString &theNamespaceURI) +{ + namespaceURI = theNamespaceURI; +} + + +/** + * From DOM3 Namespace algorithms + */ +DOMString NodeImpl::lookupNamespacePrefix(const DOMString &theNamespaceURI, + Node *originalElement) +{ + if (!originalElement) + return DOMString(""); + + if ( namespaceURI.size()>0 && namespaceURI==theNamespaceURI && + prefix.size()>0 && + originalElement->lookupNamespaceURI(prefix) == theNamespaceURI) + { + return (prefix); + } + + if ( hasAttributes() ) + { + NamedNodeMap attributes = getAttributes(); + int nrAttrs = attributes.getLength(); + for (int i=0 ; i<nrAttrs ; i++) + { + Node *attr = attributes.item(i); + DOMString attrLocalName = attr->getLocalName(); + if (attr->getPrefix() == "xmlns" && + attr->getNodeValue() == theNamespaceURI && + originalElement->lookupNamespaceURI(attrLocalName) + == theNamespaceURI) + { + return (attrLocalName); + } + } + } + + //Get ancestor element, if any + NodeImpl *ancestor = parent; + while (ancestor && ancestor->getNodeType()!= Node::ELEMENT_NODE) + ancestor = ancestor->parent; + + if ( ancestor ) + { + return ancestor->lookupNamespacePrefix(theNamespaceURI, originalElement); + } + + return DOMString(""); +} + + +/** + * + */ +NodeImpl::NodeImpl() +{ + init(); +} + + + + +/** + * + */ +NodeImpl::NodeImpl(DocumentImpl *owner) +{ + init(); + ownerDocument = owner; +} + +/** + * + */ +NodeImpl::NodeImpl(DocumentImpl *owner, const DOMString &nodeName) +{ + init(); + ownerDocument = owner; + setNodeName(nodeName); +} + +/** + * + */ +NodeImpl::NodeImpl(DocumentImpl *owner, const DOMString &theNamespaceURI, + const DOMString &qualifiedName) +{ + init(); + ownerDocument = owner; + //if (owner) + // namespaceURI = owner->stringCache(theNamespaceURI); + setNodeName(qualifiedName); +} + + + +/** + * + */ +void NodeImpl::init() +{ + nodeType = 0; //none yet + nodeValue = ""; + setNodeName(""); + namespaceURI = ""; + parent = NULL; + prev = NULL; + next = NULL; + userData = NULL; + firstChild = NULL; + lastChild = NULL; + ownerDocument = NULL; + userDataEntries = NULL; +} + +/** + * + */ +void NodeImpl::assign(const NodeImpl &other) +{ + ownerDocument = other.ownerDocument; + prefix = other.prefix; + localName = other.localName; + nodeName = other.nodeName; + nodeValue = other.nodeValue; + namespaceURI = other.namespaceURI; + attributes = other.attributes; +} + + +/** + * + */ +NodeImpl::~NodeImpl() +{ + if (userDataEntries) + delete userDataEntries; +} + + + +/*######################################################################### +## CharacterDataImpl +#########################################################################*/ + + +/** + * + */ +CharacterDataImpl::CharacterDataImpl() : NodeImpl() +{ +} + +/** + * + */ +CharacterDataImpl::CharacterDataImpl(DocumentImpl *owner, + const DOMString &theValue) : NodeImpl() +{ + ownerDocument = owner; + nodeValue = theValue; +} + +/** + * + */ +CharacterDataImpl::~CharacterDataImpl() +{ +} + +/** + * + */ +DOMString CharacterDataImpl::getData() throw(DOMException) +{ + return nodeValue; +} + +/** + * + */ +void CharacterDataImpl::setData(const DOMString& val) throw(DOMException) +{ + nodeValue = val; +} + +/** + * + */ +unsigned long CharacterDataImpl::getLength() +{ + return nodeValue.size(); +} + +/** + * + */ +DOMString CharacterDataImpl::substringData(unsigned long offset, + unsigned long count) + throw(DOMException) +{ + return nodeValue.substr(offset, count); +} + +/** + * + */ +void CharacterDataImpl::appendData(const DOMString& arg) throw(DOMException) +{ + nodeValue += arg; +} + +/** + * + */ +void CharacterDataImpl::insertData(unsigned long offset, + const DOMString& arg) + throw(DOMException) +{ + nodeValue.insert(offset, arg); +} + +/** + * + */ +void CharacterDataImpl::deleteData(unsigned long offset, + unsigned long count) + throw(DOMException) +{ + nodeValue.erase(offset, count); +} + +/** + * + */ +void CharacterDataImpl::replaceData(unsigned long offset, + unsigned long count, + const DOMString& arg) + throw(DOMException) +{ + nodeValue.replace(offset, count, arg); +} + + + + + + +/*######################################################################### +## AttrImpl +#########################################################################*/ + +/** + * + */ +DOMString AttrImpl::getName() +{ + return nodeName; +} + +/** + * + */ +bool AttrImpl::getSpecified() +{ + return (nodeValue.size() > 0); +} + +/** + * + */ +DOMString AttrImpl::getValue() +{ + return nodeValue; +} + +/** + * + */ +void AttrImpl::setValue(const DOMString& val) throw(DOMException) +{ + nodeValue = val; +} + +/** + * + */ +Element *AttrImpl::getOwnerElement() +{ + return ownerElement; +} + + +/** + * + */ +TypeInfo *AttrImpl::getSchemaTypeInfo() +{ + return NULL; +} + + +/** + * + */ +bool AttrImpl::getIsId() +{ + return (nodeName == "id"); +} + + + +//################## +//# Non-API methods +//################## + + +void AttrImpl::setOwnerElement(const Element *elem) +{ + ownerElement = (Element *)elem; +} + +/** + * + */ +AttrImpl::AttrImpl(DocumentImpl *owner, const DOMString &theName) + : NodeImpl() +{ + nodeType = ATTRIBUTE_NODE; + ownerDocument = owner; + setNodeName(theName); +} + +/** + * + */ +AttrImpl::AttrImpl(DocumentImpl *owner, + const DOMString &theNamespaceURI, + const DOMString &theQualifiedName) + : NodeImpl() +{ + nodeType = ATTRIBUTE_NODE; + ownerDocument = owner; + //if (owner) + // namespaceURI = owner->stringCache(theNamespaceURI); + setNodeName(theQualifiedName); +} + +/** + * + */ +AttrImpl::~AttrImpl() +{ +} + + + + + +/*######################################################################### +## ElementImpl +#########################################################################*/ + + +/** + * + */ +DOMString ElementImpl::getTagName() +{ + if (prefix.size() > 0) + return prefix + ":" + nodeName; + else + return nodeName; +} + +/** + * + */ +DOMString ElementImpl::getAttribute(const DOMString& name) +{ + Node *node = attributes.getNamedItem(name); + if (!node || node->getNodeType() != ATTRIBUTE_NODE) + return DOMString(""); + Attr *attr = dynamic_cast<Attr *>(node); + return attr->getValue(); +} + +/** + * + */ +void ElementImpl::setAttribute(const DOMString& name, + const DOMString& value) + throw(DOMException) +{ + AttrImpl *attr = new AttrImpl(ownerDocument, name); + attr->setValue(value); + attr->setOwnerElement(this); + attributes.setNamedItem(attr); +} + +/** + * + */ +void ElementImpl::removeAttribute(const DOMString& name) + throw(DOMException) +{ + attributes.removeNamedItem(name); +} + +/** + * + */ +Attr *ElementImpl::getAttributeNode(const DOMString& name) +{ + Node *node = attributes.getNamedItem(name); + if (!node || node->getNodeType() != ATTRIBUTE_NODE) + return NULL; + Attr *attr = dynamic_cast<Attr *>(node); + return attr; +} + +/** + * + */ +Attr *ElementImpl::setAttributeNode(Attr *attr) + throw(DOMException) +{ + attributes.setNamedItem(attr); + return attr; +} + +/** + * + */ +Attr *ElementImpl::removeAttributeNode(Attr *attr) + throw(DOMException) +{ + if (!attr) + return NULL; + attributes.removeNamedItem(attr->getName()); + return attr; +} + + +/** + * + */ +void ElementImpl::getElementsByTagNameRecursive(NodeList &list, + const DOMString& name, Element *elem) +{ + if (!elem) + return; + + if (name == elem->getTagName()) + list.add(elem); + for (Node *node = elem->getFirstChild() ; node ; node=node->getNextSibling()) + { + if (node->getNodeType() != Node::ELEMENT_NODE) + continue; + Element *childElem = dynamic_cast<Element *>(node); + getElementsByTagNameRecursive(list, name, childElem); + } +} + + +/** + * + */ +NodeList ElementImpl::getElementsByTagName(const DOMString& tagName) +{ + NodeList list; + getElementsByTagNameRecursive(list, tagName, this); + return list; +} + +/** + * + */ +DOMString ElementImpl::getAttributeNS(const DOMString& namespaceURI, + const DOMString& localName) +{ + Node *node = attributes.getNamedItemNS(namespaceURI, localName); + if (!node || node->getNodeType()!=ATTRIBUTE_NODE) + return DOMString(""); + Attr *attr = dynamic_cast<Attr *>(node); + return attr->getValue(); +} + +/** + * + */ +void ElementImpl::setAttributeNS(const DOMString& namespaceURI, + const DOMString& qualifiedName, + const DOMString& value) + throw(DOMException) +{ + AttrImpl *attr = new AttrImpl(ownerDocument, namespaceURI, qualifiedName); + attr->setValue(value); + attr->setOwnerElement(this); + attributes.setNamedItemNS(attr); +} + +/** + * + */ +void ElementImpl::removeAttributeNS(const DOMString& namespaceURI, + const DOMString& localName) + throw(DOMException) +{ + attributes.removeNamedItemNS(namespaceURI, localName); +} + +/** + * + */ + Attr *ElementImpl::getAttributeNodeNS(const DOMString& namespaceURI, + const DOMString& localName) +{ + Node *node = attributes.getNamedItemNS(namespaceURI, localName); + if (!node || node->getNodeType() != ATTRIBUTE_NODE) + return NULL; + Attr *attr = dynamic_cast<Attr *>(node); + return attr; +} + +/** + * + */ +Attr *ElementImpl::setAttributeNodeNS(Attr *attr) + throw(DOMException) +{ + attributes.setNamedItemNS(attr); + return attr; +} + + +/** + * + */ +void ElementImpl::getElementsByTagNameNSRecursive(NodeList &list, + const DOMString& namespaceURI, const DOMString& tagName, Element *elem) +{ + if (!elem) + return; + + if (namespaceURI == elem->getNamespaceURI() && tagName == elem->getTagName()) + list.add(elem); + for (Node *node = elem->getFirstChild() ; node ; node=node->getNextSibling()) + { + if (node->getNodeType() != Node::ELEMENT_NODE) + continue; + Element *childElem = dynamic_cast<Element *>(node); + getElementsByTagNameNSRecursive(list, namespaceURI, tagName, childElem); + } +} + +/** + * + */ +NodeList ElementImpl::getElementsByTagNameNS(const DOMString& namespaceURI, + const DOMString& localName) +{ + NodeList list; + getElementsByTagNameNSRecursive(list, namespaceURI, localName, this); + return list; +} + +/** + * + */ +bool ElementImpl::hasAttribute(const DOMString& attrName) +{ + Node *node = attributes.getNamedItem(attrName); + if (!node || node->getNodeType() != ATTRIBUTE_NODE) + return false; + return true; +} + +/** + * + */ +bool ElementImpl::hasAttributeNS(const DOMString& namespaceURI, + const DOMString& localName) +{ + Node *node = attributes.getNamedItemNS(namespaceURI, localName); + if (!node || node->getNodeType() != ATTRIBUTE_NODE) + return false; + return true; +} + +/** + * + */ +TypeInfo *ElementImpl::getSchemaTypeInto() +{ + //fixme + return NULL; +} + + +/** + * + */ +void ElementImpl::setIdAttribute(const DOMString &name, + bool isId) throw (DOMException) +{ + //fixme +} + +/** + * + */ +void ElementImpl::setIdAttributeNS(const DOMString &namespaceURI, + const DOMString &localName, + bool isId) throw (DOMException) +{ + //fixme +} + +/** + * + */ +void ElementImpl::setIdAttributeNode(const Attr *idAttr, + bool isId) throw (DOMException) +{ + //fixme +} + + +//################## +//# Non-API methods +//################## + + +/** + * + */ +ElementImpl::ElementImpl() : NodeImpl() +{ + nodeType = ELEMENT_NODE; +} + +/** + * + */ +ElementImpl::ElementImpl(DocumentImpl *owner, const DOMString &tagName) + : NodeImpl() +{ + nodeType = ELEMENT_NODE; + ownerDocument = owner; + setNodeName(tagName); +} + +/** + * + */ +ElementImpl::ElementImpl(DocumentImpl *owner, + const DOMString &theNamespaceURI, + const DOMString &qualifiedName) : + NodeImpl() +{ + nodeType = ELEMENT_NODE; + ownerDocument = owner; + setNodeName(qualifiedName); +} + +/** + * + */ +ElementImpl::~ElementImpl() +{ +} + + +/** + * + */ +void ElementImpl::normalizeNamespaces() +{ + //printf("### NORMALIZE\n"); + + NamedNodeMap attrs = getAttributes(); + + //####################################### + //# Pick up local namespace declarations + //####################################### + bindingsClear(); //Reset bindings on this node + + int nrAttrs = attrs.getLength(); + for (int i=0; i<nrAttrs ; i++) + { + Node *attrNode = attrs.item(i); + if (attrNode->getNodeType() != Node::ATTRIBUTE_NODE) + continue; + AttrImpl *attr = dynamic_cast<AttrImpl *>(attrNode); + DOMString attrNS = attr->getNamespaceURI(); + DOMString attrName = attr->getLocalName(); + DOMString attrPrefix = attr->getPrefix(); + DOMString attrValue = attr->getNodeValue(); + if (attrName != "xmlns" && attrPrefix != "xmlns") + continue; + + //is the namespace declaration is invalid? + if (attrValue == XMLNSNAME || attrName == attrPrefix) + { + // Note: The prefix xmlns is used only to declare namespace bindings and + // is by definition bound to the namespace name http://www.w3.org/2000/xmlns/. + // It must not be declared. No other prefix may be bound to this namespace name. + + //==> Report an error. + printf("normalizeNamespaces() error: Namespace %s cannot be reassigned\n", + XMLNSNAME); + + } + else + { + //==> Record the namespace declaration + attr->setNamespaceURI(XMLNSNAME); + if (attrPrefix.size() > 0) + bindingsAdd(attrPrefix, attrValue); + else + bindingsAdd("*", attrValue);//default + + } + } + + + //####################################### + //# Fixup element's namespace + //####################################### + if ( namespaceURI.size() > 0 ) + { + DOMString key = prefix; + if (key.size() == 0) + key = "*"; + DOMString binding = bindingsFind(key); + //Element's prefix/namespace pair (or default namespace, if no prefix) + // are within the scope of a binding + if ( binding == namespaceURI ) + { + //==> do nothing, declaration in scope is inherited + + // See section "B.1.1: Scope of a binding" for an example + + } + else + { + + /* + ==> Create a local namespace declaration attr for this namespace, + with Element's current prefix (or a default namespace, if + no prefix). If there's a conflicting local declaration + already present, change its value to use this namespace. + + See section "B.1.2: Conflicting namespace declaration" for an example + */ + DOMString attrName = "xmlns"; + if (prefix.size() > 0) + { + attrName.append(":"); + attrName.append(prefix); + } + setAttribute(attrName, namespaceURI); + // NOTE that this may break other nodes within this Element's + // subtree, if they're already using this prefix. + // They will be repaired when we reach them. + } + } + else // Element has no namespace URI: + { + //############################################### + //# Bob -- alter this from the specs a bit. + //# Since the XmlReader does not set namespaces, + //# do it here + //############################################### + DOMString localName = getLocalName(); + if ( localName.size()==0 ) + { + // DOM Level 1 node + /* + ==> if in process of validation against a namespace aware schema + (i.e XML Schema) report a fatal error: the processor can not recover + in this situation. + Otherwise, report an error: no namespace fixup will be performed on this node. + */ + printf("normalizeNamespaces() error: no localName\n"); + } + else + { + // Element has no pseudo-prefix + //there's a conflicting local default namespace declaration already present + if ( prefix.size()==0 ) + { + //==> change its value to use this empty namespace. + namespaceURI = bindingsFind("*"); + //setAttribute("xmlns", ""); + } + else //#BOB . I added this. + { + namespaceURI = bindingsFind(prefix); + } + // NOTE that this may break other nodes within this Element's + // subtree, if they're already using the default namespaces. + // They will be repaired when we reach them. + } + } + + + //####################################### + //# Examine and polish the attributes + //####################################### + nrAttrs = attrs.getLength(); + for (int i=0; i<nrAttrs ; i++)// all non-namespace Attrs of Element + { + Node *attrNode = attrs.item(i); + if (attrNode->getNodeType() != Node::ATTRIBUTE_NODE) + continue; + Attr *attr = dynamic_cast<Attr *>(attrNode); + DOMString attrNS = attr->getNamespaceURI(); + DOMString attrPrefix = attr->getPrefix(); + DOMString attrValue = attr->getNodeValue(); + if (attrNS == XMLNSNAME) + continue; + + if ( attrNS.size()>0 ) //Attr[i] has a namespace URI + { + DOMString attrBinding = bindingsFind(attrPrefix); + /* + if attribute has no prefix (default namespace decl does not apply to attributes) + OR + attribute prefix is not declared + OR + conflict: attribute has a prefix that conflicts with a binding + already active in scope + */ + if ( attrPrefix.size() == 0 || attrBinding.size() == 0) + { + //namespaceURI matches an in scope declaration of one or more prefixes) + DOMString prefixForNS = lookupNamespacePrefix(attrNS, this); + if ( prefixForNS.size() > 0 ) + { + // pick the most local binding available; + // if there is more than one pick one arbitrarily + + //==> change attribute's prefix. + attr->setPrefix(prefixForNS); + } + else + { + // the current prefix is not null and it has no in scope declaration) + if ( attrPrefix.size() > 0 || attrBinding.size() == 0 ) + { + //==> declare this prefix + DOMString newAttrName = "xmlns:"; + newAttrName.append(attrPrefix); + setAttribute(newAttrName, attrNS); + bindingsAdd(attrPrefix, attrNS); + } + else + { + // find a prefix following the pattern "NS" +index (starting at 1) + // make sure this prefix is not declared in the current scope. + // create a local namespace declaration attribute + + //==> declare this prefix + char buf[16]; + sprintf(buf, "%d" , ownerDocument->namespaceIndex++); + DOMString newPrefix = "NS"; + newPrefix.append(buf); + DOMString newAttrName = "xmlns:"; + newAttrName.append(newPrefix); + setAttribute(newAttrName, attrNS); + bindingsAdd(newPrefix, attrNS); + //==> change attribute's prefix. + } + } + } + } + else // Attr has no namespace URI + { + // Attr has no localName + if ( attr->getLocalName().size() == 0 ) + { + // DOM Level 1 node + /* + ==> if in process of validation against a namespace aware schema + (i.e XML Schema) report a fatal error: the processor can not recover + in this situation. + Otherwise, report an error: no namespace fixup will be performed on this node. + */ + printf("normalizeNamespaces: no local name for attribute\n"); + } + else + { + // attr has no namespace URI and no prefix + // no action is required, since attrs don't use default + //==> do nothing + } + } + } // end for-all-Attrs + + + //####################################### + //# Recursively normalize children + //####################################### + for (Node *child=getFirstChild() ; child ; child=child->getNextSibling()) + { + if (child->getNodeType() != Node::ELEMENT_NODE) + continue; + ElementImpl *childElement = dynamic_cast<ElementImpl *>(child); + childElement->normalizeNamespaces(); + } + +} + + +/*######################################################################### +## TextImpl +#########################################################################*/ + + +/** + * + */ +TextImpl::TextImpl() : CharacterDataImpl() +{ + nodeType = TEXT_NODE; + nodeName = "#text"; +} + + +/** + * + */ +TextImpl::TextImpl(DocumentImpl *owner, const DOMString &value) + : CharacterDataImpl() +{ + nodeType = TEXT_NODE; + nodeName = "#text"; + ownerDocument = owner; + nodeValue = value; +} + + +/** + * + */ +TextImpl::~TextImpl() +{ +} + +/** + * + */ +Text *TextImpl::splitText(unsigned long offset) + throw(DOMException) +{ + return NULL; +} + +/** + * + */ +bool TextImpl::getIsElementContentWhitespace() +{ + return false; +} + +/** + * + */ +DOMString TextImpl::getWholeText() +{ + return nodeValue; +} + + +/** + * + */ +Text *TextImpl::replaceWholeText(const DOMString &content) + throw(DOMException) +{ + return NULL; +} + + +/*######################################################################### +## CommentImpl +#########################################################################*/ + +/** + * + */ +CommentImpl::CommentImpl() : CharacterDataImpl() +{ + nodeType = COMMENT_NODE; + nodeName = "#comment"; +} + + +/** + * + */ +CommentImpl::CommentImpl(DocumentImpl *owner, const DOMString &value) + : CharacterDataImpl() +{ + nodeType = COMMENT_NODE; + nodeName = "#comment"; + ownerDocument = owner; + nodeValue = value; +} + + +/** + * + */ +CommentImpl::~CommentImpl() +{ +} + + + + +/*######################################################################### +## TypeInfoImpl +#########################################################################*/ + + +/** + * + */ +TypeInfoImpl::TypeInfoImpl(const DOMString &typeNamespaceArg, + const DOMString &typeNameArg, + const DerivationMethod derivationMethodArg) +{ + typeNamespace = typeNamespaceArg; + typeName = typeNameArg; + derivationMethod = derivationMethodArg; +} + + +/** + * + */ +TypeInfoImpl::~TypeInfoImpl() +{ +} + + +/** + * + */ +DOMString TypeInfoImpl::getTypeName() +{ + return typeName; +} + +/** + * + */ +DOMString TypeInfoImpl::getTypeNamespace() +{ + return typeNamespace; +} + +/** + * + */ +bool TypeInfoImpl::isDerivedFrom(const DOMString &typeNamespaceArg, + const DOMString &typeNameArg, + const DerivationMethod derivationMethodArg) +{ + if (typeNamespaceArg == typeNamespace && + typeName == typeNameArg && + derivationMethod == derivationMethodArg) + return true; + return false; +} + + + +/*######################################################################### +## UserDataHandlerImpl +#########################################################################*/ + + + +/** + * + */ +UserDataHandlerImpl::UserDataHandlerImpl() +{ +} + + +/** + * + */ +UserDataHandlerImpl::~UserDataHandlerImpl() +{ +} + +/** + * + */ +void UserDataHandlerImpl::handle(unsigned short operation, + const DOMString &key, + const DOMUserData *data, + const Node *src, + const Node *dst) +{ + //do nothing. do we need anything here? +} + + + +/*######################################################################### +## DOMErrorImpl +#########################################################################*/ + + + +/** + * + */ +DOMErrorImpl::DOMErrorImpl() +{ +} + + +/** + * + */ +DOMErrorImpl::~DOMErrorImpl() +{ +} + +/** + * + */ +unsigned short DOMErrorImpl::getSeverity() +{ + return severity; +} + +/** + * + */ +DOMString DOMErrorImpl::getMessage() +{ + return message; +} + +/** + * + */ +DOMString DOMErrorImpl::getType() +{ + return type; +} + +/** + * + */ +DOMObject *DOMErrorImpl::getRelatedException() +{ + return NULL; +} + +/** + * + */ +DOMObject *DOMErrorImpl::getRelatedData() +{ + return NULL; +} + +/** + * + */ +DOMLocator *DOMErrorImpl::getLocation() +{ + //really should fill this in + return NULL; +} + + + + +/*######################################################################### +## DOMErrorHandlerImpl +#########################################################################*/ + + + +/** + * + */ +DOMErrorHandlerImpl::DOMErrorHandlerImpl() +{ +} + + +/** + * + */ +DOMErrorHandlerImpl::~DOMErrorHandlerImpl() +{ +} + +/** + * + */ +bool DOMErrorHandlerImpl::handleError(const DOMError *error) +{ + if (!error) + return false; + return true; +} + + + + +/*######################################################################### +## DOMLocatorImpl +#########################################################################*/ + + +/** + * + */ +DOMLocatorImpl::DOMLocatorImpl() +{ +} + + +/** + * + */ +DOMLocatorImpl::~DOMLocatorImpl() +{ +} + + +/** + * + */ +long DOMLocatorImpl::getLineNumber() +{ + return lineNumber; +} + +/** + * + */ +long DOMLocatorImpl::getColumnNumber() +{ + return columnNumber; +} + +/** + * + */ +long DOMLocatorImpl::getByteOffset() +{ + return byteOffset; +} + +/** + * + */ +long DOMLocatorImpl::getUtf16Offset() +{ + return utf16Offset; +} + + +/** + * + */ +Node *DOMLocatorImpl::getRelatedNode() +{ + return relatedNode; +} + + +/** + * + */ +DOMString DOMLocatorImpl::getUri() +{ + return uri; +} + + + +/*######################################################################### +## DOMConfigurationImpl +#########################################################################*/ + + +/** + * + */ +DOMConfigurationImpl::DOMConfigurationImpl() +{ +} + + +/** + * + */ +DOMConfigurationImpl::~DOMConfigurationImpl() +{ +} + +/** + * + */ +void DOMConfigurationImpl::setParameter(const DOMString &name, + const DOMUserData *value) throw (DOMException) +{ +} + +/** + * + */ +DOMUserData *DOMConfigurationImpl::getParameter(const DOMString &name) + throw (DOMException) +{ + return NULL; +} + +/** + * + */ +bool DOMConfigurationImpl::canSetParameter(const DOMString &name, + const DOMUserData *data) +{ + return false; +} + +/** + * + */ +DOMStringList *DOMConfigurationImpl::getParameterNames() +{ + return NULL; +} + + + +/*######################################################################### +## CDATASectionImpl +#########################################################################*/ + +/** + * + */ +CDATASectionImpl::CDATASectionImpl() : TextImpl() +{ + nodeType = CDATA_SECTION_NODE; + nodeName = "#cdata-section"; +} + +/** + * + */ +CDATASectionImpl::CDATASectionImpl(DocumentImpl *owner, const DOMString &theValue) + : TextImpl() +{ + nodeType = CDATA_SECTION_NODE; + nodeName = "#cdata-section"; + ownerDocument = owner; + nodeValue = theValue; +} + + +/** + * + */ +CDATASectionImpl::~CDATASectionImpl() +{ +} + + + + + +/*######################################################################### +## DocumentTypeImpl +#########################################################################*/ + +/** + * + */ +DocumentTypeImpl::DocumentTypeImpl(const DOMString& theName, + const DOMString& thePublicId, + const DOMString& theSystemId) + : NodeImpl() +{ + nodeType = DOCUMENT_TYPE_NODE; + nodeName = theName; + publicId = thePublicId; + systemId = theSystemId; +} + +/** + * + */ +DocumentTypeImpl::~DocumentTypeImpl() +{ +} + +/** + * + */ +DOMString DocumentTypeImpl::getName() +{ + return nodeName; +} + +/** + * + */ +NamedNodeMap DocumentTypeImpl::getEntities() +{ + return entities; +} + +/** + * + */ +NamedNodeMap DocumentTypeImpl::getNotations() +{ + return notations; +} + +/** + * + */ +DOMString DocumentTypeImpl::getPublicId() +{ + return publicId; +} + +/** + * + */ +DOMString DocumentTypeImpl::getSystemId() +{ + return systemId; +} + +/** + * + */ +DOMString DocumentTypeImpl::getInternalSubset() +{ + return DOMString(""); +} + + + + + + +/*######################################################################### +## NotationImpl +#########################################################################*/ + + + +/** + * + */ +NotationImpl::NotationImpl(DocumentImpl *owner) : NodeImpl() +{ + nodeType = NOTATION_NODE; + ownerDocument = owner; +} + + +/** + * + */ +NotationImpl::~NotationImpl() +{ +} + +/** + * + */ +DOMString NotationImpl::getPublicId() +{ + return publicId; +} + +/** + * + */ +DOMString NotationImpl::getSystemId() +{ + return systemId; +} + + + + + + + + +/*######################################################################### +## EntityImpl +#########################################################################*/ + + +/** + * + */ +EntityImpl::EntityImpl() : NodeImpl() +{ + nodeType = ENTITY_NODE; +} + + +/** + * + */ +EntityImpl::EntityImpl(DocumentImpl *owner) : NodeImpl() +{ + nodeType = ENTITY_NODE; + ownerDocument = owner; +} + + +/** + * + */ +EntityImpl::~EntityImpl() +{ +} + +/** + * + */ +DOMString EntityImpl::getPublicId() +{ + return publicId; +} + +/** + * + */ +DOMString EntityImpl::getSystemId() +{ + return systemId; +} + +/** + * + */ +DOMString EntityImpl::getNotationName() +{ + return notationName; +} + +/** + * + */ +DOMString EntityImpl::getInputEncoding() +{ + return inputEncoding; +} + +/** + * + */ +DOMString EntityImpl::getXmlEncoding() +{ + return xmlEncoding; +} + +/** + * + */ +DOMString EntityImpl::getXmlVersion() +{ + return xmlVersion; +} + + + + + + +/*######################################################################### +## EntityReferenceImpl +#########################################################################*/ + + + +/** + * + */ +EntityReferenceImpl::EntityReferenceImpl() : NodeImpl() +{ + nodeType = ENTITY_REFERENCE_NODE; +} + + +/** + * + */ +EntityReferenceImpl::EntityReferenceImpl(DocumentImpl *owner, + const DOMString &theName) + : NodeImpl() +{ + nodeType = ENTITY_REFERENCE_NODE; + nodeName = theName; + ownerDocument = owner; +} + + +/** + * + */ +EntityReferenceImpl::~EntityReferenceImpl() +{ +} + + + +/*######################################################################### +## ProcessingInstructionImpl +#########################################################################*/ + + + + +/** + * + */ +ProcessingInstructionImpl::ProcessingInstructionImpl(): NodeImpl() +{ + nodeType = PROCESSING_INSTRUCTION_NODE; +} + + + +/** + * + */ +ProcessingInstructionImpl::ProcessingInstructionImpl(DocumentImpl *owner, + const DOMString &target, + const DOMString &data) + : NodeImpl() +{ + nodeType = PROCESSING_INSTRUCTION_NODE; + ownerDocument = owner; + nodeName = target; + nodeValue = data; +} + + +/** + * + */ +ProcessingInstructionImpl::~ProcessingInstructionImpl() +{ +} + + + + +/** + * + */ +DOMString ProcessingInstructionImpl::getTarget() +{ + return nodeName; +} + +/** + * + */ +DOMString ProcessingInstructionImpl::getData() +{ + return nodeValue; +} + +/** + * + */ +void ProcessingInstructionImpl::setData(const DOMString& val) throw(DOMException) +{ + //do something here +} + + + + + + + +/*######################################################################### +## DocumentFragmentImpl +#########################################################################*/ + +/** + * + */ +DocumentFragmentImpl::DocumentFragmentImpl() : NodeImpl() +{ + nodeType = DOCUMENT_FRAGMENT_NODE; + nodeName = "#document-fragment"; +} + + +/** + * + */ +DocumentFragmentImpl::DocumentFragmentImpl(DocumentImpl *owner) : NodeImpl() +{ + nodeType = DOCUMENT_FRAGMENT_NODE; + nodeName = "#document-fragment"; + ownerDocument = owner; +} + + +/** + * + */ +DocumentFragmentImpl::~DocumentFragmentImpl() +{ +} + + + + + + +/*######################################################################### +## DocumentImpl +#########################################################################*/ + + + +/** + * + */ +DocumentType *DocumentImpl::getDoctype() +{ + return doctype; +} + +/** + * + */ +DOMImplementation *DocumentImpl::getImplementation() +{ + return parent; +} + +/** + * + */ +Element *DocumentImpl::getDocumentElement() +{ + return documentElement; +} + +/** + * + */ +Element *DocumentImpl::createElement(const DOMString& tagName) + throw(DOMException) +{ + ElementImpl *impl = new ElementImpl(this, tagName); + return impl; +} + +/** + * + */ +DocumentFragment *DocumentImpl::createDocumentFragment() +{ + DocumentFragmentImpl *frag = new DocumentFragmentImpl(this); + return frag; +} + +/** + * + */ +Text *DocumentImpl::createTextNode(const DOMString& data) +{ + TextImpl *text = new TextImpl(this, data); + return text; +} + +/** + * + */ +Comment *DocumentImpl::createComment(const DOMString& data) +{ + CommentImpl *comment = new CommentImpl(this, data); + return comment; +} + +/** + * + */ +CDATASection *DocumentImpl::createCDATASection(const DOMString& data) + throw(DOMException) +{ + CDATASectionImpl *cdata = new CDATASectionImpl(this, data); + return cdata; +} + +/** + * + */ +ProcessingInstruction *DocumentImpl::createProcessingInstruction(const DOMString& target, + const DOMString& data) + throw(DOMException) +{ + ProcessingInstructionImpl *cdata = + new ProcessingInstructionImpl(this, target, data); + return cdata; +} + +/** + * + */ +Attr *DocumentImpl::createAttribute(const DOMString& attrName) + throw(DOMException) +{ + AttrImpl *attr = new AttrImpl(this, attrName); + return attr; +} + +/** + * + */ +EntityReference *DocumentImpl::createEntityReference(const DOMString& erName) + throw(DOMException) +{ + EntityReferenceImpl *ref = new EntityReferenceImpl(this, erName); + return ref; +} + + +/** + * + */ +NodeList DocumentImpl::getElementsByTagName(const DOMString& tagname) +{ + NodeList list; + ElementImpl::getElementsByTagNameRecursive(list, + tagname, documentElement); + return list; +} + + +/** + * + */ +Node *DocumentImpl::importNode(const Node *importedNode, + bool deep) + throw(DOMException) +{ + return NULL; +} + +/** + * + */ +Element *DocumentImpl::createElementNS(const DOMString& namespaceURI, + const DOMString& qualifiedName) + throw(DOMException) +{ + ElementImpl *elem = new ElementImpl(this, namespaceURI, qualifiedName); + return elem; +} + +/** + * + */ +Attr *DocumentImpl::createAttributeNS(const DOMString& namespaceURI, + const DOMString& qualifiedName) + throw(DOMException) +{ + AttrImpl *attr = new AttrImpl(this, namespaceURI, qualifiedName); + return attr; +} + + +/** + * + */ +NodeList DocumentImpl::getElementsByTagNameNS(const DOMString& namespaceURI, + const DOMString& localName) +{ + NodeList list; + ElementImpl::getElementsByTagNameNSRecursive(list, namespaceURI, + localName, documentElement); + return list; +} + +/** + * + */ +Element *DocumentImpl::getElementById(const DOMString& elementId) +{ + for (NamedElementItem *entry = elementsById.next; entry ; entry=entry->next) + if (entry->name == elementId) + return entry->elem; + return NULL; +} + + +/** + * + */ +DOMString DocumentImpl::getInputEncoding() +{ + return inputEncoding; +} + + +/** + * + */ +DOMString DocumentImpl::getXmlEncoding() +{ + return xmlEncoding; +} + +/** + * + */ +bool DocumentImpl::getXmlStandalone() +{ + return xmlStandalone; +} + +/** + * + */ +void DocumentImpl::setXmlStandalone(bool val) throw (DOMException) +{ + xmlStandalone = val; +} + +/** + * + */ +DOMString DocumentImpl::getXmlVersion() +{ + return xmlVersion; +} + +/** + * + */ +void DocumentImpl::setXmlVersion(const DOMString &version) throw (DOMException) +{ + xmlVersion = version; +} + +/** + * + */ +bool DocumentImpl::getStrictErrorChecking() +{ + return strictErrorChecking; +} + +/** + * + */ +void DocumentImpl::setStrictErrorChecking(bool val) +{ + strictErrorChecking = val; +} + + +/** + * + */ +DOMString DocumentImpl::getDocumentURI() +{ + if (!documentURI) + return DOMString(""); + DOMString docURI = *documentURI; + return docURI; +} + +/** + * + */ +void DocumentImpl::setDocumentURI(const DOMString &uri) +{ + //documentURI = stringCache(uri); +} + +/** + * + */ +Node *DocumentImpl::adoptNode(const Node *source) throw (DOMException) +{ + return (Node *)source; +} + +/** + * + */ +DOMConfiguration *DocumentImpl::getDomConfig() +{ + return domConfig; +} + +/** + * + */ +void DocumentImpl::normalizeDocument() +{ + //i assume that this means adjusting namespaces & prefixes + if (documentElement) + documentElement->normalizeNamespaces(); +} + +/** + * + */ +Node *DocumentImpl::renameNode(const Node *n, + const DOMString &namespaceURI, + const DOMString &qualifiedName) + throw (DOMException) +{ + Node *node = (Node *) n; + NodeImpl *nodeImpl = dynamic_cast<NodeImpl *> (node); + //nodeImpl->namespaceURI = stringCache(namespaceURI); + nodeImpl->setNodeName(qualifiedName); + return node; +} + + + +//################## +//# Non-API methods +//################## + +/** + * + */ +DocumentImpl::DocumentImpl(const DOMImplementation *domImpl, + const DOMString &theNamespaceURI, + const DOMString &theQualifiedName, + const DocumentType *theDoctype) : NodeImpl() +{ + nodeType = DOCUMENT_NODE; + nodeName = "#document"; + parent = (DOMImplementation *)domImpl; + //documentURI = stringCache(theNamespaceURI); + qualifiedName = theQualifiedName; + if (theDoctype) //only assign if not null. + doctype = (DocumentType *)theDoctype; + else + doctype = new DocumentTypeImpl("", "", ""); + documentElement = new ElementImpl(this, "root"); + namespaceIndex = 0; +} + + +/** + * + */ +DocumentImpl::~DocumentImpl() +{ + delete documentElement; +} + + + + + + + + + + + + +} //namespace dom +} //namespace w3c +} //namespace org + + + +/*######################################################################### +## E N D O F F I L E +#########################################################################*/ + + + + |
