[PATCH 2/2] Implement IXMLDOMText::deleteData()

Nikolay Sivov bunglehead at gmail.com
Thu Jan 28 18:47:03 CST 2010


---
 dlls/msxml3/tests/domdoc.c |   71 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/text.c         |   43 +++++++++++++++++++++++++-
 2 files changed, 112 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index dab220b..bc052be 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -868,6 +868,77 @@ static void test_domdoc( void )
         ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
         SysFreeString(str);
 
+        /* delete data */
+        /* invalid arguments */
+        r = IXMLDOMText_deleteData(nodetext, -1, 1);
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, 0, 0);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, 0, -1);
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 43, "expected 43 got %d\n", nLength);
+
+        r = IXMLDOMText_deleteData(nodetext, nLength, 1);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, nLength+1, 1);
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        /* delete from start */
+        r = IXMLDOMText_deleteData(nodetext, 0, 5);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 38, "expected 38 got %d\n", nLength);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        /* whitespace preserving needs to be handled here */
+        todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
+        /* delete from end */
+        r = IXMLDOMText_deleteData(nodetext, 35, 3);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 35, "expected 35 got %d\n", nLength);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
+        /* delete from inside */
+        r = IXMLDOMText_deleteData(nodetext, 1, 33);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 2, "expected 2 got %d\n", nLength);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        todo_wine ok( !lstrcmpW( str, _bstr_("") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
+        /* delete whole data ... */
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, 0, nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        /* ... and try again with empty string */
+        r = IXMLDOMText_deleteData(nodetext, 0, nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+
         /* test put_data */
         V_VT(&var) = VT_BSTR;
         V_BSTR(&var) = SysAllocString(szstr1);
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 6380a0e..d9736b1 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -686,8 +686,47 @@ static HRESULT WINAPI domtext_deleteData(
     IXMLDOMText *iface,
     LONG offset, LONG count)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    HRESULT hr;
+    LONG len = -1;
+    BSTR str;
+
+    TRACE("%p %d %d\n", iface, offset, count);
+
+    hr = IXMLDOMText_get_length(iface, &len);
+    if(hr != S_OK) return hr;
+
+    if((offset < 0) || (offset > len) || (count < 0))
+        return E_INVALIDARG;
+
+    if(len == 0) return S_OK;
+
+    /* cutting start or end */
+    if((offset == 0) || ((count + offset) >= len))
+    {
+        if(offset == 0)
+            IXMLDOMText_substringData(iface, count, len - count, &str);
+        else
+            IXMLDOMText_substringData(iface, 0, offset, &str);
+        hr = IXMLDOMText_put_data(iface, str);
+    }
+    else
+    /* cutting from the inside */
+    {
+        BSTR str_end;
+
+        IXMLDOMText_substringData(iface, 0, offset, &str);
+        IXMLDOMText_substringData(iface, offset + count, len - count, &str_end);
+
+        hr = IXMLDOMText_put_data(iface, str);
+        if(hr == S_OK)
+            hr = IXMLDOMText_appendData(iface, str_end);
+
+        SysFreeString(str_end);
+    }
+
+    SysFreeString(str);
+
+    return hr;
 }
 
 static HRESULT WINAPI domtext_replaceData(
-- 
1.5.6.5


--=-sebnF/3uSyo8Uf+W4CLQ--




More information about the wine-patches mailing list