amassari 2004/12/28 09:31:19
Modified: c/src/xercesc/dom/impl DOMDocumentImpl.cpp
DOMDocumentTypeImpl.cpp
c/src/xercesc/util XMLUni.cpp XMLUni.hpp
Log:
Export the internal DOMDocumentTypeImpl interface in a safe way, so that
DOMDocument::cloneNode can clone the element definitions (bug# 647)
Revision Changes Path
1.59 +19 -7 xml-xerces/c/src/xercesc/dom/impl/DOMDocumentImpl.cpp
Index: DOMDocumentImpl.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMDocumentImpl.cpp,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- DOMDocumentImpl.cpp 8 Sep 2004 13:55:51 -0000 1.58
+++ DOMDocumentImpl.cpp 28 Dec 2004 17:31:19 -0000 1.59
@@ -1016,7 +1016,7 @@
for(XMLSize_t i=0;i<srcattr->getLength();++i)
{
DOMAttr *attr = (DOMAttr *) srcattr->item(i);
- if (attr -> getSpecified()) { // not a default attribute
+ if (attr -> getSpecified() || cloningDoc) { // not a
default attribute or we are in the process of cloning the elements from inside
a DOMDocumentType
DOMAttr *nattr = (DOMAttr *) importNode(attr, true,
false);
if (attr -> getLocalName() == 0)
newelement->setAttributeNode(nattr);
@@ -1111,11 +1111,23 @@
((DOMDocumentTypeImpl
*)newdoctype)->setInternalSubset(intSubset);
}
- // NOTE: At this time, the DOM definition of DocumentType
- // doesn't cover Elements and their Attributes. domimpl's
- // extentions in that area will not be preserved, even if
- // copying from domimpl to domimpl. We could special-case
- // that here. Arguably we should. Consider. ?????
+ // detect if the DTD being copied is our own implementation, and
use the provided methods
+ try
+ {
+ DOMDocumentTypeImpl*
docTypeImpl=(DOMDocumentTypeImpl*)(srcdoctype->getInterface(XMLUni::fgXercescInterfaceDOMDocumentTypeImpl));
+ if(docTypeImpl)
+ {
+ smap = docTypeImpl->getElements();
+ tmap = ((DOMDocumentTypeImpl
*)newdoctype)->getElements();
+ if (smap != 0) {
+ for(XMLSize_t i = 0; i < smap->getLength(); i++) {
+ tmap->setNamedItem(importNode(smap->item(i),
true, true));
+ }
+ }
+ }
+ } catch(DOMException&) {
+ }
+
newnode = newdoctype;
}
break;
1.27 +8 -2 xml-xerces/c/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp
Index: DOMDocumentTypeImpl.cpp
===================================================================
RCS file:
/home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- DOMDocumentTypeImpl.cpp 8 Sep 2004 13:55:51 -0000 1.26
+++ DOMDocumentTypeImpl.cpp 28 Dec 2004 17:31:19 -0000 1.27
@@ -439,7 +439,6 @@
const XMLCh* DOMDocumentTypeImpl::lookupNamespacePrefix(const
XMLCh* namespaceURI, bool useDefault) const {return
fNode.lookupNamespacePrefix(namespaceURI, useDefault); }
bool DOMDocumentTypeImpl::isDefaultNamespace(const
XMLCh* namespaceURI) const {return fNode.isDefaultNamespace(namespaceURI); }
const XMLCh* DOMDocumentTypeImpl::lookupNamespaceURI(const
XMLCh* prefix) const {return fNode.lookupNamespaceURI(prefix); }
- DOMNode* DOMDocumentTypeImpl::getInterface(const XMLCh*
feature) {return fNode.getInterface(feature); }
bool DOMDocumentTypeImpl::isEqualNode(const DOMNode* arg) const
@@ -532,6 +531,13 @@
}
return fParent.isEqualNode(arg);
+}
+
+DOMNode * DOMDocumentTypeImpl::getInterface(const XMLCh* feature)
+{
+ if(XMLString::equals(feature,
XMLUni::fgXercescInterfaceDOMDocumentTypeImpl))
+ return (DOMNode*)(DOMDocumentTypeImpl*)this;
+ return fNode.getInterface(feature);
}
XERCES_CPP_NAMESPACE_END
1.47 +8 -1 xml-xerces/c/src/xercesc/util/XMLUni.cpp
Index: XMLUni.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLUni.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- XMLUni.cpp 7 Dec 2004 19:45:43 -0000 1.46
+++ XMLUni.cpp 28 Dec 2004 17:31:19 -0000 1.47
@@ -1464,6 +1464,13 @@
chLatin_o, chNull
};
+const XMLCh XMLUni::fgXercescInterfaceDOMDocumentTypeImpl[] =
+{
+ chLatin_D, chLatin_O, chLatin_M, chLatin_D, chLatin_o, chLatin_c,
chLatin_u,
+ chLatin_m, chLatin_e, chLatin_n, chLatin_t, chLatin_T, chLatin_y,
chLatin_p,
+ chLatin_e, chLatin_I, chLatin_m, chLatin_p, chLatin_l, chNull
+};
+
// en_US
const char XMLUni::fgXercescDefaultLocale[] = "en_US";
1.42 +2 -1 xml-xerces/c/src/xercesc/util/XMLUni.hpp
Index: XMLUni.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLUni.hpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- XMLUni.hpp 7 Dec 2004 19:45:43 -0000 1.41
+++ XMLUni.hpp 28 Dec 2004 17:31:19 -0000 1.42
@@ -262,6 +262,7 @@
// Private interface names
static const XMLCh fgXercescInterfacePSVITypeInfo[];
+ static const XMLCh fgXercescInterfaceDOMDocumentTypeImpl[];
// Locale
static const char fgXercescDefaultLocale[];
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]