From 71ecd3b422daef6926f270e8f8d260929c1a6b44 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 5 Mar 2014 10:39:39 +0400 Subject: [PATCH] msxml3: Added stub support for ISAXDTDHandler/IVBSAXDTDHandler for MXWriter. --- dlls/msxml3/mxwriter.c | 156 ++++++++++++++++++++++++++++++++++++++++++ dlls/msxml3/tests/saxreader.c | 121 +++++++++----------------------- 2 files changed, 190 insertions(+), 87 deletions(-) diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index c94f7941281..12de67352fd 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -140,9 +140,11 @@ typedef struct ISAXContentHandler ISAXContentHandler_iface; ISAXLexicalHandler ISAXLexicalHandler_iface; ISAXDeclHandler ISAXDeclHandler_iface; + ISAXDTDHandler ISAXDTDHandler_iface; IVBSAXDeclHandler IVBSAXDeclHandler_iface; IVBSAXLexicalHandler IVBSAXLexicalHandler_iface; IVBSAXContentHandler IVBSAXContentHandler_iface; + IVBSAXDTDHandler IVBSAXDTDHandler_iface; LONG ref; MSXML_VERSION class_version; @@ -655,6 +657,16 @@ static inline mxwriter *impl_from_IVBSAXDeclHandler(IVBSAXDeclHandler *iface) return CONTAINING_RECORD(iface, mxwriter, IVBSAXDeclHandler_iface); } +static inline mxwriter *impl_from_ISAXDTDHandler(ISAXDTDHandler *iface) +{ + return CONTAINING_RECORD(iface, mxwriter, ISAXDTDHandler_iface); +} + +static inline mxwriter *impl_from_IVBSAXDTDHandler(IVBSAXDTDHandler *iface) +{ + return CONTAINING_RECORD(iface, mxwriter, IVBSAXDTDHandler_iface); +} + static HRESULT WINAPI mxwriter_QueryInterface(IMXWriter *iface, REFIID riid, void **obj) { mxwriter *This = impl_from_IMXWriter( iface ); @@ -681,6 +693,10 @@ static HRESULT WINAPI mxwriter_QueryInterface(IMXWriter *iface, REFIID riid, voi { *obj = &This->ISAXDeclHandler_iface; } + else if ( IsEqualGUID( riid, &IID_ISAXDTDHandler ) ) + { + *obj = &This->ISAXDTDHandler_iface; + } else if ( IsEqualGUID( riid, &IID_IVBSAXDeclHandler ) ) { *obj = &This->IVBSAXDeclHandler_iface; @@ -693,6 +709,10 @@ static HRESULT WINAPI mxwriter_QueryInterface(IMXWriter *iface, REFIID riid, voi { *obj = &This->IVBSAXContentHandler_iface; } + else if ( IsEqualGUID( riid, &IID_IVBSAXDTDHandler ) ) + { + *obj = &This->IVBSAXDTDHandler_iface; + } else if (dispex_query_interface(&This->dispex, riid, obj)) { return *obj ? S_OK : E_NOINTERFACE; @@ -2093,6 +2113,140 @@ static const IVBSAXContentHandlerVtbl VBSAXContentHandlerVtbl = { VBSAXContentHandler_skippedEntity }; +static HRESULT WINAPI SAXDTDHandler_QueryInterface(ISAXDTDHandler *iface, REFIID riid, void **obj) +{ + mxwriter *This = impl_from_ISAXDTDHandler( iface ); + return IMXWriter_QueryInterface(&This->IMXWriter_iface, riid, obj); +} + +static ULONG WINAPI SAXDTDHandler_AddRef(ISAXDTDHandler *iface) +{ + mxwriter *This = impl_from_ISAXDTDHandler( iface ); + return IMXWriter_AddRef(&This->IMXWriter_iface); +} + +static ULONG WINAPI SAXDTDHandler_Release(ISAXDTDHandler *iface) +{ + mxwriter *This = impl_from_ISAXDTDHandler( iface ); + return IMXWriter_Release(&This->IMXWriter_iface); +} + +static HRESULT WINAPI SAXDTDHandler_notationDecl(ISAXDTDHandler *iface, + const WCHAR *name, INT nname, + const WCHAR *publicid, INT npublicid, + const WCHAR *systemid, INT nsystemid) +{ + mxwriter *This = impl_from_ISAXDTDHandler( iface ); + FIXME("(%p)->(%s:%d, %s:%d, %s:%d): stub\n", This, debugstr_wn(name, nname), nname, + debugstr_wn(publicid, npublicid), npublicid, debugstr_wn(systemid, nsystemid), nsystemid); + return E_NOTIMPL; +} + +static HRESULT WINAPI SAXDTDHandler_unparsedEntityDecl(ISAXDTDHandler *iface, + const WCHAR *name, INT nname, + const WCHAR *publicid, INT npublicid, + const WCHAR *systemid, INT nsystemid, + const WCHAR *notation, INT nnotation) +{ + mxwriter *This = impl_from_ISAXDTDHandler( iface ); + FIXME("(%p)->(%s:%d, %s:%d, %s:%d, %s:%d): stub\n", This, debugstr_wn(name, nname), nname, + debugstr_wn(publicid, npublicid), npublicid, debugstr_wn(systemid, nsystemid), nsystemid, + debugstr_wn(notation, nnotation), nnotation); + return E_NOTIMPL; +} + +static const ISAXDTDHandlerVtbl SAXDTDHandlerVtbl = { + SAXDTDHandler_QueryInterface, + SAXDTDHandler_AddRef, + SAXDTDHandler_Release, + SAXDTDHandler_notationDecl, + SAXDTDHandler_unparsedEntityDecl +}; + +/*** IVBSAXDTDHandler ***/ +static HRESULT WINAPI VBSAXDTDHandler_QueryInterface(IVBSAXDTDHandler *iface, REFIID riid, void **obj) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + return IMXWriter_QueryInterface(&This->IMXWriter_iface, riid, obj); +} + +static ULONG WINAPI VBSAXDTDHandler_AddRef(IVBSAXDTDHandler *iface) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + return IMXWriter_AddRef(&This->IMXWriter_iface); +} + +static ULONG WINAPI VBSAXDTDHandler_Release(IVBSAXDTDHandler *iface) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + return IMXWriter_Release(&This->IMXWriter_iface); +} + +static HRESULT WINAPI VBSAXDTDHandler_GetTypeInfoCount(IVBSAXDTDHandler *iface, UINT* pctinfo) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + return IMXWriter_GetTypeInfoCount(&This->IMXWriter_iface, pctinfo); +} + +static HRESULT WINAPI VBSAXDTDHandler_GetTypeInfo(IVBSAXDTDHandler *iface, UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + return IMXWriter_GetTypeInfo(&This->IMXWriter_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI VBSAXDTDHandler_GetIDsOfNames(IVBSAXDTDHandler *iface, REFIID riid, LPOLESTR* rgszNames, + UINT cNames, LCID lcid, DISPID* rgDispId ) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + return IMXWriter_GetIDsOfNames(&This->IMXWriter_iface, riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI VBSAXDTDHandler_Invoke(IVBSAXDTDHandler *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr ) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + return IMXWriter_Invoke(&This->IMXWriter_iface, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, + pExcepInfo, puArgErr); +} + +static HRESULT WINAPI VBSAXDTDHandler_notationDecl(IVBSAXDTDHandler *iface, BSTR *name, BSTR *publicId, BSTR *systemId) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + + TRACE("(%p)->(%p %p %p)\n", This, name, publicId, systemId); + + if (!name || !publicId || !systemId) + return E_POINTER; + + return ISAXDTDHandler_notationDecl(&This->ISAXDTDHandler_iface, *name, -1, *publicId, -1, *systemId, -1); +} + +static HRESULT WINAPI VBSAXDTDHandler_unparsedEntityDecl(IVBSAXDTDHandler *iface, BSTR *name, BSTR *publicId, + BSTR *systemId, BSTR *notation) +{ + mxwriter *This = impl_from_IVBSAXDTDHandler( iface ); + + TRACE("(%p)->(%p %p %p %p)\n", This, name, publicId, systemId, notation); + + if (!name || !publicId || !systemId || !notation) + return E_POINTER; + + return ISAXDTDHandler_unparsedEntityDecl(&This->ISAXDTDHandler_iface, *name, -1, *publicId, -1, + *systemId, -1, *notation, -1); +} + +static const IVBSAXDTDHandlerVtbl VBSAXDTDHandlerVtbl = { + VBSAXDTDHandler_QueryInterface, + VBSAXDTDHandler_AddRef, + VBSAXDTDHandler_Release, + VBSAXDTDHandler_GetTypeInfoCount, + VBSAXDTDHandler_GetTypeInfo, + VBSAXDTDHandler_GetIDsOfNames, + VBSAXDTDHandler_Invoke, + VBSAXDTDHandler_notationDecl, + VBSAXDTDHandler_unparsedEntityDecl +}; + static const tid_t mxwriter_iface_tids[] = { IMXWriter_tid, 0 @@ -2121,9 +2275,11 @@ HRESULT MXWriter_create(MSXML_VERSION version, void **ppObj) This->ISAXContentHandler_iface.lpVtbl = &SAXContentHandlerVtbl; This->ISAXLexicalHandler_iface.lpVtbl = &SAXLexicalHandlerVtbl; This->ISAXDeclHandler_iface.lpVtbl = &SAXDeclHandlerVtbl; + This->ISAXDTDHandler_iface.lpVtbl = &SAXDTDHandlerVtbl; This->IVBSAXDeclHandler_iface.lpVtbl = &VBSAXDeclHandlerVtbl; This->IVBSAXLexicalHandler_iface.lpVtbl = &VBSAXLexicalHandlerVtbl; This->IVBSAXContentHandler_iface.lpVtbl = &VBSAXContentHandlerVtbl; + This->IVBSAXDTDHandler_iface.lpVtbl = &VBSAXDTDHandlerVtbl; This->ref = 1; This->class_version = version; diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index b83ee516124..10ef748f952 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -2862,14 +2862,21 @@ static void test_saxreader_encoding(void) static void test_mxwriter_handlers(void) { - IVBSAXContentHandler *vbhandler; - IVBSAXLexicalHandler *vblexical; - ISAXContentHandler *handler; - IMXWriter *writer, *writer2; - IVBSAXDeclHandler *vbdecl; - ISAXDeclHandler *decl; - ISAXLexicalHandler *lh; + IMXWriter *writer; HRESULT hr; + int i; + + static const REFIID riids[] = + { + &IID_ISAXContentHandler, + &IID_ISAXLexicalHandler, + &IID_ISAXDeclHandler, + &IID_ISAXDTDHandler, + &IID_IVBSAXDeclHandler, + &IID_IVBSAXLexicalHandler, + &IID_IVBSAXContentHandler, + &IID_IVBSAXDTDHandler + }; hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IMXWriter, (void**)&writer); @@ -2877,86 +2884,26 @@ static void test_mxwriter_handlers(void) EXPECT_REF(writer, 1); - /* ISAXContentHandler/IVBSAXContentHandler */ - hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void**)&handler); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - EXPECT_REF(writer, 2); - EXPECT_REF(handler, 2); - - hr = ISAXContentHandler_QueryInterface(handler, &IID_IMXWriter, (void**)&writer2); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(writer2 == writer, "got %p, expected %p\n", writer2, writer); - EXPECT_REF(writer, 3); - EXPECT_REF(writer2, 3); - IMXWriter_Release(writer2); - ISAXContentHandler_Release(handler); - - hr = IMXWriter_QueryInterface(writer, &IID_IVBSAXContentHandler, (void**)&vbhandler); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - EXPECT_REF(writer, 2); - EXPECT_REF(handler, 2); - - hr = IVBSAXContentHandler_QueryInterface(vbhandler, &IID_IMXWriter, (void**)&writer2); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(writer2 == writer, "got %p, expected %p\n", writer2, writer); - EXPECT_REF(writer, 3); - EXPECT_REF(writer2, 3); - IMXWriter_Release(writer2); - IVBSAXContentHandler_Release(vbhandler); - - /* ISAXLexicalHandler/IVBSAXLexicalHandler */ - hr = IMXWriter_QueryInterface(writer, &IID_ISAXLexicalHandler, (void**)&lh); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - EXPECT_REF(writer, 2); - EXPECT_REF(lh, 2); - - hr = ISAXLexicalHandler_QueryInterface(lh, &IID_IMXWriter, (void**)&writer2); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(writer2 == writer, "got %p, expected %p\n", writer2, writer); - EXPECT_REF(writer, 3); - EXPECT_REF(writer2, 3); - IMXWriter_Release(writer2); - ISAXLexicalHandler_Release(lh); - - hr = IMXWriter_QueryInterface(writer, &IID_IVBSAXLexicalHandler, (void**)&vblexical); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - EXPECT_REF(writer, 2); - EXPECT_REF(vblexical, 2); - - hr = IVBSAXLexicalHandler_QueryInterface(vblexical, &IID_IMXWriter, (void**)&writer2); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(writer2 == writer, "got %p, expected %p\n", writer2, writer); - EXPECT_REF(writer, 3); - EXPECT_REF(writer2, 3); - IMXWriter_Release(writer2); - IVBSAXLexicalHandler_Release(vblexical); - - /* ISAXDeclHandler/IVBSAXDeclHandler */ - hr = IMXWriter_QueryInterface(writer, &IID_ISAXDeclHandler, (void**)&decl); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - EXPECT_REF(writer, 2); - EXPECT_REF(lh, 2); - - hr = ISAXDeclHandler_QueryInterface(decl, &IID_IMXWriter, (void**)&writer2); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(writer2 == writer, "got %p, expected %p\n", writer2, writer); - EXPECT_REF(writer, 3); - EXPECT_REF(writer2, 3); - IMXWriter_Release(writer2); - ISAXDeclHandler_Release(decl); - - hr = IMXWriter_QueryInterface(writer, &IID_IVBSAXDeclHandler, (void**)&vbdecl); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - EXPECT_REF(writer, 2); - EXPECT_REF(vbdecl, 2); - - hr = IVBSAXDeclHandler_QueryInterface(vbdecl, &IID_IMXWriter, (void**)&writer2); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(writer2 == writer, "got %p, expected %p\n", writer2, writer); - EXPECT_REF(writer, 3); - EXPECT_REF(writer2, 3); - IMXWriter_Release(writer2); - IVBSAXDeclHandler_Release(vbdecl); + for (i = 0; i < sizeof(riids)/sizeof(REFIID); i++) + { + IUnknown *handler; + IMXWriter *writer2; + + /* handler from IMXWriter */ + hr = IMXWriter_QueryInterface(writer, riids[i], (void**)&handler); + ok(hr == S_OK, "%s, expected S_OK, got %08x\n", wine_dbgstr_guid(riids[i]), hr); + EXPECT_REF(writer, 2); + EXPECT_REF(handler, 2); + + /* IMXWriter from a handler */ + hr = IUnknown_QueryInterface(handler, &IID_IMXWriter, (void**)&writer2); + ok(hr == S_OK, "%s, expected S_OK, got %08x\n", wine_dbgstr_guid(riids[i]), hr); + ok(writer2 == writer, "got %p, expected %p\n", writer2, writer); + EXPECT_REF(writer, 3); + EXPECT_REF(writer2, 3); + IMXWriter_Release(writer2); + IUnknown_Release(handler); + } IMXWriter_Release(writer); } -- 2.11.4.GIT