[PATCH] Rewrite IXMLDOMDocument2 save to behave more like msxml3

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Tue Apr 20 22:08:33 CDT 2010


---
 dlls/msxml3/domdoc.c       |   31 ++++++---
 dlls/msxml3/tests/domdoc.c |  148 +++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 160 insertions(+), 19 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index aae8a34..bdd2d00 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1747,26 +1747,37 @@ static HRESULT WINAPI domdoc_save(
     if(V_VT(&destination) == VT_UNKNOWN)
     {
         IUnknown *pUnk = V_UNKNOWN(&destination);
-        IXMLDOMDocument *pDocument;
+        IUnknown *pUnkRemote;
 
-        ret = IXMLDOMDocument_QueryInterface(pUnk, &IID_IXMLDOMDocument2, (void**)&pDocument);
+        ret = IUnknown_QueryInterface(pUnk, &IID_IUnknown, (void**)&pUnkRemote);
         if(ret == S_OK)
         {
-            BSTR bXML;
-            VARIANT_BOOL bSuccessful;
+            IPersistStream *pStreamLocal;
+            IStream *pStream = NULL;
 
-            ret = IXMLDOMDocument_get_xml(iface, &bXML);
-            if(ret == S_OK)
+            if((ret = IUnknown_QueryInterface(pUnkRemote, &IID_IStream, (void**)&pStream)) == S_OK)
             {
-                ret = IXMLDOMDocument_loadXML(pDocument, bXML, &bSuccessful);
+                TRACE("Using IStream\n");
 
-                SysFreeString(bXML);
+                ret = IUnknown_QueryInterface(iface, &IID_IPersistStream, (void**)&pStreamLocal);
+                if(ret == S_OK)
+                {
+                    ret = IPersistStream_Save(pStreamLocal, pStream, FALSE);
+
+                    IPersistStream_Release(pStreamLocal);
+                }
+
+                IStream_Release(pStream);
             }
 
-            IXMLDOMDocument_Release(pDocument);
+            IUnknown_Release(pUnkRemote);
+        }
+        else
+        {
+            ERR("Failed to get IUnknown interface\n");
         }
 
-        TRACE("ret %d\n", ret);
+        TRACE("ret 0x%08x\n", ret);
 
         return ret;
     }
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index a743e51..3393fb7 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -36,6 +36,8 @@
 
 #include "initguid.h"
 
+#include "asptlb.h"
+
 DEFINE_GUID(IID_IObjectSafety, 0xcb5bdc81, 0x93c1, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
 
 static const WCHAR szEmpty[] = { 0 };
@@ -313,6 +315,18 @@ static VARIANT _variantbstr_(const char *str)
     return v;
 }
 
+static const char *debugstr_guid(REFIID riid)
+{
+    static char buf[50];
+
+    sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
+            riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
+            riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
+            riid->Data4[5], riid->Data4[6], riid->Data4[7]);
+
+    return buf;
+}
+
 static BOOL compareIgnoreReturns(BSTR sLeft, BSTR sRight)
 {
     for (;;)
@@ -4580,18 +4594,20 @@ static void test_DocumentSaveToDocument(void)
             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 );
+            todo_wine ok(hr == S_OK, "ret %08x\n", hr );
+            if(hr == S_OK)
+            {
+                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 );
+                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");
+                ok( !lstrcmpW( sOrig, sNew ), "New document is not the same as origial\n");
 
-            SysFreeString(sOrig);
-            SysFreeString(sNew);
+                SysFreeString(sOrig);
+                SysFreeString(sNew);
+            }
         }
     }
 
@@ -5456,6 +5472,120 @@ static void test_document_IObjectSafety(void)
     IXMLDOMDocument_Release(doc);
 }
 
+static IUnknown unknown;
+
+BOOL unknown_called = FALSE;
+BOOL stream_called = FALSE;
+BOOL seq_stream_called = FALSE;
+BOOL per_stream_called = FALSE;
+BOOL perInit_stream_called = FALSE;
+BOOL responce_stream_called = FALSE;
+BOOL xmldocument_called = FALSE;
+
+static HRESULT WINAPI Testing_QueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppvObj)
+{
+    *ppvObj = NULL;
+
+    if(IsEqualGUID( riid, &IID_IUnknown ))
+    {
+        unknown_called = TRUE;
+        *ppvObj = iface;
+        return S_OK;
+    }
+    else if(IsEqualGUID( riid, &IID_IStream ))
+    {
+        stream_called = TRUE;
+        return E_NOINTERFACE;
+    }
+    else if(IsEqualGUID( riid, &IID_ISequentialStream ))
+    {
+        seq_stream_called = TRUE;
+        return E_NOINTERFACE;
+    }
+    else if(IsEqualGUID( riid, &IID_IPersistStream ))
+    {
+        per_stream_called = TRUE;
+        return E_NOINTERFACE;
+    }
+    else if(IsEqualGUID( riid, &IID_IPersistStreamInit ))
+    {
+        perInit_stream_called = TRUE;
+        return E_NOINTERFACE;
+    }
+    else if(IsEqualGUID( riid, &IID_IResponse ))
+    {
+        responce_stream_called = TRUE;
+        return E_NOINTERFACE;
+    }
+    else if(IsEqualGUID( riid, &IID_IXMLDOMDocument2 ))
+    {
+        xmldocument_called = TRUE;
+        return E_NOINTERFACE;
+    }
+
+    ok(0, "unexpected interface %s\n", debugstr_guid(riid));
+
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI Testing_AddRef(IUnknown *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI Testing_Release(IUnknown *iface)
+{
+    return 1;
+}
+
+static IUnknownVtbl testing_IUnknownVtbl =
+{
+    Testing_QueryInterface,
+    Testing_AddRef,
+    Testing_Release
+};
+
+static IUnknown unknown = { &testing_IUnknownVtbl };
+
+
+void test_domdoc_save(void)
+{
+    IXMLDOMDocument2 *doc = NULL;
+    VARIANT_BOOL bSucc;
+    HRESULT hr;
+
+    hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
+    if( hr != S_OK )
+        return;
+
+    hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szTypeValueXML), &bSucc);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n");
+    if(bSucc == VARIANT_TRUE)
+    {
+        VARIANT v;
+        V_VT(&v) = VT_UNKNOWN;
+        V_UNKNOWN(&v) = (IUnknown*)&unknown;
+
+        IXMLDOMDocument2_save(doc, v);
+
+        ok(unknown_called, "unknown interface not queried\n");
+        ok(stream_called, "IStream interface not queried\n");
+        todo_wine ok(seq_stream_called, "ISequentialStream interface not queried\n");
+        todo_wine ok(per_stream_called, "IPersistStream interface not queried\n");
+        todo_wine ok(perInit_stream_called, "IPersistStreamInit interface not queried\n");
+        todo_wine ok(responce_stream_called, "IResponse interface not queried\n");
+        ok(!xmldocument_called, "IXMLDOMDocument2 interface called but not expected\n");
+
+        ok(hr == S_OK, "ret %08x\n", hr );
+    }
+
+    IXMLDOMDocument2_Release(doc);
+
+    free_bstrs();
+}
+
+
 START_TEST(domdoc)
 {
     HRESULT r;
-- 
1.6.2.5


--------------070806000702000907080202--



More information about the wine-patches mailing list