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