Alistair Leslie-Hughes : msxml3: Implemented IXMLDOMText_insertData.

Alexandre Julliard julliard at winehq.org
Mon Mar 10 17:05:04 CDT 2008


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

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Mon Mar 10 21:33:58 2008 +1100

msxml3: Implemented IXMLDOMText_insertData.

---

 dlls/msxml3/tests/domdoc.c |   41 +++++++++++++++++++++++++++
 dlls/msxml3/text.c         |   66 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 105 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 3c11be8..5d7fc0c 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -653,6 +653,47 @@ static void test_domdoc( void )
         ok( !lstrcmpW( str, _bstr_("This &is a ; test <>\\Append") ), "incorrect get_text string\n");
         SysFreeString(str);
 
+        /* test insertData */
+        str = SysAllocStringLen(NULL, 0);
+        r = IXMLDOMText_insertData(nodetext, -1, str);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, -1, NULL);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 1000, str);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 1000, NULL);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 0, NULL);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 0, str);
+        ok(r == S_OK, "ret %08x\n", r );
+        SysFreeString(str);
+
+        r = IXMLDOMText_insertData(nodetext, -1, _bstr_("Inserting"));
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 1000, _bstr_("Inserting"));
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 0, _bstr_("Begin "));
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 17, _bstr_("Middle"));
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_insertData(nodetext, 39, _bstr_(" End"));
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
         IXMLDOMText_Release( nodetext );
     }
     SysFreeString( str );
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index eab8f26..92dec48 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -2,6 +2,7 @@
  *    DOM text node implementation
  *
  * Copyright 2006 Huw Davies
+ * Copyright 2007-2008 Alistair Leslie-Hughes
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -617,8 +618,69 @@ static HRESULT WINAPI domtext_insertData(
     IXMLDOMText *iface,
     long offset, BSTR p)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    domtext *This = impl_from_IXMLDOMText( iface );
+    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->element );
+    xmlChar *pXmlContent;
+    BSTR sNewString;
+    HRESULT hr = S_FALSE;
+    long nLength = 0, nLengthP = 0;
+    xmlChar *str = NULL;
+
+    TRACE("%p\n", This);
+
+    /* If have a NULL or empty string, dont do anything. */
+    if(SysStringLen(p) == 0)
+        return S_OK;
+
+    if(offset < 0)
+    {
+        return E_INVALIDARG;
+    }
+
+    pXmlContent = xmlNodeGetContent(pDOMNode->node);
+    if(pXmlContent)
+    {
+        BSTR sContent = bstr_from_xmlChar( pXmlContent );
+        nLength = SysStringLen(sContent);
+        nLengthP = SysStringLen(p);
+
+        if(nLength < offset)
+        {
+            SysFreeString(sContent);
+            xmlFree(pXmlContent);
+
+            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((WCHAR*)sNewString);
+            if(str)
+            {
+                xmlNodeSetContent(pDOMNode->node, str);
+                hr = S_OK;
+            }
+
+            SysFreeString(sNewString);
+        }
+
+        SysFreeString(sContent);
+
+        xmlFree(pXmlContent);
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI domtext_deleteData(




More information about the wine-cvs mailing list