[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