[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