Nikolay Sivov : msxml3: Make ::put_data() use passed BSTR as general WCHAR buffer.
Alexandre Julliard
julliard at winehq.org
Mon May 7 14:29:27 CDT 2012
Module: wine
Branch: master
Commit: b80c71abe6de1a76a7a7d869ed11d06b6953755a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b80c71abe6de1a76a7a7d869ed11d06b6953755a
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon May 7 15:36:03 2012 +0400
msxml3: Make ::put_data() use passed BSTR as general WCHAR buffer.
---
dlls/msxml3/cdata.c | 10 +---
dlls/msxml3/comment.c | 9 +---
dlls/msxml3/pi.c | 8 +--
dlls/msxml3/tests/domdoc.c | 118 ++++++++++++++++++++++++++++++++++++++++++++
dlls/msxml3/text.c | 9 +---
5 files changed, 126 insertions(+), 28 deletions(-)
diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 63265bf..b07cd84 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -552,14 +552,8 @@ static HRESULT WINAPI domcdata_put_data(
BSTR data)
{
domcdata *This = impl_from_IXMLDOMCDATASection( iface );
- VARIANT val;
-
- TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
-
- V_VT(&val) = VT_BSTR;
- V_BSTR(&val) = data;
-
- return IXMLDOMCDATASection_put_nodeValue( iface, val );
+ TRACE("(%p)->(%s)\n", This, debugstr_w(data));
+ return node_set_content(&This->node, data);
}
static HRESULT WINAPI domcdata_get_length(
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index f1f94c6..3dab11b 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -554,13 +554,8 @@ static HRESULT WINAPI domcomment_put_data(
BSTR data)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- VARIANT val;
-
- TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
-
- V_VT(&val) = VT_BSTR;
- V_BSTR(&val) = data;
- return node_put_value(&This->node, &val);
+ TRACE("(%p)->(%s)\n", This, debugstr_w(data));
+ return node_set_content(&This->node, data);
}
static HRESULT WINAPI domcomment_get_length(
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index a6034bb..4d1910b 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -602,13 +602,12 @@ static HRESULT WINAPI dom_pi_put_data(
BSTR data)
{
dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
- VARIANT val;
BSTR target;
HRESULT hr;
TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
- /* Cannot set data to a PI node whose target is 'xml' */
+ /* cannot set data to a PI node whose target is 'xml' */
hr = IXMLDOMProcessingInstruction_get_nodeName(iface, &target);
if(hr == S_OK)
{
@@ -622,10 +621,7 @@ static HRESULT WINAPI dom_pi_put_data(
SysFreeString(target);
}
- V_VT(&val) = VT_BSTR;
- V_BSTR(&val) = data;
-
- return IXMLDOMProcessingInstruction_put_nodeValue( iface, val );
+ return node_set_content(&This->node, data);
}
static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index d50a22e..09165c3 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -11675,6 +11675,123 @@ todo_wine
free_bstrs();
}
+static DOMNodeType put_data_types[] = {
+ NODE_TEXT,
+ NODE_CDATA_SECTION,
+ NODE_PROCESSING_INSTRUCTION,
+ NODE_COMMENT,
+ NODE_INVALID
+};
+
+static void test_put_data(void)
+{
+ static const WCHAR test_data[] = {'t','e','s','t',' ','n','o','d','e',' ','d','a','t','a',0};
+ WCHAR buff[100], *data;
+ IXMLDOMDocument *doc;
+ DOMNodeType *type;
+ BSTR get_data;
+ HRESULT hr;
+
+ doc = create_document(&IID_IXMLDOMDocument);
+ if (!doc) return;
+
+ memcpy(&buff[2], test_data, sizeof(test_data));
+ /* just a big length */
+ *(DWORD*)buff = 0xf0f0;
+ data = &buff[2];
+
+ type = put_data_types;
+ while (*type != NODE_INVALID)
+ {
+ IXMLDOMNode *node;
+ VARIANT v;
+
+ V_VT(&v) = VT_I2;
+ V_I2(&v) = *type;
+
+ hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
+ EXPECT_HR(hr, S_OK);
+
+ /* put_data() is interface-specific */
+ switch (*type)
+ {
+ case NODE_TEXT:
+ {
+ IXMLDOMText *text;
+
+ hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
+ EXPECT_HR(hr, S_OK);
+ hr = IXMLDOMText_put_data(text, data);
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMText_get_data(text, &get_data);
+ EXPECT_HR(hr, S_OK);
+
+ IXMLDOMText_Release(text);
+ break;
+ }
+ case NODE_CDATA_SECTION:
+ {
+ IXMLDOMCDATASection *cdata;
+
+ hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMCDATASection, (void**)&cdata);
+ EXPECT_HR(hr, S_OK);
+ hr = IXMLDOMCDATASection_put_data(cdata, data);
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMCDATASection_get_data(cdata, &get_data);
+ EXPECT_HR(hr, S_OK);
+
+ IXMLDOMCDATASection_Release(cdata);
+ break;
+ }
+ case NODE_PROCESSING_INSTRUCTION:
+ {
+ IXMLDOMProcessingInstruction *pi;
+
+ hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void**)&pi);
+ EXPECT_HR(hr, S_OK);
+ hr = IXMLDOMProcessingInstruction_put_data(pi, data);
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMProcessingInstruction_get_data(pi, &get_data);
+ EXPECT_HR(hr, S_OK);
+
+ IXMLDOMProcessingInstruction_Release(pi);
+ break;
+ }
+ case NODE_COMMENT:
+ {
+ IXMLDOMComment *comment;
+
+ hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMComment, (void**)&comment);
+ EXPECT_HR(hr, S_OK);
+ hr = IXMLDOMComment_put_data(comment, data);
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMComment_get_data(comment, &get_data);
+ EXPECT_HR(hr, S_OK);
+
+ IXMLDOMComment_Release(comment);
+ break;
+ }
+ default:
+ break;
+ }
+
+ /* compare */
+ ok(!lstrcmpW(data, get_data), "%d: got wrong data %s, expected %s\n", *type, wine_dbgstr_w(get_data),
+ wine_dbgstr_w(data));
+ SysFreeString(get_data);
+
+ IXMLDOMNode_Release(node);
+ type++;
+ }
+
+ IXMLDOMDocument_Release(doc);
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
@@ -11752,6 +11869,7 @@ START_TEST(domdoc)
test_supporterrorinfo();
test_nodeValue();
test_get_namespaces();
+ test_put_data();
test_xsltemplate();
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 74de8e5..705afd0 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -608,13 +608,8 @@ static HRESULT WINAPI domtext_put_data(
BSTR data)
{
domtext *This = impl_from_IXMLDOMText( iface );
- VARIANT val;
-
- TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
-
- V_VT(&val) = VT_BSTR;
- V_BSTR(&val) = data;
- return node_put_value(&This->node, &val);
+ TRACE("(%p)->(%s)\n", This, debugstr_w(data));
+ return node_set_content(&This->node, data);
}
static HRESULT WINAPI domtext_get_length(
More information about the wine-cvs
mailing list