Alistair Leslie-Hughes : msxml3: Allow IXMLDOMDocument to save as another IXMLDOMDocument.

Alexandre Julliard julliard at winehq.org
Wed Mar 12 06:44:32 CDT 2008


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

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Wed Mar 12 21:47:17 2008 +1100

msxml3: Allow IXMLDOMDocument to save as another IXMLDOMDocument.

---

 dlls/msxml3/domdoc.c       |   29 +++++++++++++++++++++-
 dlls/msxml3/tests/domdoc.c |   55 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 82 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index fed1b8b..a05247a 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1559,12 +1559,37 @@ static HRESULT WINAPI domdoc_save(
     TRACE("(%p)->(var(vt %x, %s))\n", This, V_VT(&destination),
           V_VT(&destination) == VT_BSTR ? debugstr_w(V_BSTR(&destination)) : NULL);
 
-    if(V_VT(&destination) != VT_BSTR)
+    if(V_VT(&destination) != VT_BSTR && V_VT(&destination) != VT_UNKNOWN)
     {
-        FIXME("Unhandled vt %x\n", V_VT(&destination));
+        FIXME("Unhandled vt %d\n", V_VT(&destination));
         return S_FALSE;
     }
 
+    if(V_VT(&destination) == VT_UNKNOWN)
+    {
+        IUnknown *pUnk = V_UNKNOWN(&destination);
+        IXMLDOMDocument *pDocument;
+
+        ret = IXMLDOMDocument_QueryInterface(pUnk, &IID_IXMLDOMDocument2, (void**)&pDocument);
+        if(ret == S_OK)
+        {
+            BSTR bXML;
+            VARIANT_BOOL bSuccessful;
+
+            ret = IXMLDOMDocument_get_xml(iface, &bXML);
+            if(ret == S_OK)
+            {
+                ret = IXMLDOMDocument_loadXML(pDocument, bXML, &bSuccessful);
+
+                SysFreeString(bXML);
+            }
+
+            IXMLDOMDocument_Release(pDocument);
+        }
+
+        return ret;
+    }
+
     handle = CreateFileW( V_BSTR(&destination), GENERIC_WRITE, 0,
                           NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
     if( handle == INVALID_HANDLE_VALUE )
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index c4c5b9c..b597670 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -3013,6 +3013,60 @@ static void test_nodeTypeTests( void )
     free_bstrs();
 }
 
+static void test_DocumentSaveToDocument(void)
+{
+    IXMLDOMDocument *doc = NULL;
+    IXMLDOMDocument *doc2 = NULL;
+    IXMLDOMElement *pRoot;
+
+    HRESULT hr;
+
+    hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
+    if( hr != S_OK )
+        return;
+
+    hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc2 );
+    if( hr != S_OK )
+    {
+        IXMLDOMDocument_Release(doc);
+        return;
+    }
+
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    if(hr == S_OK)
+    {
+        hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)pRoot, NULL);
+        ok(hr == S_OK, "ret %08x\n", hr );
+        if(hr == S_OK)
+        {
+            VARIANT vDoc;
+            BSTR sOrig;
+            BSTR sNew;
+
+            V_VT(&vDoc) = VT_UNKNOWN;
+            V_UNKNOWN(&vDoc) = (IUnknown*)doc2;
+
+            hr = IXMLDOMDocument_save(doc, vDoc);
+            ok(hr == S_OK, "ret %08x\n", hr );
+
+            hr = IXMLDOMDocument_get_xml(doc, &sOrig);
+            ok(hr == S_OK, "ret %08x\n", hr );
+
+            hr = IXMLDOMDocument_get_xml(doc2, &sNew);
+            ok(hr == S_OK, "ret %08x\n", hr );
+
+            ok( !lstrcmpW( sOrig, sNew ), "New document is not the same as origial\n");
+
+            SysFreeString(sOrig);
+            SysFreeString(sNew);
+        }
+    }
+
+    IXMLDOMDocument_Release(doc2);
+    IXMLDOMDocument_Release(doc);
+}
+
 START_TEST(domdoc)
 {
     HRESULT r;
@@ -3034,6 +3088,7 @@ START_TEST(domdoc)
     test_cloneNode();
     test_xmlTypes();
     test_nodeTypeTests();
+    test_DocumentSaveToDocument();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list