Module: wine Branch: master Commit: adfd3058212e4caa71777fae1364fb8dfdd07c62 URL: http://source.winehq.org/git/wine.git/?a=commit;h=adfd3058212e4caa71777fae13...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Oct 26 02:06:52 2010 +0400
msxml3: Handle passed BSTR argument as a WCHAR string in ::createProcessingInstruction().
---
dlls/msxml3/domdoc.c | 6 +----- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 18 ++++++++++++++---- dlls/msxml3/tests/domdoc.c | 23 +++++++++++++++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 12710a8..78500e6 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -1597,15 +1597,11 @@ static HRESULT WINAPI domdoc_createProcessingInstruction( hr = IXMLDOMDocument3_createNode(iface, type, target, NULL, &node); if (hr == S_OK) { - VARIANT v_data; xmlnode *node_obj;
/* this is to bypass check in ::put_data() that blocks "<?xml" PIs */ node_obj = get_node_obj(node); - V_VT(&v_data) = VT_BSTR; - V_BSTR(&v_data) = data; - - hr = node_put_value(node_obj, &v_data); + hr = node_set_content(node_obj, data);
IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void**)pi); IXMLDOMNode_Release(node); diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index fcf3dc0..bccce1c 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -162,6 +162,7 @@ extern xmlnode *get_node_obj(IXMLDOMNode*);
extern HRESULT node_get_nodeName(xmlnode*,BSTR*); extern HRESULT node_get_content(xmlnode*,VARIANT*); +extern HRESULT node_set_content(xmlnode*,LPCWSTR); extern HRESULT node_put_value(xmlnode*,VARIANT*); extern HRESULT node_get_parent(xmlnode*,IXMLDOMNode**); extern HRESULT node_get_child_nodes(xmlnode*,IXMLDOMNodeList**); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 5b7d49d..3e8665f 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -138,10 +138,22 @@ HRESULT node_get_content(xmlnode *This, VARIANT *value) return S_OK; }
+HRESULT node_set_content(xmlnode *This, LPCWSTR value) +{ + xmlChar *str; + + str = xmlChar_from_wchar(value); + if(!str) + return E_OUTOFMEMORY; + + xmlNodeSetContent(This->node, str); + heap_free(str); + return S_OK; +} + HRESULT node_put_value(xmlnode *This, VARIANT *value) { VARIANT string_value; - xmlChar *str; HRESULT hr;
VariantInit(&string_value); @@ -151,11 +163,9 @@ HRESULT node_put_value(xmlnode *This, VARIANT *value) return hr; }
- str = xmlChar_from_wchar(V_BSTR(&string_value)); + hr = node_set_content(This, V_BSTR(&string_value)); VariantClear(&string_value);
- xmlNodeSetContent(This->node, str); - heap_free(str); return S_OK; }
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 8821b25..80557f3 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -7125,6 +7125,28 @@ static void test_events(void) IXMLDOMDocument_Release(doc); }
+static void test_createProcessingInstruction(void) +{ + static const WCHAR bodyW[] = {'t','e','s','t',0}; + IXMLDOMProcessingInstruction *pi; + IXMLDOMDocument *doc; + WCHAR buff[10]; + HRESULT hr; + + doc = create_document(&IID_IXMLDOMDocument); + if (!doc) return; + + /* test for BSTR handling, pass broken BSTR */ + memcpy(&buff[2], bodyW, sizeof(bodyW)); + /* just a big length */ + *(DWORD*)buff = 0xf0f0; + hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("test"), &buff[2], &pi); + ok(hr == S_OK, "got 0x%08x\n", hr); + + IXMLDOMProcessingInstruction_Release(pi); + IXMLDOMDocument_Release(doc); +} + START_TEST(domdoc) { IXMLDOMDocument *doc; @@ -7186,6 +7208,7 @@ START_TEST(domdoc) test_default_properties(); test_selectSingleNode(); test_events(); + test_createProcessingInstruction();
CoUninitialize(); }