Sync with trunk head
[reactos.git] / dll / win32 / msxml3 / text.c
index 70ca3ef..fdcb06b 100644 (file)
@@ -56,7 +56,7 @@ static HRESULT WINAPI domtext_QueryInterface(
     void** ppvObject )
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
 
     if ( IsEqualGUID( riid, &IID_IXMLDOMText ) ||
          IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
@@ -482,7 +482,7 @@ static HRESULT WINAPI domtext_get_data(
     BSTR *p)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    HRESULT hr = E_FAIL;
+    HRESULT hr;
     VARIANT vRet;
 
     if(!p)
@@ -502,17 +502,14 @@ static HRESULT WINAPI domtext_put_data(
     BSTR data)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    HRESULT hr = E_FAIL;
     VARIANT val;
 
-    TRACE("%p %s\n", This, debugstr_w(data) );
+    TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
 
     V_VT(&val) = VT_BSTR;
     V_BSTR(&val) = data;
 
-    hr = IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), val );
-
-    return hr;
+    return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(&This->node), val );
 }
 
 static HRESULT WINAPI domtext_get_length(
@@ -520,24 +517,22 @@ static HRESULT WINAPI domtext_get_length(
     LONG *len)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pContent;
-    LONG nLength = 0;
+    HRESULT hr;
+    BSTR data;
 
-    TRACE("%p\n", iface);
+    TRACE("(%p)->(%p)\n", This, len);
 
     if(!len)
         return E_INVALIDARG;
 
-    pContent = xmlNodeGetContent(This->node.node);
-    if(pContent)
+    hr = IXMLDOMText_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        nLength = xmlStrlen(pContent);
-        xmlFree(pContent);
+        *len = SysStringLen(data);
+        SysFreeString(data);
     }
 
-    *len = nLength;
-
-    return S_OK;
+    return hr;
 }
 
 static HRESULT WINAPI domtext_substringData(
@@ -545,11 +540,10 @@ static HRESULT WINAPI domtext_substringData(
     LONG offset, LONG count, BSTR *p)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
-    xmlChar *pContent;
-    LONG nLength = 0;
-    HRESULT hr = S_FALSE;
+    HRESULT hr;
+    BSTR data;
 
-    TRACE("%p\n", iface);
+    TRACE("(%p)->(%d %d %p)\n", This, offset, count, p);
 
     if(!p)
         return E_INVALIDARG;
@@ -559,26 +553,24 @@ static HRESULT WINAPI domtext_substringData(
         return E_INVALIDARG;
 
     if(count == 0)
-        return hr;
+        return S_FALSE;
 
-    pContent = xmlNodeGetContent(This->node.node);
-    if(pContent)
+    hr = IXMLDOMText_get_data(iface, &data);
+    if(hr == S_OK)
     {
-        nLength = xmlStrlen(pContent);
+        LONG len = SysStringLen(data);
 
-        if( offset < nLength)
+        if(offset < len)
         {
-            BSTR sContent = bstr_from_xmlChar(pContent);
-            if(offset + count > nLength)
-                *p = SysAllocString(&sContent[offset]);
+            if(offset + count > len)
+                *p = SysAllocString(&data[offset]);
             else
-                *p = SysAllocStringLen(&sContent[offset], count);
-
-            SysFreeString(sContent);
-            hr = S_OK;
+                *p = SysAllocStringLen(&data[offset], count);
         }
+        else
+            hr = S_FALSE;
 
-        xmlFree(pContent);
+        SysFreeString(data);
     }
 
     return hr;
@@ -589,26 +581,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(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 = 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;
 }
@@ -618,16 +614,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\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)
@@ -635,48 +629,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);
-
-            SysFreeString(sNewString);
-        }
+        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(sContent);
+        hr = IXMLDOMText_put_data(iface, str);
 
-        xmlFree(pXmlContent);
+        SysFreeString(str);
+        SysFreeString(data);
     }
 
     return hr;
@@ -690,7 +665,7 @@ static HRESULT WINAPI domtext_deleteData(
     LONG len = -1;
     BSTR str;
 
-    TRACE("%p %d %d\n", iface, offset, count);
+    TRACE("(%p)->(%d %d)\n", iface, offset, count);
 
     hr = IXMLDOMText_get_length(iface, &len);
     if(hr != S_OK) return hr;
@@ -733,15 +708,25 @@ static HRESULT WINAPI domtext_replaceData(
     IXMLDOMText *iface,
     LONG offset, LONG count, BSTR p)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    domtext *This = impl_from_IXMLDOMText( iface );
+    HRESULT hr;
+
+    TRACE("(%p)->(%d %d %s)\n", This, offset, count, debugstr_w(p));
+
+    hr = IXMLDOMText_deleteData(iface, offset, count);
+
+    if (hr == S_OK)
+       hr = IXMLDOMText_insertData(iface, offset, p);
+
+    return hr;
 }
 
 static HRESULT WINAPI domtext_splitText(
     IXMLDOMText *iface,
     LONG offset, IXMLDOMText **txtNode)
 {
-    FIXME("\n");
+    domtext *This = impl_from_IXMLDOMText( iface );
+    FIXME("(%p)->(%d %p)\n", This, offset, txtNode);
     return E_NOTIMPL;
 }