Module: wine Branch: master Commit: a03bc7269092dccb97c1badc045ad7b40f3a6110 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a03bc7269092dccb97c1badc04...
Author: Nikolay Sivov bunglehead@gmail.com Date: Fri Jan 29 03:47:03 2010 +0300
msxml3: Implement IXMLDOMText::deleteData().
---
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(