Nikolay Sivov : msxml3: Simplify ::appendData() for Text, Comment and CDATA nodes.

Alexandre Julliard julliard at winehq.org
Tue Feb 16 11:44:40 CST 2010


Module: wine
Branch: master
Commit: 19c30897d4c64e1f534672eb355aa0f15a17eb95
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=19c30897d4c64e1f534672eb355aa0f15a17eb95

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Tue Feb 16 02:40:16 2010 +0300

msxml3: Simplify ::appendData() for Text, Comment and CDATA nodes.

---

 dlls/msxml3/cdata.c   |   30 +++++++++++++++++-------------
 dlls/msxml3/comment.c |   46 ++++++++++++++++++----------------------------
 dlls/msxml3/text.c    |   31 ++++++++++++++++++-------------
 3 files changed, 53 insertions(+), 54 deletions(-)

diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 07323ce..12bc03d 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -582,26 +582,30 @@ static HRESULT WINAPI domcdata_appendData(
     BSTR p)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlChar *pContent;
-    HRESULT hr = S_FALSE;
+    HRESULT hr;
+    BSTR data;
+    LONG p_len;
 
     TRACE("%p %p\n", This, debugstr_w(p));
 
     /* Nothing to do if NULL or an Empty string passed in. */
-    if(SysStringLen(p) == 0)
-        return S_OK;
+    if((p_len = SysStringLen(p)) == 0) return S_OK;
 
-    pContent = xmlChar_from_wchar( p );
-    if(pContent)
+    hr = IXMLDOMCDATASection_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        if(xmlTextConcat(This->node.node, pContent, SysStringLen(p) ) == 0)
-            hr = S_OK;
-        else
-            hr = E_FAIL;
+        LONG len = SysStringLen(data);
+        BSTR str = SysAllocStringLen(NULL, p_len + len);
+
+        memcpy(str, data, len*sizeof(WCHAR));
+        memcpy(&str[len], p, p_len*sizeof(WCHAR));
+        str[len+p_len] = 0;
+
+        hr = IXMLDOMCDATASection_put_data(iface, str);
+
+        SysFreeString(str);
+        SysFreeString(data);
     }
-    else
-        hr = E_FAIL;
-    heap_free(pContent);
 
     return hr;
 }
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 223c9cc..c669eac 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -576,40 +576,30 @@ static HRESULT WINAPI domcomment_appendData(
     BSTR p)
 {
     domcomment *This = impl_from_IXMLDOMComment( iface );
-    xmlChar *pContent;
-    HRESULT hr = S_FALSE;
+    HRESULT hr;
+    BSTR data;
+    LONG p_len;
 
-    TRACE("%p\n", iface);
+    TRACE("%p %s\n", This, debugstr_w(p));
 
     /* Nothing to do if NULL or an Empty string passed in. */
-    if(p == NULL || SysStringLen(p) == 0)
-        return S_OK;
+    if((p_len = SysStringLen(p)) == 0) return S_OK;
 
-    pContent = xmlChar_from_wchar( p );
-    if(pContent)
+    hr = IXMLDOMComment_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        /* Older versions of libxml < 2.6.27 didn't correctly support
-           xmlTextConcat on Comment nodes. Fallback to setting the
-           contents directly if xmlTextConcat fails.
-         */
-        if(xmlTextConcat(This->node.node, pContent, SysStringLen(p) ) == 0)
-            hr = S_OK;
-        else
-        {
-            xmlChar *pNew;
-            pNew = xmlStrcat(xmlNodeGetContent(This->node.node), pContent);
-            if(pNew)
-            {
-                xmlNodeSetContent(This->node.node, pNew);
-                hr = S_OK;
-            }
-            else
-                hr = E_FAIL;
-        }
-        HeapFree( GetProcessHeap(), 0, pContent );
+        LONG len = SysStringLen(data);
+        BSTR str = SysAllocStringLen(NULL, p_len + len);
+
+        memcpy(str, data, len*sizeof(WCHAR));
+        memcpy(&str[len], p, p_len*sizeof(WCHAR));
+        str[len+p_len] = 0;
+
+        hr = IXMLDOMComment_put_data(iface, str);
+
+        SysFreeString(str);
+        SysFreeString(data);
     }
-    else
-        hr = E_FAIL;
 
     return hr;
 }
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 629adb6..e21b203 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -584,25 +584,30 @@ static HRESULT WINAPI domtext_appendData(
     BSTR p)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pContent;
-    HRESULT hr = S_FALSE;
+    HRESULT hr;
+    BSTR data;
+    LONG p_len;
 
-    TRACE("%p\n", iface);
+    TRACE("%p %s\n", This, debugstr_w(p));
 
     /* Nothing to do if NULL or an Empty string passed in. */
-    if(SysStringLen(p) == 0) return S_OK;
+    if((p_len = SysStringLen(p)) == 0) return S_OK;
 
-    pContent = xmlChar_from_wchar( p );
-    if(pContent)
+    hr = IXMLDOMText_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        if(xmlTextConcat(This->node.node, pContent, SysStringLen(p)) == 0)
-            hr = S_OK;
-        else
-            hr = E_FAIL;
-        heap_free( pContent );
+        LONG len = SysStringLen(data);
+        BSTR str = SysAllocStringLen(NULL, p_len + len);
+
+        memcpy(str, data, len*sizeof(WCHAR));
+        memcpy(&str[len], p, p_len*sizeof(WCHAR));
+        str[len+p_len] = 0;
+
+        hr = IXMLDOMText_put_data(iface, str);
+
+        SysFreeString(str);
+        SysFreeString(data);
     }
-    else
-        hr = E_FAIL;
 
     return hr;
 }




More information about the wine-cvs mailing list