msxml3: Simplify ::appendData() for Text, Comment and CDATA nodes.
authorNikolay Sivov <bunglehead@gmail.com>
Mon, 15 Feb 2010 23:40:16 +0000 (02:40 +0300)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 16 Feb 2010 10:33:11 +0000 (11:33 +0100)
dlls/msxml3/cdata.c
dlls/msxml3/comment.c
dlls/msxml3/text.c

index 07323ce576f25a0e6ded3457708034bc29d2bd54..12bc03df0c6981a9906298156ed0d726fa4545e2 100644 (file)
@@ -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;
 }
index 223c9ccd7dc3922dc2268ec6b8534fb0da97c9dd..c669eac44f6e861341cb79fbffd198424d4382d9 100644 (file)
@@ -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;
 }
index 629adb65f8ff90f20b9934b6beb085d3f304f48e..e21b203e6af467e070deefdaebb4a67daea6b5c4 100644 (file)
@@ -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;
 }