[PATCH 0/8] MR10679: msxml3: Reduce duplication in IXMLDOMCharacterData methods.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 194 +++++++++++++++++++++++++++++++++++-- 1 file changed, 188 insertions(+), 6 deletions(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index bdd88779b88..f89fa2e5e2f 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -7640,14 +7640,15 @@ static void test_XSLPattern(void) static void test_splitText(void) { IXMLDOMCDATASection *cdata; + DOMNodeType node_type; IXMLDOMElement *root; IXMLDOMDocument *doc; IXMLDOMText *text, *text2; IXMLDOMNode *node; - VARIANT var; VARIANT_BOOL success; LONG length; HRESULT hr; + BSTR str; doc = create_document(&IID_IXMLDOMDocument); @@ -7657,17 +7658,17 @@ static void test_splitText(void) hr = IXMLDOMDocument_get_documentElement(doc, &root); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + /* CDATA */ hr = IXMLDOMDocument_createCDATASection(doc, _bstr_("beautiful plumage"), &cdata); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - V_VT(&var) = VT_EMPTY; hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode*)cdata, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); length = 0; hr = IXMLDOMCDATASection_get_length(cdata, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length > 0, "got %ld\n", length); + ok(length == 17, "Unexpected length %ld.\n", length); hr = IXMLDOMCDATASection_splitText(cdata, 0, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); @@ -7682,23 +7683,28 @@ static void test_splitText(void) /* offset outside data */ hr = IXMLDOMCDATASection_splitText(cdata, length + 1, &text); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - ok(text == 0, "got %p\n", text); + ok(!text, "Unexpected pointer %p.\n", text); text = (void*)0xdeadbeef; /* offset outside data */ hr = IXMLDOMCDATASection_splitText(cdata, length, &text); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); - ok(text == 0, "got %p\n", text); + ok(!text, "Unexpected pointer %p.\n", text); /* no empty node created */ node = (void*)0xdeadbeef; hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); - ok(node == 0, "got %p\n", text); + ok(!node, "Unexpected pointer %p.\n", node); hr = IXMLDOMCDATASection_splitText(cdata, 10, &text); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMText_get_nodeType(text, &node_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); + length = 0; hr = IXMLDOMText_get_length(text, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -7749,8 +7755,184 @@ static void test_splitText(void) if (node) IXMLDOMNode_Release(node); IXMLDOMText_Release(text); + + /* Zero offset */ + length = 0; + hr = IXMLDOMCDATASection_get_length(cdata, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(length == 10, "Unexpected length %ld.\n", length); + + hr = IXMLDOMCDATASection_splitText(cdata, 0, &text); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMText_get_nodeType(text, &node_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); + + hr = IXMLDOMText_get_length(text, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(length == 10, "Unexpected length %ld.\n", length); + + hr = IXMLDOMCDATASection_get_length(cdata, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!length, "Unexpected length %ld.\n", length); + + IXMLDOMText_Release(text); + + IXMLDOMElement_Release(root); + IXMLDOMCDATASection_Release(cdata); + + /* Text */ + hr = IXMLDOMDocument_createElement(doc, _bstr_("e"), &root); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMDocument_createTextNode(doc, _bstr_("beautiful plumage"), &text); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_appendChild(root, (IXMLDOMNode *)text, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + length = 0; + hr = IXMLDOMText_get_length(text, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(length == 17, "Unexpected length %ld.\n", length); + + hr = IXMLDOMText_splitText(text, 0, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + text2 = (void *)0xdeadbeef; + /* negative offset */ + hr = IXMLDOMText_splitText(text, -1, &text2); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(text2 == (void *)0xdeadbeef, "Unexpected pointer %p.\n", text2); + + text2 = (void *)0xdeadbeef; + /* offset outside data */ + hr = IXMLDOMText_splitText(text, length + 1, &text2); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(!text2, "Unexpected pointer %p.\n", text); + + text2 = (void *)0xdeadbeef; + /* offset outside data */ + hr = IXMLDOMText_splitText(text, length, &text2); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!text2, "Unexpected pointer %p.\n", text2); + + /* no empty node created */ + node = (void *)0xdeadbeef; + hr = IXMLDOMText_get_nextSibling(text, &node); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(!node, "Unexpected pointer %p.\n", node); + + hr = IXMLDOMText_splitText(text, 10, &text2); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + +if (hr == S_OK) +{ + hr = IXMLDOMText_get_nodeType(text2, &node_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(node_type == NODE_TEXT, "Unexpected node type %d.\n", node_type); + + length = 0; + hr = IXMLDOMText_get_length(text2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(length == 7, "Unexpected length %ld.\n", length); + + hr = IXMLDOMText_get_nextSibling(text, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMNode_Release(node); + + /* Zero offset */ + hr = IXMLDOMText_get_previousSibling(text, &node); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMText_splitText(text, 0, &text2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMText_get_nodeType(text2, &node_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(node_type == NODE_TEXT, "Unexpected node type %d.\n", node_type); + + length = 0; + hr = IXMLDOMText_get_length(text2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(length == 10, "Unexpected length %ld.\n", length); + + hr = IXMLDOMText_get_length(text, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!length, "Unexpected length %ld.\n", length); + + hr = IXMLDOMText_get_nextSibling(text, &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMNode_get_text(node, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(str, L"beautiful"), "Unexpected text %s.\n", debugstr_w(str)); + SysFreeString(str); + IXMLDOMNode_Release(node); + + IXMLDOMText_Release(text2); +} + IXMLDOMText_Release(text); + IXMLDOMElement_Release(root); + + /* Split with detached nodes */ + hr = IXMLDOMDocument_createCDATASection(doc, _bstr_("beautiful plumage"), &cdata); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + text = NULL; + hr = IXMLDOMCDATASection_splitText(cdata, 9, &text); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMText_get_nodeType(text, &node_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); + hr = IXMLDOMCDATASection_get_length(cdata, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(length == 9, "Unexpected length %ld.\n", length); + hr = IXMLDOMText_get_length(text, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(length == 8, "Unexpected length %ld.\n", length); + IXMLDOMText_Release(text); + IXMLDOMCDATASection_Release(cdata); + + hr = IXMLDOMDocument_createTextNode(doc, _bstr_("beautiful plumage"), &text); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + text2 = NULL; + hr = IXMLDOMText_splitText(text, 9, &text2); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMText_get_nextSibling(text, &node); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); +if (text2) +{ + hr = IXMLDOMText_get_nodeType(text2, &node_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(node_type == NODE_TEXT, "Unexpected node type %d.\n", node_type); + hr = IXMLDOMText_get_length(text, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(length == 9, "Unexpected length %ld.\n", length); + hr = IXMLDOMText_get_length(text2, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(length == 8, "Unexpected length %ld.\n", length); + IXMLDOMText_Release(text2); +} + IXMLDOMText_Release(text); + + IXMLDOMDocument_Release(doc); free_bstrs(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 47 ++++--------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 43 +++++++++++++++++++++++++++++++++ dlls/msxml3/tests/domdoc.c | 32 +++++++------------------ dlls/msxml3/text.c | 21 ++++------------- 5 files changed, 60 insertions(+), 84 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 8b5fd378700..898c77af579 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -636,52 +636,13 @@ static HRESULT WINAPI domcdata_replaceData( return hr; } -static HRESULT WINAPI domcdata_splitText( - IXMLDOMCDATASection *iface, - LONG offset, IXMLDOMText **txtNode) +static HRESULT WINAPI domcdata_splitText(IXMLDOMCDATASection *iface, LONG offset, IXMLDOMText **node) { - IXMLDOMDocument *doc; - LONG length = 0; - HRESULT hr; - - TRACE("%p, %ld, %p.\n", iface, 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; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); - 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); - IXMLDOMNode_Release(parent); - } - } - SysFreeString(data); - } - IXMLDOMDocument_Release(doc); - } + TRACE("%p, %ld, %p.\n", iface, offset, node); - return hr; + return node_split_text(cdata->node, offset, node); } static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl = diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index b83b38f1af0..4346166c783 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -329,6 +329,7 @@ extern HRESULT node_save(struct domnode *, IStream *); extern HRESULT node_get_elements_by_tagname(struct domnode *,BSTR,IXMLDOMNodeList**); extern HRESULT node_validate(struct domnode *, IXMLDOMNode *, IXMLDOMParseError **); extern void node_move_children(struct domnode *dst, struct domnode *src); +extern HRESULT node_split_text(struct domnode *, LONG, IXMLDOMText **); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 31aa300a7eb..bcd331e3a83 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4587,3 +4587,46 @@ void node_move_children(struct domnode *dest, struct domnode *src) domnode_append_child(dest, child); } } + +HRESULT node_split_text(struct domnode *node, LONG offset, IXMLDOMText **out) +{ + struct domnode *child; + ULONG length; + HRESULT hr; + BSTR head; + + if (!out || offset < 0) + return E_INVALIDARG; + + *out = NULL; + + length = SysStringLen(node->data); + if (offset > length) + return E_INVALIDARG; + if (offset == length) + return S_FALSE; + + if (FAILED(hr = domnode_create(node->type, NULL, 0, NULL, 0, node->owner, &child))) + return hr; + + if (offset) + { + child->data = SysAllocStringLen(node->data + offset, length - offset); + head = SysAllocStringLen(node->data, offset); + SysFreeString(node->data); + node->data = head; + } + else + { + child->data = node->data; + node->data = NULL; + } + + if (node->parent) + domnode_insert_domnode(node->parent, child, domnode_get_next_sibling(node)); + + if (FAILED(hr = create_node(child, (IXMLDOMNode **)out))) + domnode_unlink_child(child); + + return hr; +} diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index f89fa2e5e2f..3b1b6851a82 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -7702,7 +7702,6 @@ static void test_splitText(void) hr = IXMLDOMText_get_nodeType(text, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); length = 0; @@ -7744,15 +7743,15 @@ static void test_splitText(void) ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); ok(text2 == 0, "got %p\n", text); - text2 = 0; + text2 = NULL; hr = IXMLDOMText_splitText(text, 4, &text2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (text2) IXMLDOMText_Release(text2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMText_Release(text2); - node = 0; + node = NULL; hr = IXMLDOMText_get_nextSibling(text, &node); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (node) IXMLDOMNode_Release(node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IXMLDOMNode_Release(node); IXMLDOMText_Release(text); @@ -7760,7 +7759,6 @@ static void test_splitText(void) length = 0; hr = IXMLDOMCDATASection_get_length(cdata, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 10, "Unexpected length %ld.\n", length); hr = IXMLDOMCDATASection_splitText(cdata, 0, &text); @@ -7768,17 +7766,14 @@ static void test_splitText(void) hr = IXMLDOMText_get_nodeType(text, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); hr = IXMLDOMText_get_length(text, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 10, "Unexpected length %ld.\n", length); hr = IXMLDOMCDATASection_get_length(cdata, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!length, "Unexpected length %ld.\n", length); IXMLDOMText_Release(text); @@ -7829,11 +7824,8 @@ static void test_splitText(void) ok(!node, "Unexpected pointer %p.\n", node); hr = IXMLDOMText_splitText(text, 10, &text2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -if (hr == S_OK) -{ hr = IXMLDOMText_get_nodeType(text2, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(node_type == NODE_TEXT, "Unexpected node type %d.\n", node_type); @@ -7876,7 +7868,7 @@ if (hr == S_OK) IXMLDOMNode_Release(node); IXMLDOMText_Release(text2); -} + IXMLDOMText_Release(text); IXMLDOMElement_Release(root); @@ -7887,17 +7879,14 @@ if (hr == S_OK) text = NULL; hr = IXMLDOMCDATASection_splitText(cdata, 9, &text); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMCDATASection_get_nextSibling(cdata, &node); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMText_get_nodeType(text, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_CDATA_SECTION, "Unexpected node type %d.\n", node_type); hr = IXMLDOMCDATASection_get_length(cdata, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 9, "Unexpected length %ld.\n", length); hr = IXMLDOMText_get_length(text, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -7911,25 +7900,20 @@ if (hr == S_OK) text2 = NULL; hr = IXMLDOMText_splitText(text, 9, &text2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IXMLDOMText_get_nextSibling(text, &node); ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); -if (text2) -{ hr = IXMLDOMText_get_nodeType(text2, &node_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(node_type == NODE_TEXT, "Unexpected node type %d.\n", node_type); hr = IXMLDOMText_get_length(text, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(length == 9, "Unexpected length %ld.\n", length); hr = IXMLDOMText_get_length(text2, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(length == 8, "Unexpected length %ld.\n", length); IXMLDOMText_Release(text2); -} + IXMLDOMText_Release(text); IXMLDOMDocument_Release(doc); diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index 70edaf12367..dbada1dbaa2 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -702,26 +702,13 @@ static HRESULT WINAPI domtext_replaceData( return hr; } -static HRESULT WINAPI domtext_splitText( - IXMLDOMText *iface, - LONG offset, IXMLDOMText **txtNode) +static HRESULT WINAPI domtext_splitText(IXMLDOMText *iface, LONG offset, IXMLDOMText **node) { - LONG length = 0; - - TRACE("%p, %ld, %p.\n", iface, offset, txtNode); - - if (!txtNode || offset < 0) return E_INVALIDARG; - - *txtNode = NULL; - - IXMLDOMText_get_length(iface, &length); - - if (offset > length) return E_INVALIDARG; - if (offset == length) return S_FALSE; + domtext *text = impl_from_IXMLDOMText(iface); - FIXME("adjacent text nodes are not supported\n"); + TRACE("%p, %ld, %p.\n", iface, offset, node); - return E_NOTIMPL; + return node_split_text(text->node, offset, node); } static const struct IXMLDOMTextVtbl domtext_vtbl = -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 44 +++---------------------------------- dlls/msxml3/comment.c | 44 +++---------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 42 +++++++++++++++++++++++++++++++++++ dlls/msxml3/text.c | 44 +++---------------------------------- 5 files changed, 52 insertions(+), 123 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 898c77af579..d11fcf2925d 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -573,51 +573,13 @@ static HRESULT WINAPI domcdata_insertData( return hr; } -static HRESULT WINAPI domcdata_deleteData( - IXMLDOMCDATASection *iface, - LONG offset, LONG count) +static HRESULT WINAPI domcdata_deleteData(IXMLDOMCDATASection *iface, LONG offset, LONG count) { - HRESULT hr; - LONG len = -1; - BSTR str; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); TRACE("%p, %ld, %ld.\n", iface, offset, count); - hr = IXMLDOMCDATASection_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) - IXMLDOMCDATASection_substringData(iface, count, len - count, &str); - else - IXMLDOMCDATASection_substringData(iface, 0, offset, &str); - hr = IXMLDOMCDATASection_put_data(iface, str); - } - else - /* cutting from the inside */ - { - BSTR str_end; - - IXMLDOMCDATASection_substringData(iface, 0, offset, &str); - IXMLDOMCDATASection_substringData(iface, offset + count, len - count, &str_end); - - hr = IXMLDOMCDATASection_put_data(iface, str); - if(hr == S_OK) - hr = IXMLDOMCDATASection_appendData(iface, str_end); - - SysFreeString(str_end); - } - - SysFreeString(str); - - return hr; + return node_delete_data(cdata->node, offset, count); } static HRESULT WINAPI domcdata_replaceData( diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index fe53ac57e05..26a48d1b014 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -577,51 +577,13 @@ static HRESULT WINAPI domcomment_insertData( return hr; } -static HRESULT WINAPI domcomment_deleteData( - IXMLDOMComment *iface, - LONG offset, LONG count) +static HRESULT WINAPI domcomment_deleteData(IXMLDOMComment *iface, LONG offset, LONG count) { - HRESULT hr; - LONG len = -1; - BSTR str; + domcomment *comment = impl_from_IXMLDOMComment(iface); TRACE("%p, %ld, %ld.\n", iface, offset, count); - hr = IXMLDOMComment_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) - IXMLDOMComment_substringData(iface, count, len - count, &str); - else - IXMLDOMComment_substringData(iface, 0, offset, &str); - hr = IXMLDOMComment_put_data(iface, str); - } - else - /* cutting from the inside */ - { - BSTR str_end; - - IXMLDOMComment_substringData(iface, 0, offset, &str); - IXMLDOMComment_substringData(iface, offset + count, len - count, &str_end); - - hr = IXMLDOMComment_put_data(iface, str); - if(hr == S_OK) - hr = IXMLDOMComment_appendData(iface, str_end); - - SysFreeString(str_end); - } - - SysFreeString(str); - - return hr; + return node_delete_data(comment->node, offset, count); } static HRESULT WINAPI domcomment_replaceData( diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 4346166c783..1df1c409903 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -330,6 +330,7 @@ extern HRESULT node_get_elements_by_tagname(struct domnode *,BSTR,IXMLDOMNodeLis extern HRESULT node_validate(struct domnode *, IXMLDOMNode *, IXMLDOMParseError **); extern void node_move_children(struct domnode *dst, struct domnode *src); extern HRESULT node_split_text(struct domnode *, LONG, IXMLDOMText **); +extern HRESULT node_delete_data(struct domnode *, LONG, LONG); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index bcd331e3a83..b8c00d8f293 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4630,3 +4630,45 @@ HRESULT node_split_text(struct domnode *node, LONG offset, IXMLDOMText **out) return hr; } + +HRESULT node_delete_data(struct domnode *node, LONG offset, LONG count) +{ + ULONG length = SysStringLen(node->data); + BSTR str = NULL; + + if (offset < 0 || count < 0 || offset > length) + return E_INVALIDARG; + + if (length == 0 || count == 0) + return S_OK; + + if (offset == 0) + { + if (count < length) + { + str = SysAllocStringLen(node->data + count, length - count); + if (!str) return E_OUTOFMEMORY; + } + } + else + { + if (offset + count >= length) + { + str = SysAllocStringLen(node->data, offset); + if (!str) return E_OUTOFMEMORY; + } + else + { + str = SysAllocStringLen(NULL, length - count); + if (!str) return E_OUTOFMEMORY; + memcpy(str, node->data, offset * sizeof(WCHAR)); + memcpy(str + offset, node->data + offset + count, (length - count - offset) * sizeof(WCHAR)); + str[length - count] = 0; + } + } + + SysFreeString(node->data); + node->data = str; + + return S_OK; +} diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index dbada1dbaa2..8fdefb5c539 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -639,51 +639,13 @@ static HRESULT WINAPI domtext_insertData( return hr; } -static HRESULT WINAPI domtext_deleteData( - IXMLDOMText *iface, - LONG offset, LONG count) +static HRESULT WINAPI domtext_deleteData(IXMLDOMText *iface, LONG offset, LONG count) { - HRESULT hr; - LONG len = -1; - BSTR str; + domtext *text = impl_from_IXMLDOMText(iface); TRACE("%p, %ld, %ld.\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; + return node_delete_data(text->node, offset, count); } static HRESULT WINAPI domtext_replaceData( -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 37 +++---------------------------------- dlls/msxml3/comment.c | 33 ++------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 23 +++++++++++++++++++++++ dlls/msxml3/text.c | 37 +++---------------------------------- 5 files changed, 32 insertions(+), 99 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index d11fcf2925d..e298fe5964a 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -477,44 +477,13 @@ static HRESULT WINAPI domcdata_get_length( return S_OK; } -static HRESULT WINAPI domcdata_substringData( - IXMLDOMCDATASection *iface, - LONG offset, LONG count, BSTR *p) +static HRESULT WINAPI domcdata_substringData(IXMLDOMCDATASection *iface, LONG offset, LONG count, BSTR *p) { - HRESULT hr; - BSTR data; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); TRACE("%p, %ld, %ld, %p.\n", iface, offset, count, p); - if(!p) - return E_INVALIDARG; - - *p = NULL; - if(offset < 0 || count < 0) - return E_INVALIDARG; - - if(count == 0) - return S_FALSE; - - hr = IXMLDOMCDATASection_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - - if(offset < len) - { - if(offset + count > len) - *p = SysAllocString(&data[offset]); - else - *p = SysAllocStringLen(&data[offset], count); - } - else - hr = S_FALSE; - - SysFreeString(data); - } - - return hr; + return node_substring_data(cdata->node, offset, count, p); } static HRESULT WINAPI domcdata_appendData(IXMLDOMCDATASection *iface, BSTR p) diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 26a48d1b014..6cf8ed096d2 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -485,40 +485,11 @@ static HRESULT WINAPI domcomment_get_length(IXMLDOMComment *iface, LONG *len) static HRESULT WINAPI domcomment_substringData(IXMLDOMComment *iface, LONG offset, LONG count, BSTR *p) { - HRESULT hr; - BSTR data; + domcomment *comment = impl_from_IXMLDOMComment(iface); TRACE("%p, %ld, %ld, %p.\n", iface, offset, count, p); - if(!p) - return E_INVALIDARG; - - *p = NULL; - if(offset < 0 || count < 0) - return E_INVALIDARG; - - if(count == 0) - return S_FALSE; - - hr = IXMLDOMComment_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - - if(offset < len) - { - if(offset + count > len) - *p = SysAllocString(&data[offset]); - else - *p = SysAllocStringLen(&data[offset], count); - } - else - hr = S_FALSE; - - SysFreeString(data); - } - - return hr; + return node_substring_data(comment->node, offset, count, p); } static HRESULT WINAPI domcomment_appendData(IXMLDOMComment *iface, BSTR p) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 1df1c409903..ec45afeabc2 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -331,6 +331,7 @@ extern HRESULT node_validate(struct domnode *, IXMLDOMNode *, IXMLDOMParseError extern void node_move_children(struct domnode *dst, struct domnode *src); extern HRESULT node_split_text(struct domnode *, LONG, IXMLDOMText **); extern HRESULT node_delete_data(struct domnode *, LONG, LONG); +extern HRESULT node_substring_data(struct domnode *, LONG, LONG, BSTR *); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index b8c00d8f293..48d1ccf3333 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4672,3 +4672,26 @@ HRESULT node_delete_data(struct domnode *node, LONG offset, LONG count) return S_OK; } + +HRESULT node_substring_data(struct domnode *node, LONG offset, LONG count, BSTR *p) +{ + LONG length = SysStringLen(node->data); + + if (!p) + return E_INVALIDARG; + + *p = NULL; + + if (offset < 0 || count < 0) + return E_INVALIDARG; + + if (count == 0 || offset >= length) + return S_FALSE; + + if (offset + count > length) + *p = SysAllocString(node->data + offset); + else + *p = SysAllocStringLen(node->data + offset, count); + + return *p ? S_OK : E_OUTOFMEMORY; +} diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index 8fdefb5c539..b5602bfbae9 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -543,44 +543,13 @@ static HRESULT WINAPI domtext_get_length(IXMLDOMText *iface, LONG *len) return S_OK; } -static HRESULT WINAPI domtext_substringData( - IXMLDOMText *iface, - LONG offset, LONG count, BSTR *p) +static HRESULT WINAPI domtext_substringData(IXMLDOMText *iface, LONG offset, LONG count, BSTR *p) { - HRESULT hr; - BSTR data; + domtext *text = impl_from_IXMLDOMText(iface); TRACE("%p, %ld, %ld, %p.\n", iface, offset, count, p); - if(!p) - return E_INVALIDARG; - - *p = NULL; - if(offset < 0 || count < 0) - return E_INVALIDARG; - - if(count == 0) - return S_FALSE; - - hr = IXMLDOMText_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - - if(offset < len) - { - if(offset + count > len) - *p = SysAllocString(&data[offset]); - else - *p = SysAllocStringLen(&data[offset], count); - } - else - hr = S_FALSE; - - SysFreeString(data); - } - - return hr; + return node_substring_data(text->node, offset, count, p); } static HRESULT WINAPI domtext_appendData(IXMLDOMText *iface, BSTR p) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 21 ++++----------------- dlls/msxml3/comment.c | 19 ++++--------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 9 +++++++++ dlls/msxml3/text.c | 11 +++-------- 5 files changed, 21 insertions(+), 40 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index e298fe5964a..93cd4b1a262 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -455,26 +455,13 @@ static HRESULT WINAPI domcdata_put_data(IXMLDOMCDATASection *iface, BSTR data) return node_put_data(cdata->node, data); } -static HRESULT WINAPI domcdata_get_length( - IXMLDOMCDATASection *iface, - LONG *len) +static HRESULT WINAPI domcdata_get_length(IXMLDOMCDATASection *iface, LONG *length) { - HRESULT hr; - BSTR data; - - TRACE("%p, %p.\n", iface, len); + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); - if(!len) - return E_INVALIDARG; + TRACE("%p, %p.\n", iface, length); - hr = IXMLDOMCDATASection_get_data(iface, &data); - if(hr == S_OK) - { - *len = SysStringLen(data); - SysFreeString(data); - } - - return S_OK; + return node_get_data_length(cdata->node, length); } static HRESULT WINAPI domcdata_substringData(IXMLDOMCDATASection *iface, LONG offset, LONG count, BSTR *p) diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 6cf8ed096d2..dd7d672d657 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -463,24 +463,13 @@ static HRESULT WINAPI domcomment_put_data(IXMLDOMComment *iface, BSTR data) return node_put_data(comment->node, data); } -static HRESULT WINAPI domcomment_get_length(IXMLDOMComment *iface, LONG *len) +static HRESULT WINAPI domcomment_get_length(IXMLDOMComment *iface, LONG *length) { - HRESULT hr; - BSTR data; - - TRACE("%p, %p.\n", iface, len); - - if(!len) - return E_INVALIDARG; + domcomment *comment = impl_from_IXMLDOMComment(iface); - hr = IXMLDOMComment_get_data(iface, &data); - if(hr == S_OK) - { - *len = SysStringLen(data); - SysFreeString(data); - } + TRACE("%p, %p.\n", iface, length); - return hr; + return node_get_data_length(comment->node, length); } static HRESULT WINAPI domcomment_substringData(IXMLDOMComment *iface, LONG offset, LONG count, BSTR *p) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index ec45afeabc2..391e1810060 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -332,6 +332,7 @@ extern void node_move_children(struct domnode *dst, struct domnode *src); extern HRESULT node_split_text(struct domnode *, LONG, IXMLDOMText **); extern HRESULT node_delete_data(struct domnode *, LONG, LONG); extern HRESULT node_substring_data(struct domnode *, LONG, LONG, BSTR *); +extern HRESULT node_get_data_length(struct domnode *, LONG *); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 48d1ccf3333..cdc6a242a47 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4695,3 +4695,12 @@ HRESULT node_substring_data(struct domnode *node, LONG offset, LONG count, BSTR return *p ? S_OK : E_OUTOFMEMORY; } + +HRESULT node_get_data_length(struct domnode *node, LONG *length) +{ + if (!length) + return E_INVALIDARG; + + *length = SysStringLen(node->data); + return S_OK; +} diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index b5602bfbae9..b81de239ef4 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -529,18 +529,13 @@ static HRESULT WINAPI domtext_put_data(IXMLDOMText *iface, BSTR data) return node_put_data(text->node, data); } -static HRESULT WINAPI domtext_get_length(IXMLDOMText *iface, LONG *len) +static HRESULT WINAPI domtext_get_length(IXMLDOMText *iface, LONG *length) { domtext *text = impl_from_IXMLDOMText(iface); - TRACE("%p, %p.\n", iface, len); + TRACE("%p, %p.\n", iface, length); - if (!len) - return E_INVALIDARG; - - *len = SysStringLen(text->node->data); - - return S_OK; + return node_get_data_length(text->node, length); } static HRESULT WINAPI domtext_substringData(IXMLDOMText *iface, LONG offset, LONG count, BSTR *p) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 44 +++---------------------------------- dlls/msxml3/comment.c | 44 +++---------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 24 ++++++++++++++++++++ dlls/msxml3/text.c | 44 +++---------------------------------- 5 files changed, 34 insertions(+), 123 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 93cd4b1a262..a32322e9b93 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -482,51 +482,13 @@ static HRESULT WINAPI domcdata_appendData(IXMLDOMCDATASection *iface, BSTR p) return node_append_data(cdata->node, p); } -static HRESULT WINAPI domcdata_insertData( - IXMLDOMCDATASection *iface, - LONG offset, BSTR p) +static HRESULT WINAPI domcdata_insertData(IXMLDOMCDATASection *iface, LONG offset, BSTR p) { - HRESULT hr; - BSTR data; - LONG p_len; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); TRACE("%p, %ld, %s.\n", iface, offset, debugstr_w(p)); - /* If have a NULL or empty string, don't do anything. */ - if((p_len = SysStringLen(p)) == 0) - return S_OK; - - if(offset < 0) - { - return E_INVALIDARG; - } - - hr = IXMLDOMCDATASection_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - BSTR str; - - if(len < offset) - { - SysFreeString(data); - return E_INVALIDARG; - } - - str = SysAllocStringLen(NULL, len + p_len); - /* start part, supplied string and end part */ - memcpy(str, data, offset*sizeof(WCHAR)); - memcpy(&str[offset], p, p_len*sizeof(WCHAR)); - memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR)); - str[len+p_len] = 0; - - hr = IXMLDOMCDATASection_put_data(iface, str); - - SysFreeString(str); - SysFreeString(data); - } - - return hr; + return node_insert_data(cdata->node, offset, p); } static HRESULT WINAPI domcdata_deleteData(IXMLDOMCDATASection *iface, LONG offset, LONG count) diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index dd7d672d657..801919e2542 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -490,51 +490,13 @@ static HRESULT WINAPI domcomment_appendData(IXMLDOMComment *iface, BSTR p) return node_append_data(comment->node, p); } -static HRESULT WINAPI domcomment_insertData( - IXMLDOMComment *iface, - LONG offset, BSTR p) +static HRESULT WINAPI domcomment_insertData(IXMLDOMComment *iface, LONG offset, BSTR p) { - HRESULT hr; - BSTR data; - LONG p_len; + domcomment *comment = impl_from_IXMLDOMComment(iface); TRACE("%p, %ld, %s.\n", iface, offset, debugstr_w(p)); - /* If have a NULL or empty string, don't do anything. */ - if((p_len = SysStringLen(p)) == 0) - return S_OK; - - if(offset < 0) - { - return E_INVALIDARG; - } - - hr = IXMLDOMComment_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - BSTR str; - - if(len < offset) - { - SysFreeString(data); - return E_INVALIDARG; - } - - str = SysAllocStringLen(NULL, len + p_len); - /* start part, supplied string and end part */ - memcpy(str, data, offset*sizeof(WCHAR)); - memcpy(&str[offset], p, p_len*sizeof(WCHAR)); - memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR)); - str[len+p_len] = 0; - - hr = IXMLDOMComment_put_data(iface, str); - - SysFreeString(str); - SysFreeString(data); - } - - return hr; + return node_insert_data(comment->node, offset, p); } static HRESULT WINAPI domcomment_deleteData(IXMLDOMComment *iface, LONG offset, LONG count) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 391e1810060..1d61bd4e181 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -333,6 +333,7 @@ extern HRESULT node_split_text(struct domnode *, LONG, IXMLDOMText **); extern HRESULT node_delete_data(struct domnode *, LONG, LONG); extern HRESULT node_substring_data(struct domnode *, LONG, LONG, BSTR *); extern HRESULT node_get_data_length(struct domnode *, LONG *); +extern HRESULT node_insert_data(struct domnode *, LONG, BSTR); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index cdc6a242a47..773506f44cb 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4696,6 +4696,30 @@ HRESULT node_substring_data(struct domnode *node, LONG offset, LONG count, BSTR return *p ? S_OK : E_OUTOFMEMORY; } +HRESULT node_insert_data(struct domnode *node, LONG offset, BSTR data) +{ + LONG length = SysStringLen(node->data); + LONG data_length = SysStringLen(data); + BSTR str; + + if (data_length == 0) + return S_OK; + + if (offset < 0 || length < offset) + return E_INVALIDARG; + + if (!(str = SysAllocStringLen(NULL, length + data_length))) return E_OUTOFMEMORY; + memcpy(str, node->data, offset * sizeof(WCHAR)); + memcpy(str + offset, data, data_length * sizeof(WCHAR)); + memcpy(str + offset + data_length, node->data + offset, (length - offset) * sizeof(WCHAR)); + str[length + data_length] = 0; + + SysFreeString(node->data); + node->data = str; + + return S_OK; +} + HRESULT node_get_data_length(struct domnode *node, LONG *length) { if (!length) diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index b81de239ef4..e89f4934640 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -556,51 +556,13 @@ static HRESULT WINAPI domtext_appendData(IXMLDOMText *iface, BSTR p) return node_append_data(text->node, p); } -static HRESULT WINAPI domtext_insertData( - IXMLDOMText *iface, - LONG offset, BSTR p) +static HRESULT WINAPI domtext_insertData(IXMLDOMText *iface, LONG offset, BSTR p) { - HRESULT hr; - BSTR data; - LONG p_len; + domtext *text = impl_from_IXMLDOMText(iface); TRACE("%p, %ld, %s.\n", iface, offset, debugstr_w(p)); - /* If have a NULL or empty string, don't do anything. */ - if((p_len = SysStringLen(p)) == 0) - return S_OK; - - if(offset < 0) - { - return E_INVALIDARG; - } - - hr = IXMLDOMText_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - BSTR str; - - if(len < offset) - { - SysFreeString(data); - return E_INVALIDARG; - } - - str = SysAllocStringLen(NULL, len + p_len); - /* start part, supplied string and end part */ - memcpy(str, data, offset*sizeof(WCHAR)); - memcpy(&str[offset], p, p_len*sizeof(WCHAR)); - memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR)); - str[len+p_len] = 0; - - hr = IXMLDOMText_put_data(iface, str); - - SysFreeString(str); - SysFreeString(data); - } - - return hr; + return node_insert_data(text->node, offset, p); } static HRESULT WINAPI domtext_deleteData(IXMLDOMText *iface, LONG offset, LONG count) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 13 +++---------- dlls/msxml3/comment.c | 13 +++---------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 11 +++++++++++ dlls/msxml3/text.c | 13 +++---------- 5 files changed, 21 insertions(+), 30 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index a32322e9b93..15b493fd1d5 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -500,20 +500,13 @@ static HRESULT WINAPI domcdata_deleteData(IXMLDOMCDATASection *iface, LONG offse return node_delete_data(cdata->node, offset, count); } -static HRESULT WINAPI domcdata_replaceData( - IXMLDOMCDATASection *iface, - LONG offset, LONG count, BSTR p) +static HRESULT WINAPI domcdata_replaceData(IXMLDOMCDATASection *iface, LONG offset, LONG count, BSTR p) { - HRESULT hr; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); TRACE("%p, %ld, %ld, %s.\n", iface, offset, count, debugstr_w(p)); - hr = IXMLDOMCDATASection_deleteData(iface, offset, count); - - if (hr == S_OK) - hr = IXMLDOMCDATASection_insertData(iface, offset, p); - - return hr; + return node_replace_data(cdata->node, offset, count, p); } static HRESULT WINAPI domcdata_splitText(IXMLDOMCDATASection *iface, LONG offset, IXMLDOMText **node) diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 801919e2542..08c577febbf 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -508,20 +508,13 @@ static HRESULT WINAPI domcomment_deleteData(IXMLDOMComment *iface, LONG offset, return node_delete_data(comment->node, offset, count); } -static HRESULT WINAPI domcomment_replaceData( - IXMLDOMComment *iface, - LONG offset, LONG count, BSTR p) +static HRESULT WINAPI domcomment_replaceData(IXMLDOMComment *iface, LONG offset, LONG count, BSTR p) { - HRESULT hr; + domcomment *comment = impl_from_IXMLDOMComment(iface); TRACE("%p, %ld, %ld, %s.\n", iface, offset, count, debugstr_w(p)); - hr = IXMLDOMComment_deleteData(iface, offset, count); - - if (hr == S_OK) - hr = IXMLDOMComment_insertData(iface, offset, p); - - return hr; + return node_replace_data(comment->node, offset, count, p); } static const struct IXMLDOMCommentVtbl domcomment_vtbl = diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 1d61bd4e181..804d52ec49e 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -334,6 +334,7 @@ extern HRESULT node_delete_data(struct domnode *, LONG, LONG); extern HRESULT node_substring_data(struct domnode *, LONG, LONG, BSTR *); extern HRESULT node_get_data_length(struct domnode *, LONG *); extern HRESULT node_insert_data(struct domnode *, LONG, BSTR); +extern HRESULT node_replace_data(struct domnode *, LONG, LONG, BSTR); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 773506f44cb..4d68d44e0b2 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4720,6 +4720,17 @@ HRESULT node_insert_data(struct domnode *node, LONG offset, BSTR data) return S_OK; } +/* TODO: might be worth it to unroll to avoid intermediate allocations */ +HRESULT node_replace_data(struct domnode *node, LONG offset, LONG count, BSTR data) +{ + HRESULT hr; + + if (FAILED(hr = node_delete_data(node, offset, count))) + return hr; + + return node_insert_data(node, offset, data); +} + HRESULT node_get_data_length(struct domnode *node, LONG *length) { if (!length) diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index e89f4934640..f8375c94bcf 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -574,20 +574,13 @@ static HRESULT WINAPI domtext_deleteData(IXMLDOMText *iface, LONG offset, LONG c return node_delete_data(text->node, offset, count); } -static HRESULT WINAPI domtext_replaceData( - IXMLDOMText *iface, - LONG offset, LONG count, BSTR p) +static HRESULT WINAPI domtext_replaceData(IXMLDOMText *iface, LONG offset, LONG count, BSTR p) { - HRESULT hr; + domtext *text = impl_from_IXMLDOMText(iface); TRACE("%p, %ld, %ld, %s.\n", iface, offset, count, debugstr_w(p)); - hr = IXMLDOMText_deleteData(iface, offset, count); - - if (hr == S_OK) - hr = IXMLDOMText_insertData(iface, offset, p); - - return hr; + return node_replace_data(text->node, offset, count, p); } static HRESULT WINAPI domtext_splitText(IXMLDOMText *iface, LONG offset, IXMLDOMText **node) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
From: Nikolay Sivov <nsivov@codeweavers.com> Libxml2 functionality is no longer used for serializing so this workaround shouldn't be needed now. Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 3b1b6851a82..440990a4c1b 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -14799,18 +14799,6 @@ static void test_indent(void) SysFreeString(str); } -static DWORD WINAPI new_thread(void *arg) -{ - HRESULT hr = CoInitialize(NULL); - ok(hr == S_OK, "failed to init com\n"); - if (hr != S_OK) return 1; - - test_indent(); - - CoUninitialize(); - return 0; -} - static void test_get_parentNode(void) { IXMLDOMDocumentType *doctype; @@ -17121,7 +17109,6 @@ static void test_prohibitdtd(void) START_TEST(domdoc) { HRESULT hr; - HANDLE thread; hr = CoInitialize( NULL ); ok( hr == S_OK, "failed to init com\n"); @@ -17224,6 +17211,7 @@ START_TEST(domdoc) test_createElement(); test_default_namespace(); test_prohibitdtd(); + test_indent(); if (is_clsid_supported(&CLSID_MXNamespaceManager40, &IID_IMXNamespaceManager)) { @@ -17231,12 +17219,5 @@ START_TEST(domdoc) test_mxnamespacemanager_override(); } - /* We need to test test_indent in a seperate thread. This is to prevent regressions in multi-threaded - applications where the default indentation is set (e.g. by setting xmlTreeIndentString) in the first - thread but not for new threads, leading to the wrong indentation in subsequent threads. */ - thread = CreateThread(NULL, 0, new_thread, NULL, 0, NULL); - WaitForSingleObject(thread, INFINITE); - CloseHandle(thread); - CoUninitialize(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)