[PATCH] Implement cloneNode

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Sun Dec 2 15:17:48 CST 2007


---
 dlls/msxml3/node.c         |   32 +++++++++++-
 dlls/msxml3/tests/domdoc.c |  124 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 154 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index e52718e..20f9472 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -519,8 +519,36 @@ static HRESULT WINAPI xmlnode_cloneNode(
     VARIANT_BOOL deep,
     IXMLDOMNode** cloneRoot)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    xmlnode *This = impl_from_IXMLDOMNode( iface );
+    xmlNodePtr pClone = NULL;
+    IXMLDOMNode *pNode = NULL;
+
+    TRACE("%p (%d)\n", This, deep);    
+
+    if(!cloneRoot)
+        return E_INVALIDARG;
+    
+    pClone = xmlCopyNode(This->node, deep ? 1 : 2);
+    if(pClone)
+    {
+        pClone->doc = This->node->doc;
+        
+        pNode = create_node(pClone);
+        if(!pNode)
+        {
+            ERR("Copy failed\n"); 
+            return E_FAIL;			
+        }
+
+        *cloneRoot = pNode;
+    }
+    else
+    {
+        ERR("Copy failed\n"); 
+        return E_FAIL;
+    }
+
+    return S_OK;
 }
 
 static HRESULT WINAPI xmlnode_get_nodeTypeString(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 937e2fd..bff4e08 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1594,6 +1594,129 @@ static void test_XPath(void)
     free_bstrs();
 }
 
+static void test_cloneNode(void )
+{
+    // NOTE TO SELF - r = IXMLDOMNode_selectSingleNode(node, _bstr_("br"), &node); //test
+    IXMLDOMDocument *doc = NULL;
+    VARIANT_BOOL b;
+    IXMLDOMNodeList *pList;
+    IXMLDOMNamedNodeMap *mapAttr;
+    long nLength = 0, nLength1 = 0;
+    long nAttrCnt = 0, nAttrCnt1 = 0; 
+    IXMLDOMNode *node;
+    IXMLDOMNode *node_clone;
+    HRESULT r;
+    BSTR str;
+
+    r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
+    if( r != S_OK )
+        return;
+
+    str = SysAllocString( szComplete4 );
+    ole_check(IXMLDOMDocument_loadXML(doc, str, &b));
+    ok(b == VARIANT_TRUE, "failed to load XML string\n");
+    SysFreeString(str);
+
+    if(!b)
+        return;
+
+    r = IXMLDOMNode_selectSingleNode(doc, _bstr_("lc/pr"), &node);
+    ok( r == S_OK, "ret %08x\n", r );
+    ok( node != NULL, "node %p\n", node );
+
+    if(!node)
+    {
+        IXMLDOMDocument_Release(doc);
+        return;
+    }
+
+    /* All Children */
+    r = IXMLDOMNode_cloneNode(node, VARIANT_TRUE, &node_clone);
+    ok( r == S_OK, "ret %08x\n", r );
+    ok( node_clone != NULL, "node %p\n", node );
+
+    if(!node_clone)
+    {
+        IXMLDOMDocument_Release(doc);
+        IXMLDOMNode_Release(node);
+        return;
+    }
+
+    r = IXMLDOMNode_get_childNodes(node, &pList);
+    ok( r == S_OK, "ret %08x\n", r );
+    if (pList)
+	{						
+		IXMLDOMNodeList_get_length(pList, &nLength);
+		IXMLDOMNodeList_Release(pList);
+	}
+
+    r = IXMLDOMNode_get_attributes(node, &mapAttr);
+    ok( r == S_OK, "ret %08x\n", r );
+    if(mapAttr)
+    {
+        IXMLDOMNamedNodeMap_get_length(mapAttr, &nAttrCnt);
+        IXMLDOMNamedNodeMap_Release(mapAttr);
+    }
+
+    r = IXMLDOMNode_get_childNodes(node_clone, &pList);
+    ok( r == S_OK, "ret %08x\n", r );
+    if (pList)
+	{						
+		IXMLDOMNodeList_get_length(pList, &nLength1);
+		IXMLDOMNodeList_Release(pList);
+	}
+
+    r = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
+    ok( r == S_OK, "ret %08x\n", r );
+    if(mapAttr)
+    {
+        IXMLDOMNamedNodeMap_get_length(mapAttr, &nAttrCnt1);
+        IXMLDOMNamedNodeMap_Release(mapAttr);
+    }
+
+    ok(nLength == nLength1, "wrong Child count (%ld, %ld)\n", nLength, nLength1);
+    ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%ld, %ld)\n", nAttrCnt, nAttrCnt1);
+    IXMLDOMNode_Release(node_clone);
+
+    /* No Children */
+    r = IXMLDOMNode_cloneNode(node, VARIANT_FALSE, &node_clone);
+    ok( r == S_OK, "ret %08x\n", r );
+    ok( node_clone != NULL, "node %p\n", node );
+
+    if(!node_clone)
+    {
+        IXMLDOMDocument_Release(doc);
+        IXMLDOMNode_Release(node);
+        return;
+    }
+
+    r = IXMLDOMNode_get_childNodes(node_clone, &pList);
+    ok( r == S_OK, "ret %08x\n", r );
+    if (pList)
+	{						
+		IXMLDOMNodeList_get_length(pList, &nLength1);
+        ok( nLength1 == 0, "Length should be 0 (%ld)\n", nLength1);
+		IXMLDOMNodeList_Release(pList);
+	}
+
+    r = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
+    ok( r == S_OK, "ret %08x\n", r );
+    if(mapAttr)
+    {
+        IXMLDOMNamedNodeMap_get_length(mapAttr, &nAttrCnt1);
+        ok( nAttrCnt1 == 3, "Attribute count should be 3 (%ld)\n", nAttrCnt1);
+        IXMLDOMNamedNodeMap_Release(mapAttr);
+    }
+
+    ok(nLength != nLength1, "wrong Child count (%ld, %ld)\n", nLength, nLength1);
+    ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%ld, %ld)\n", nAttrCnt, nAttrCnt1);
+    IXMLDOMNode_Release(node_clone);
+
+
+    IXMLDOMNode_Release(node);
+    IXMLDOMDocument_Release(doc);
+}
+
 START_TEST(domdoc)
 {
     HRESULT r;
@@ -1612,6 +1735,7 @@ START_TEST(domdoc)
     test_XMLHTTP();
     test_IXMLDOMDocument2();
     test_XPath();
+    test_cloneNode();
 
     CoUninitialize();
 }
-- 
1.5.3.3


--------------070008090506090105090903--




More information about the wine-patches mailing list