[PATCH] Implemented IXMLDOMText insertData

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Thu Mar 6 04:15:41 CST 2008


---
 dlls/msxml3/tests/domdoc.c |   42 +++++++++++++++++++++++++++-
 dlls/msxml3/text.c         |   65 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 104 insertions(+), 3 deletions(-)

diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index e34872e..261fe5b 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -2,7 +2,7 @@
  * XML test
  *
  * Copyright 2005 Mike McCormack for CodeWeavers
- * Copyright 2007 Alistair Leslie-Hughes
+ * 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
@@ -652,6 +652,46 @@ static void test_domdoc( void )
         ok(r == S_OK, "ret %08x\n", r );
         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 );
+        
+        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 );
     }
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index b446052..82e4938 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
@@ -616,8 +617,68 @@ 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 bContent = bstr_from_xmlChar( pXmlContent );
+        nLength = SysStringLen(bContent);
+        nLengthP = SysStringLen(p);
+        
+        if(nLength < offset)
+        {
+            xmlFree(pXmlContent);
+            
+            return E_INVALIDARG;
+        }
+    
+        sNewString = SysAllocStringLen(NULL, nLength + nLengthP + 1);
+        if(sNewString)
+        {            
+            if(offset > 0)
+                memcpy(sNewString, bContent, offset * sizeof(WCHAR));
+                
+            memcpy(&sNewString[offset], p, nLengthP * sizeof(WCHAR));
+            
+            if(offset+nLengthP < nLength)
+                memcpy(&sNewString[offset+nLengthP], &bContent[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(bContent);
+        
+        xmlFree(pXmlContent);
+    }
+    
+    return hr;
 }
 
 static HRESULT WINAPI domtext_deleteData(
-- 
1.5.4.1


--------------010904060801020309040904--




More information about the wine-patches mailing list