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

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


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

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Tue Feb 16 01:24:09 2010 +0300

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

---

 dlls/msxml3/cdata.c   |   65 ++++++++++++++++--------------------------------
 dlls/msxml3/comment.c |   61 +++++++++++++++-------------------------------
 dlls/msxml3/text.c    |   59 ++++++++++++++------------------------------
 3 files changed, 61 insertions(+), 124 deletions(-)

diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index e35d945..58bd611 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -585,10 +585,10 @@ static HRESULT WINAPI domcdata_appendData(
     xmlChar *pContent;
     HRESULT hr = S_FALSE;
 
-    TRACE("%p\n", iface);
+    TRACE("%p %p\n", This, debugstr_w(p));
 
     /* Nothing to do if NULL or an Empty string passed in. */
-    if(p == NULL || SysStringLen(p) == 0)
+    if(SysStringLen(p) == 0)
         return S_OK;
 
     pContent = xmlChar_from_wchar( p );
@@ -611,16 +611,14 @@ static HRESULT WINAPI domcdata_insertData(
     LONG offset, BSTR p)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlChar *pXmlContent;
-    BSTR sNewString;
-    HRESULT hr = S_FALSE;
-    LONG nLength = 0, nLengthP = 0;
-    xmlChar *str = NULL;
+    HRESULT hr;
+    BSTR data;
+    LONG p_len;
 
-    TRACE("%p\n", This);
+    TRACE("%p %d %s\n", This, offset, debugstr_w(p));
 
     /* If have a NULL or empty string, don't do anything. */
-    if(SysStringLen(p) == 0)
+    if((p_len = SysStringLen(p)) == 0)
         return S_OK;
 
     if(offset < 0)
@@ -628,48 +626,29 @@ static HRESULT WINAPI domcdata_insertData(
         return E_INVALIDARG;
     }
 
-    pXmlContent = xmlNodeGetContent(This->node.node);
-    if(pXmlContent)
+    hr = IXMLDOMCDATASection_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        BSTR sContent = bstr_from_xmlChar( pXmlContent );
-        nLength = SysStringLen(sContent);
-        nLengthP = SysStringLen(p);
+        LONG len = SysStringLen(data);
+        BSTR str;
 
-        if(nLength < offset)
+        if(len < offset)
         {
-            SysFreeString(sContent);
-            xmlFree(pXmlContent);
-
+            SysFreeString(data);
             return E_INVALIDARG;
         }
 
-        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
-        if(sNewString)
-        {
-            if(offset > 0)
-                memcpy(sNewString, sContent, offset * sizeof(WCHAR));
-
-            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
-
-            if(offset+nLengthP < nLength)
-                memcpy(&sNewString[offset+nLengthP], &sContent[offset], (nLength-offset) * sizeof(WCHAR));
-
-            sNewString[nLengthP + nLength] = 0;
-
-            str = xmlChar_from_wchar(sNewString);
-            if(str)
-            {
-                xmlNodeSetContent(This->node.node, str);
-                hr = S_OK;
-            }
-            heap_free(str);
+        str = SysAllocStringLen(NULL, len + p_len);
+        /* start part, supplied string and end part */
+        memcpy(str, data, offset*sizeof(WCHAR));
+        memcpy(&str[offset], p, p_len*sizeof(WCHAR));
+        memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
+        str[len+p_len] = 0;
 
-            SysFreeString(sNewString);
-        }
-
-        SysFreeString(sContent);
+        hr = IXMLDOMCDATASection_put_data(iface, str);
 
-        xmlFree(pXmlContent);
+        SysFreeString(str);
+        SysFreeString(data);
     }
 
     return hr;
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index bc9d8b3..3cf951d 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -619,16 +619,14 @@ static HRESULT WINAPI domcomment_insertData(
     LONG offset, BSTR p)
 {
     domcomment *This = impl_from_IXMLDOMComment( iface );
-    xmlChar *pXmlContent;
-    BSTR sNewString;
-    HRESULT hr = S_FALSE;
-    LONG nLength = 0, nLengthP = 0;
-    xmlChar *str = NULL;
+    HRESULT hr;
+    BSTR data;
+    LONG p_len;
 
-    TRACE("%p %d %p\n", iface, offset, p);
+    TRACE("%p %d %s\n", This, offset, debugstr_w(p));
 
     /* If have a NULL or empty string, don't do anything. */
-    if(SysStringLen(p) == 0)
+    if((p_len = SysStringLen(p)) == 0)
         return S_OK;
 
     if(offset < 0)
@@ -636,48 +634,29 @@ static HRESULT WINAPI domcomment_insertData(
         return E_INVALIDARG;
     }
 
-    pXmlContent = xmlNodeGetContent(This->node.node);
-    if(pXmlContent)
+    hr = IXMLDOMComment_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        BSTR sContent = bstr_from_xmlChar( pXmlContent );
-        nLength = SysStringLen(sContent);
-        nLengthP = SysStringLen(p);
+        LONG len = SysStringLen(data);
+        BSTR str;
 
-        if(nLength < offset)
+        if(len < offset)
         {
-            SysFreeString(sContent);
-            xmlFree(pXmlContent);
-
+            SysFreeString(data);
             return E_INVALIDARG;
         }
 
-        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
-        if(sNewString)
-        {
-            if(offset > 0)
-                memcpy(sNewString, sContent, offset * sizeof(WCHAR));
-
-            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
-
-            if(offset+nLengthP < nLength)
-                memcpy(&sNewString[offset+nLengthP], &sContent[offset], (nLength-offset) * sizeof(WCHAR));
+        str = SysAllocStringLen(NULL, len + p_len);
+        /* start part, supplied string and end part */
+        memcpy(str, data, offset*sizeof(WCHAR));
+        memcpy(&str[offset], p, p_len*sizeof(WCHAR));
+        memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
+        str[len+p_len] = 0;
 
-            sNewString[nLengthP + nLength] = 0;
-
-            str = xmlChar_from_wchar(sNewString);
-            if(str)
-            {
-                xmlNodeSetContent(This->node.node, str);
-                hr = S_OK;
-            }
-            HeapFree( GetProcessHeap(), 0, str );
-
-            SysFreeString(sNewString);
-        }
-
-        SysFreeString(sContent);
+        hr = IXMLDOMComment_put_data(iface, str);
 
-        xmlFree(pXmlContent);
+        SysFreeString(str);
+        SysFreeString(data);
     }
 
     return hr;
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index cdf136b..1d18dac 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -612,16 +612,14 @@ static HRESULT WINAPI domtext_insertData(
     LONG offset, BSTR p)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pXmlContent;
-    BSTR sNewString;
-    HRESULT hr = S_FALSE;
-    LONG nLength = 0, nLengthP = 0;
-    xmlChar *str = NULL;
+    HRESULT hr;
+    BSTR data;
+    LONG p_len;
 
     TRACE("%p %d %s\n", This, offset, debugstr_w(p));
 
     /* If have a NULL or empty string, don't do anything. */
-    if(SysStringLen(p) == 0)
+    if((p_len = SysStringLen(p)) == 0)
         return S_OK;
 
     if(offset < 0)
@@ -629,48 +627,29 @@ static HRESULT WINAPI domtext_insertData(
         return E_INVALIDARG;
     }
 
-    pXmlContent = xmlNodeGetContent(This->node.node);
-    if(pXmlContent)
+    hr = IXMLDOMText_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        BSTR sContent = bstr_from_xmlChar( pXmlContent );
-        nLength = SysStringLen(sContent);
-        nLengthP = SysStringLen(p);
+        LONG len = SysStringLen(data);
+        BSTR str;
 
-        if(nLength < offset)
+        if(len < offset)
         {
-            SysFreeString(sContent);
-            xmlFree(pXmlContent);
-
+            SysFreeString(data);
             return E_INVALIDARG;
         }
 
-        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
-        if(sNewString)
-        {
-            if(offset > 0)
-                memcpy(sNewString, sContent, offset * sizeof(WCHAR));
-
-            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
-
-            if(offset+nLengthP < nLength)
-                memcpy(&sNewString[offset+nLengthP], &sContent[offset], (nLength-offset) * sizeof(WCHAR));
-
-            sNewString[nLengthP + nLength] = 0;
-
-            str = xmlChar_from_wchar(sNewString);
-            if(str)
-            {
-                xmlNodeSetContent(This->node.node, str);
-                hr = S_OK;
-            }
-            heap_free(str);
+        str = SysAllocStringLen(NULL, len + p_len);
+        /* start part, supplied string and end part */
+        memcpy(str, data, offset*sizeof(WCHAR));
+        memcpy(&str[offset], p, p_len*sizeof(WCHAR));
+        memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
+        str[len+p_len] = 0;
 
-            SysFreeString(sNewString);
-        }
-
-        SysFreeString(sContent);
+        hr = IXMLDOMText_put_data(iface, str);
 
-        xmlFree(pXmlContent);
+        SysFreeString(str);
+        SysFreeString(data);
     }
 
     return hr;




More information about the wine-cvs mailing list