Support more node types in IXMLDOMDocument_createNode(), reject ones that won't be unsupported.

Nikolay Sivov bunglehead at gmail.com
Thu Feb 11 18:48:46 CST 2010


---
 dlls/msxml3/domdoc.c       |   52 +++++++++++++++++++++++++++++--------------
 dlls/msxml3/node.c         |    3 ++
 dlls/msxml3/tests/domdoc.c |   29 ++++++++++++++++++++++++
 3 files changed, 67 insertions(+), 17 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index d4be6b6..6c80844 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1342,11 +1342,11 @@ static HRESULT WINAPI domdoc_createNode(
 {
     domdoc *This = impl_from_IXMLDOMDocument2( iface );
     DOMNodeType node_type;
-    xmlNodePtr xmlnode = NULL;
+    xmlNodePtr xmlnode;
     xmlChar *xml_name;
     HRESULT hr;
 
-    TRACE("(%p)->(type,%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node);
+    TRACE("(%p)->(%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node);
 
     if(!node) return E_INVALIDARG;
 
@@ -1354,8 +1354,7 @@ static HRESULT WINAPI domdoc_createNode(
         FIXME("nodes with namespaces currently not supported.\n");
 
     hr = get_node_type(Type, &node_type);
-    if(FAILED(hr))
-        return hr;
+    if(FAILED(hr)) return hr;
 
     TRACE("node_type %d\n", node_type);
 
@@ -1365,30 +1364,49 @@ static HRESULT WINAPI domdoc_createNode(
     {
     case NODE_ELEMENT:
         xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
-        *node = create_node(xmlnode);
-        TRACE("created %p\n", xmlnode);
         break;
     case NODE_ATTRIBUTE:
-        xmlnode = (xmlNode *)xmlNewProp(NULL, xml_name, NULL);
-        if(xmlnode)
-        {
-            xmlnode->doc = get_doc( This );
-
-            *node = (IXMLDOMNode*)create_attribute(xmlnode);
-        }
-
-        TRACE("created %p\n", xmlnode);
+        xmlnode = (xmlNodePtr)xmlNewDocProp(get_doc(This), xml_name, NULL);
         break;
-
+    case NODE_TEXT:
+        xmlnode = (xmlNodePtr)xmlNewDocText(get_doc(This), NULL);
+        break;
+    case NODE_CDATA_SECTION:
+        xmlnode = xmlNewCDataBlock(get_doc(This), NULL, 0);
+        break;
+    case NODE_PROCESSING_INSTRUCTION:
+#ifdef HAVE_XMLNEWDOCPI
+        xmlnode = xmlNewDocPI(get_doc(This), xml_name, NULL);
+#else
+        FIXME("xmlNewDocPI() not supported, use libxml2 2.6.15 or greater\n");
+        xmlnode = NULL;
+#endif
+        break;
+    case NODE_COMMENT:
+        xmlnode = xmlNewDocComment(get_doc(This), NULL);
+        break;
+    case NODE_DOCUMENT_FRAGMENT:
+        xmlnode = xmlNewDocFragment(get_doc(This));
+        break;
+    /* unsupported types */
+    case NODE_DOCUMENT:
+    case NODE_DOCUMENT_TYPE:
+    case NODE_ENTITY:
+    case NODE_NOTATION:
+        heap_free(xml_name);
+        return E_INVALIDARG;
     default:
         FIXME("unhandled node type %d\n", node_type);
+        xmlnode = NULL;
         break;
     }
 
+    *node = create_node(xmlnode);
     heap_free(xml_name);
 
-    if(xmlnode && *node)
+    if(*node)
     {
+        TRACE("created node (%d, %p, %p)\n", node_type, *node, xmlnode);
         xmldoc_add_orphan(xmlnode->doc, xmlnode);
         return S_OK;
     }
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index da9afd2..5691c52 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1752,6 +1752,9 @@ IXMLDOMNode *create_node( xmlNodePtr node )
     case XML_DOCUMENT_NODE:
         pUnk = create_domdoc( node );
         break;
+    case XML_DOCUMENT_FRAG_NODE:
+        pUnk = create_doc_fragment( node );
+        break;
     default: {
         xmlnode *new_node;
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 3ef37fc..8f0ac8b 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1657,6 +1657,35 @@ static void test_create(void)
     if( r != S_OK )
         return;
 
+    /* types not supported for creation */
+    V_VT(&var) = VT_I1;
+    V_I1(&var) = NODE_DOCUMENT;
+    node = (IXMLDOMNode*)0x1;
+    r = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
+    ok( r == E_INVALIDARG, "returns %08x\n", r );
+    ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
+
+    V_VT(&var) = VT_I1;
+    V_I1(&var) = NODE_DOCUMENT_TYPE;
+    node = (IXMLDOMNode*)0x1;
+    r = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
+    ok( r == E_INVALIDARG, "returns %08x\n", r );
+    ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
+
+    V_VT(&var) = VT_I1;
+    V_I1(&var) = NODE_ENTITY;
+    node = (IXMLDOMNode*)0x1;
+    r = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
+    ok( r == E_INVALIDARG, "returns %08x\n", r );
+    ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
+
+    V_VT(&var) = VT_I1;
+    V_I1(&var) = NODE_NOTATION;
+    node = (IXMLDOMNode*)0x1;
+    r = IXMLDOMDocument_createNode( doc, var, NULL, NULL, &node );
+    ok( r == E_INVALIDARG, "returns %08x\n", r );
+    ok( node == (void*)0x1, "expected same ptr, got %p\n", node);
+
     V_VT(&var) = VT_I1;
     V_I1(&var) = NODE_ELEMENT;
     str = SysAllocString( szlc );
-- 
1.5.6.5


--=-jrLmxO4tFEdphh+xTrez--




More information about the wine-patches mailing list