gareth 2002/11/21 06:13:01 Modified: c/src/xercesc/dom DOMElement.hpp c/src/xercesc/dom/impl DOMElementImpl.hpp DOMElementImpl.cpp Log: Implemented setIdAttribute, setIdAttributeNS and setIdAttributeNode from DOM level 3 core. Patch by myself and Jennifer "Georgina" Schachter. Revision Changes Path 1.6 +65 -1 xml-xerces/c/src/xercesc/dom/DOMElement.hpp Index: DOMElement.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/DOMElement.hpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- DOMElement.hpp 4 Nov 2002 15:09:24 -0000 1.5 +++ DOMElement.hpp 21 Nov 2002 14:13:01 -0000 1.6 @@ -415,6 +415,70 @@ const XMLCh *localName) const = 0; //@} + + /** @name Functions introduced in DOM Level 3 */ + //@{ + + /** + * Declares the <code>DOMAttr</code> specified by name to be of type ID. If the + * value of the specified <code>DOMAttr</code> is unique then this element node + * can later be retrieved using getElementById on Document. Note, however, + * that this simply affects this node and does not change any grammar that + * may be in use. + * To specify an <code>DOMAttr</code> by local name and namespace URI, use the + * setIdAttributeNS method. + * @param name The name of the <code>DOMAttr</code>. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + * <br />NOT_FOUND_ERR: Raised if the specified node is not an <code>DOMAttr</code> + * of this element. + * + * <p><b>"Experimental - subject to change"</b></p> + * + * @since DOM Level 3 + */ + virtual void setIdAttribute(const XMLCh* name) = 0; + + + /** + * Declares the <code>DOMAttr</code> specified by local name and namespace + * URI to be of type ID. If the value of the specified <code>DOMAttr</code> + * is unique then this <code>DOMElement</code> node can later be retrieved + * using getElementById on <code>DOMDocument</code>. Note, however, that + * this simply affects this node and does not change any grammar that may + * be in use. + * @param namespaceURI The namespace URI of the <code>DOMAttr</code>. + * @param localName The local name of the <code>DOMAttr</code>. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + * <br />NOT_FOUND_ERR: Raised if the specified node is not an <code>DOMAttr</code> of this element. + * + * <p><b>"Experimental - subject to change"</b></p> + * + * @since DOM Level 3 + */ + virtual void setIdAttributeNS(const XMLCh* namespaceURI, const XMLCh* localName) = 0; + + + + /** + * Declares the <code>DOMAttr</code> specified by node to be of type ID. + * If the value of the specified <code>DOMAttr</code> is unique then this + * <code>DOMElement</code> node can later be retrieved using getElementById + * on <code>DOMDocument</code>. Note, however, that this simply affects this + * node and does not change any grammar that may be in use. + * @param idAttr The <code>DOMAttr</code> node. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + * <br />NOT_FOUND_ERR: Raised if the specified node is not an <code>DOMAttr</code> of this element. + * + * <p><b>"Experimental - subject to change"</b></p> + * + * @since DOM Level 3 + */ + virtual void setIdAttributeNode(const DOMAttr *idAttr) = 0; + //@} + }; XERCES_CPP_NAMESPACE_END 1.5 +6 -1 xml-xerces/c/src/xercesc/dom/impl/DOMElementImpl.hpp Index: DOMElementImpl.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMElementImpl.hpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- DOMElementImpl.hpp 4 Nov 2002 15:07:34 -0000 1.4 +++ DOMElementImpl.hpp 21 Nov 2002 14:13:01 -0000 1.5 @@ -138,6 +138,11 @@ virtual bool hasAttributeNS(const XMLCh *namespaceURI, const XMLCh *localName) const; + //Introduced in DOM level 3 + virtual void setIdAttribute(const XMLCh* name); + virtual void setIdAttributeNS(const XMLCh* namespaceURI, const XMLCh* localName); + virtual void setIdAttributeNode(const DOMAttr *idAttr); + // for handling of default attribute virtual DOMAttr* setDefaultAttributeNode(DOMAttr *newAttr); virtual DOMAttr* setDefaultAttributeNodeNS(DOMAttr *newAttr); 1.18 +54 -3 xml-xerces/c/src/xercesc/dom/impl/DOMElementImpl.cpp Index: DOMElementImpl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMElementImpl.cpp,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- DOMElementImpl.cpp 4 Nov 2002 15:07:34 -0000 1.17 +++ DOMElementImpl.cpp 21 Nov 2002 14:13:01 -0000 1.18 @@ -67,6 +67,7 @@ #include <xercesc/util/XMLUri.hpp> #include "DOMAttrMapImpl.hpp" +#include "DOMAttrImpl.hpp" #include "DOMDocumentImpl.hpp" #include "DOMParentNode.hpp" #include "DOMStringPool.hpp" @@ -183,7 +184,6 @@ return (DOMAttr *)fAttributes->getNamedItem(nam); }; -#include "stdio.h" DOMNamedNodeMap *DOMElementImpl::getAttributes() const { @@ -216,6 +216,7 @@ if (i >= 0) { DOMNode *att = fAttributes->removeNamedItemAt(i); + ((DOMAttrImpl *)att)->removeAttrFromIDNodeMap(); att->release(); } }; @@ -241,8 +242,10 @@ if (i >= 0) { // If it is in fact the right object, remove it. found = fAttributes->item(i); - if (found == oldAttr) + if (found == oldAttr) { fAttributes->removeNamedItemAt(i); + ((DOMAttrImpl *)oldAttr)->removeAttrFromIDNodeMap(); + } else throw DOMException(DOMException::NOT_FOUND_ERR, 0); @@ -271,6 +274,54 @@ newAttr->setNodeValue(val); }; +void DOMElementImpl::setIdAttribute(const XMLCh* name) +{ + if (fNode.isReadOnly()) + throw DOMException( + DOMException::NO_MODIFICATION_ALLOWED_ERR, 0); + + DOMAttr *attr = getAttributeNode(name); + + if (!attr) + throw DOMException(DOMException::NOT_FOUND_ERR, 0); + + ((DOMAttrImpl *)attr)->addAttrToIDNodeMap(); +}; + +void DOMElementImpl::setIdAttributeNS(const XMLCh* namespaceURI, const XMLCh* localName) { + + if (fNode.isReadOnly()) + throw DOMException( + DOMException::NO_MODIFICATION_ALLOWED_ERR, 0); + + DOMAttr *attr = getAttributeNodeNS(namespaceURI, localName); + + if (!attr) + throw DOMException(DOMException::NOT_FOUND_ERR, 0); + + ((DOMAttrImpl *)attr)->addAttrToIDNodeMap(); + +}; + + +void DOMElementImpl::setIdAttributeNode(const DOMAttr *idAttr) { + + if (fNode.isReadOnly()) + throw DOMException( + DOMException::NO_MODIFICATION_ALLOWED_ERR, 0); + + DOMAttr *attr; + const XMLCh* localName = idAttr->getLocalName(); + if (localName) + attr = getAttributeNodeNS(idAttr->getNamespaceURI(), idAttr->getLocalName()); + else + attr = getAttributeNode(idAttr->getName()); + + if(!attr) + throw DOMException(DOMException::NOT_FOUND_ERR, 0); + + ((DOMAttrImpl *)attr)->addAttrToIDNodeMap(); +}; DOMAttr * DOMElementImpl::setAttributeNode(DOMAttr *newAttr)
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]