[PATCH 4/8] Implement IXMLDOMCDATASection::splitText()

Nikolay Sivov nsivov at codeweavers.com
Sun Aug 29 16:32:11 CDT 2010


---
 dlls/msxml3/cdata.c        |   44 ++++++++++++-
 dlls/msxml3/domdoc.c       |    4 +-
 dlls/msxml3/tests/domdoc.c |  151 ++++++++++++++++++++++++++++++++++----------
 3 files changed, 160 insertions(+), 39 deletions(-)

diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 55340a4..373bbc8 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -725,10 +725,48 @@ static HRESULT WINAPI domcdata_splitText(
     LONG offset, IXMLDOMText **txtNode)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    FIXME("(%p)->(%d %p)\n", This, offset, txtNode);
-    return E_NOTIMPL;
-}
+    IXMLDOMDocument *doc;
+    LONG length = 0;
+    HRESULT hr;
+
+    TRACE("(%p)->(%d %p)\n", This, offset, txtNode);
+
+    if (!txtNode || offset < 0) return E_INVALIDARG;
+
+    *txtNode = NULL;
 
+    IXMLDOMCDATASection_get_length(iface, &length);
+
+    if (offset > length) return E_INVALIDARG;
+    if (offset == length) return S_FALSE;
+
+    hr = IXMLDOMCDATASection_get_ownerDocument(iface, &doc);
+    if (hr == S_OK)
+    {
+        BSTR data;
+
+        hr = IXMLDOMCDATASection_substringData(iface, offset, length - offset, &data);
+        if (hr == S_OK)
+        {
+            hr = IXMLDOMDocument_createTextNode(doc, data, txtNode);
+            if (hr == S_OK)
+            {
+                IXMLDOMNode *parent;
+
+                hr = IXMLDOMCDATASection_get_parentNode(iface, &parent);
+                if (hr == S_OK)
+                {
+                    IXMLDOMCDATASection_deleteData(iface, 0, offset);
+                    hr = IXMLDOMNode_appendChild(parent, (IXMLDOMNode*)*txtNode, NULL);
+                }
+            }
+            SysFreeString(data);
+        }
+        IXMLDOMDocument_Release(doc);
+    }
+
+    return hr;
+}
 
 static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
 {
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index d689b86..070dff4 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -2414,8 +2414,8 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, void **ppObj)
 
 IUnknown* create_domdoc( xmlNodePtr document )
 {
+    void* pObj = NULL;
     HRESULT hr;
-    LPVOID pObj = NULL;
 
     TRACE("(%p)\n", document);
 
@@ -2428,7 +2428,7 @@ IUnknown* create_domdoc( xmlNodePtr document )
 
 #else
 
-HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
+HRESULT DOMDocument_create(IUnknown *pUnkOuter, void **ppObj)
 {
     MESSAGE("This program tried to use a DOMDocument object, but\n"
             "libxml2 support was not present at compile time.\n");
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index aa16a03..70faa87 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -5609,6 +5609,87 @@ static void test_XSLPattern(void)
     free_bstrs();
 }
 
+static void test_splitText(void)
+{
+    IXMLDOMCDATASection *cdata;
+    IXMLDOMElement *root;
+    IXMLDOMDocument *doc;
+    IXMLDOMText *text;
+    IXMLDOMNode *node;
+    VARIANT var;
+    VARIANT_BOOL success;
+    LONG length;
+    HRESULT hr;
+
+    hr = CoCreateInstance( &CLSID_DOMDocument, NULL,
+        CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc );
+    ok( hr == S_OK, "got 0x%08x\n", hr );
+    if( hr != S_OK )
+        return;
+
+    hr = IXMLDOMDocument_loadXML(doc, _bstr_("<root></root>"), &success);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXMLDOMDocument_get_documentElement(doc, &root);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXMLDOMDocument_createCDATASection(doc, _bstr_("beautiful plumage"), &cdata);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    V_VT(&var) = VT_EMPTY;
+    hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)cdata, NULL);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    length = 0;
+    hr = IXMLDOMCDATASection_get_length(cdata, &length);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(length > 0, "got %d\n", length);
+
+    hr = IXMLDOMCDATASection_splitText(cdata, 0, NULL);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    text = (void*)0xdeadbeef;
+    /* negative offset */
+    hr = IXMLDOMCDATASection_splitText(cdata, -1, &text);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+    ok(text == (void*)0xdeadbeef, "got %p\n", text);
+
+    text = (void*)0xdeadbeef;
+    /* offset outside data */
+    hr = IXMLDOMCDATASection_splitText(cdata, length + 1, &text);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+    ok(text == 0, "got %p\n", text);
+
+    text = (void*)0xdeadbeef;
+    /* offset outside data */
+    hr = IXMLDOMCDATASection_splitText(cdata, length, &text);
+    ok(hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(text == 0, "got %p\n", text);
+
+    /* no empty node created */
+    node = (void*)0xdeadbeef;
+    hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node);
+    ok(hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(node == 0, "got %p\n", text);
+
+    hr = IXMLDOMCDATASection_splitText(cdata, 10, &text);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    length = 0;
+    hr = IXMLDOMText_get_length(text, &length);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(length == 7, "got %d\n", length);
+
+    hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    IXMLDOMNode_Release(node);
+
+    IXMLDOMText_Release(text);
+    IXMLDOMElement_Release(root);
+    IXMLDOMCDATASection_Release(cdata);
+    free_bstrs();
+}
+
 START_TEST(domdoc)
 {
     IXMLDOMDocument *doc;
@@ -5619,44 +5700,46 @@ START_TEST(domdoc)
     if (r != S_OK)
         return;
 
+    test_XMLHTTP();
+
     r = CoCreateInstance( &CLSID_DOMDocument, NULL,
-        CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
-    if (SUCCEEDED(r))
+        CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc );
+    if (FAILED(r))
     {
-        IXMLDOMDocument_Release(doc);
-
-        test_domdoc();
-        test_persiststreaminit();
-        test_domnode();
-        test_refs();
-        test_create();
-        test_getElementsByTagName();
-        test_get_text();
-        test_get_childNodes();
-        test_get_firstChild();
-        test_removeChild();
-        test_replaceChild();
-        test_removeNamedItem();
-        test_IXMLDOMDocument2();
-        test_XPath();
-        test_XSLPattern();
-        test_cloneNode();
-        test_xmlTypes();
-        test_nodeTypeTests();
-        test_DocumentSaveToDocument();
-        test_DocumentSaveToFile();
-        test_testTransforms();
-        test_Namespaces();
-        test_FormattingXML();
-        test_NodeTypeValue();
-        test_TransformWithLoadingLocalFile();
-        test_put_nodeValue();
-        test_document_IObjectSafety();
-    }
-    else
         win_skip("IXMLDOMDocument is not available (0x%08x)\n", r);
+        return;
+    }
 
-    test_XMLHTTP();
+    IXMLDOMDocument_Release(doc);
+
+    test_domdoc();
+    test_persiststreaminit();
+    test_domnode();
+    test_refs();
+    test_create();
+    test_getElementsByTagName();
+    test_get_text();
+    test_get_childNodes();
+    test_get_firstChild();
+    test_removeChild();
+    test_replaceChild();
+    test_removeNamedItem();
+    test_IXMLDOMDocument2();
+    test_XPath();
+    test_XSLPattern();
+    test_cloneNode();
+    test_xmlTypes();
+    test_nodeTypeTests();
+    test_DocumentSaveToDocument();
+    test_DocumentSaveToFile();
+    test_testTransforms();
+    test_Namespaces();
+    test_FormattingXML();
+    test_NodeTypeValue();
+    test_TransformWithLoadingLocalFile();
+    test_put_nodeValue();
+    test_document_IObjectSafety();
+    test_splitText();
 
     CoUninitialize();
 }
-- 
1.5.6.5



--------------080405040208040901010309--



More information about the wine-patches mailing list