[PATCH 0/3] MR10031: msxml3/sax: Add some traces for setting handlers.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10031
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/saxreader.c | 123 ++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 55 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 0daf6d8425d..801106e3a07 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -2890,27 +2890,29 @@ static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface) { - saxreader *This = impl_from_IVBSAXXMLReader( iface ); - TRACE("%p\n", This ); - return InterlockedIncrement( &This->ref ); + saxreader *reader = impl_from_IVBSAXXMLReader(iface); + LONG refcount = InterlockedIncrement(&reader->ref); + + TRACE("%p refcount %lu.\n", iface, refcount); + + return refcount; } static ULONG WINAPI saxxmlreader_Release( IVBSAXXMLReader* iface) { - saxreader *This = impl_from_IVBSAXXMLReader( iface ); - LONG ref; + saxreader *reader = impl_from_IVBSAXXMLReader(iface); + LONG refcount = InterlockedDecrement(&reader->ref); - TRACE("%p\n", This ); + TRACE("%p refcount %lu.\n", iface, refcount); - ref = InterlockedDecrement( &This->ref ); - if ( ref == 0 ) + if (!refcount) { int i; for (i = 0; i < SAXHandler_Last; i++) { - struct saxanyhandler_iface *saxiface = &This->saxhandlers[i].u.anyhandler; + struct saxanyhandler_iface *saxiface = &reader->saxhandlers[i].u.anyhandler; if (saxiface->handler) IUnknown_Release(saxiface->handler); @@ -2919,14 +2921,15 @@ static ULONG WINAPI saxxmlreader_Release( IUnknown_Release(saxiface->vbhandler); } - SysFreeString(This->xmldecl_version); - free_bstr_pool(&This->pool); + SysFreeString(reader->xmldecl_version); + free_bstr_pool(&reader->pool); - free(This); + free(reader); } - return ref; + return refcount; } + /*** IDispatch ***/ static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo ) { @@ -3017,12 +3020,13 @@ static HRESULT WINAPI saxxmlreader_get_entityResolver( return saxreader_get_handler(This, SAXEntityResolver, TRUE, (void**)resolver); } -static HRESULT WINAPI saxxmlreader_put_entityResolver( - IVBSAXXMLReader* iface, - IVBSAXEntityResolver *resolver) +static HRESULT WINAPI saxxmlreader_putref_entityResolver(IVBSAXXMLReader *iface, IVBSAXEntityResolver *resolver) { - saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return saxreader_put_handler(This, SAXEntityResolver, resolver, TRUE); + saxreader *reader = impl_from_IVBSAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, resolver); + + return saxreader_put_handler(reader, SAXEntityResolver, resolver, TRUE); } static HRESULT WINAPI saxxmlreader_get_contentHandler( @@ -3033,12 +3037,13 @@ static HRESULT WINAPI saxxmlreader_get_contentHandler( return saxreader_get_handler(This, SAXContentHandler, TRUE, (void**)handler); } -static HRESULT WINAPI saxxmlreader_put_contentHandler( - IVBSAXXMLReader* iface, - IVBSAXContentHandler *handler) +static HRESULT WINAPI saxxmlreader_putref_contentHandler(IVBSAXXMLReader *iface, IVBSAXContentHandler *handler) { - saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return saxreader_put_handler(This, SAXContentHandler, handler, TRUE); + saxreader *reader = impl_from_IVBSAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, handler); + + return saxreader_put_handler(reader, SAXContentHandler, handler, TRUE); } static HRESULT WINAPI saxxmlreader_get_dtdHandler( @@ -3049,12 +3054,13 @@ static HRESULT WINAPI saxxmlreader_get_dtdHandler( return saxreader_get_handler(This, SAXDTDHandler, TRUE, (void**)handler); } -static HRESULT WINAPI saxxmlreader_put_dtdHandler( - IVBSAXXMLReader* iface, - IVBSAXDTDHandler *handler) +static HRESULT WINAPI saxxmlreader_putref_dtdHandler(IVBSAXXMLReader *iface, IVBSAXDTDHandler *handler) { - saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return saxreader_put_handler(This, SAXDTDHandler, handler, TRUE); + saxreader *reader = impl_from_IVBSAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, handler); + + return saxreader_put_handler(reader, SAXDTDHandler, handler, TRUE); } static HRESULT WINAPI saxxmlreader_get_errorHandler( @@ -3065,12 +3071,13 @@ static HRESULT WINAPI saxxmlreader_get_errorHandler( return saxreader_get_handler(This, SAXErrorHandler, TRUE, (void**)handler); } -static HRESULT WINAPI saxxmlreader_put_errorHandler( - IVBSAXXMLReader* iface, - IVBSAXErrorHandler *handler) +static HRESULT WINAPI saxxmlreader_putref_errorHandler(IVBSAXXMLReader *iface, IVBSAXErrorHandler *handler) { - saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return saxreader_put_handler(This, SAXErrorHandler, handler, TRUE); + saxreader *reader = impl_from_IVBSAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, handler); + + return saxreader_put_handler(reader, SAXErrorHandler, handler, TRUE); } static HRESULT WINAPI saxxmlreader_get_baseURL( @@ -3139,13 +3146,13 @@ static const struct IVBSAXXMLReaderVtbl VBSAXXMLReaderVtbl = saxxmlreader_getProperty, saxxmlreader_putProperty, saxxmlreader_get_entityResolver, - saxxmlreader_put_entityResolver, + saxxmlreader_putref_entityResolver, saxxmlreader_get_contentHandler, - saxxmlreader_put_contentHandler, + saxxmlreader_putref_contentHandler, saxxmlreader_get_dtdHandler, - saxxmlreader_put_dtdHandler, + saxxmlreader_putref_dtdHandler, saxxmlreader_get_errorHandler, - saxxmlreader_put_errorHandler, + saxxmlreader_putref_errorHandler, saxxmlreader_get_baseURL, saxxmlreader_put_baseURL, saxxmlreader_get_secureBaseURL, @@ -3260,12 +3267,13 @@ static HRESULT WINAPI isaxxmlreader_getEntityResolver( return saxreader_get_handler(This, SAXEntityResolver, FALSE, (void**)resolver); } -static HRESULT WINAPI isaxxmlreader_putEntityResolver( - ISAXXMLReader* iface, - ISAXEntityResolver *resolver) +static HRESULT WINAPI isaxxmlreader_putEntityResolver(ISAXXMLReader *iface, ISAXEntityResolver *resolver) { - saxreader *This = impl_from_ISAXXMLReader( iface ); - return saxreader_put_handler(This, SAXEntityResolver, resolver, FALSE); + saxreader *reader = impl_from_ISAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, resolver); + + return saxreader_put_handler(reader, SAXEntityResolver, resolver, FALSE); } static HRESULT WINAPI isaxxmlreader_getContentHandler( @@ -3276,12 +3284,13 @@ static HRESULT WINAPI isaxxmlreader_getContentHandler( return saxreader_get_handler(This, SAXContentHandler, FALSE, (void**)handler); } -static HRESULT WINAPI isaxxmlreader_putContentHandler( - ISAXXMLReader* iface, - ISAXContentHandler *handler) +static HRESULT WINAPI isaxxmlreader_putContentHandler(ISAXXMLReader *iface, ISAXContentHandler *handler) { - saxreader *This = impl_from_ISAXXMLReader( iface ); - return saxreader_put_handler(This, SAXContentHandler, handler, FALSE); + saxreader *reader = impl_from_ISAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, handler); + + return saxreader_put_handler(reader, SAXContentHandler, handler, FALSE); } static HRESULT WINAPI isaxxmlreader_getDTDHandler( @@ -3292,12 +3301,13 @@ static HRESULT WINAPI isaxxmlreader_getDTDHandler( return saxreader_get_handler(This, SAXDTDHandler, FALSE, (void**)handler); } -static HRESULT WINAPI isaxxmlreader_putDTDHandler( - ISAXXMLReader* iface, - ISAXDTDHandler *handler) +static HRESULT WINAPI isaxxmlreader_putDTDHandler(ISAXXMLReader *iface, ISAXDTDHandler *handler) { - saxreader *This = impl_from_ISAXXMLReader( iface ); - return saxreader_put_handler(This, SAXDTDHandler, handler, FALSE); + saxreader *reader = impl_from_ISAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, handler); + + return saxreader_put_handler(reader, SAXDTDHandler, handler, FALSE); } static HRESULT WINAPI isaxxmlreader_getErrorHandler( @@ -3308,10 +3318,13 @@ static HRESULT WINAPI isaxxmlreader_getErrorHandler( return saxreader_get_handler(This, SAXErrorHandler, FALSE, (void**)handler); } -static HRESULT WINAPI isaxxmlreader_putErrorHandler(ISAXXMLReader* iface, ISAXErrorHandler *handler) +static HRESULT WINAPI isaxxmlreader_putErrorHandler(ISAXXMLReader *iface, ISAXErrorHandler *handler) { - saxreader *This = impl_from_ISAXXMLReader( iface ); - return saxreader_put_handler(This, SAXErrorHandler, handler, FALSE); + saxreader *reader = impl_from_ISAXXMLReader(iface); + + TRACE("%p, %p.\n", iface, handler); + + return saxreader_put_handler(reader, SAXErrorHandler, handler, FALSE); } static HRESULT WINAPI isaxxmlreader_getBaseURL( -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10031
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/saxreader.c | 235 ++++++++++++++++++++++++++++++++++ dlls/msxml6/tests/saxreader.c | 192 +++++++++++++++++++++++++++ 2 files changed, 427 insertions(+) diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 2ad2b059aa4..f7a81e70244 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -35,6 +35,171 @@ #include "wine/test.h" +struct sink +{ + IVBSAXContentHandler IVBSAXContentHandler_iface; + LONG refcount; +}; + +static struct sink *impl_from_IVBSAXContentHandler(IVBSAXContentHandler *iface) +{ + return CONTAINING_RECORD(iface, struct sink, IVBSAXContentHandler_iface); +} + +static HRESULT WINAPI vb_content_handler_QueryInterface(IVBSAXContentHandler *iface, + REFIID riid, void **obj) +{ + if (IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_IDispatch) + || IsEqualGUID(riid, &IID_IVBSAXContentHandler)) + { + *obj = iface; + IVBSAXContentHandler_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI vb_content_handler_AddRef(IVBSAXContentHandler *iface) +{ + struct sink *sink = impl_from_IVBSAXContentHandler(iface); + return InterlockedIncrement(&sink->refcount); +} + +static ULONG WINAPI vb_content_handler_Release(IVBSAXContentHandler *iface) +{ + struct sink *sink = impl_from_IVBSAXContentHandler(iface); + LONG refcount = InterlockedDecrement(&sink->refcount); + + if (!refcount) + free(sink); + + return refcount; +} + +static HRESULT WINAPI vb_content_handler_GetTypeInfoCount(IVBSAXContentHandler *iface, UINT *count) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_GetTypeInfo(IVBSAXContentHandler *iface, UINT index, + LCID lcid, ITypeInfo **ti) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_GetIDsOfNames(IVBSAXContentHandler *iface, REFIID riid, + LPOLESTR *names, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_Invoke(IVBSAXContentHandler *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, + UINT *puArgErr) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_putref_documentLocator(IVBSAXContentHandler *iface, IVBSAXLocator *locator) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_startDocument(IVBSAXContentHandler *iface) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_endDocument(IVBSAXContentHandler *iface) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_startPrefixMapping(IVBSAXContentHandler *iface, BSTR *prefix, BSTR *uri) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_endPrefixMapping(IVBSAXContentHandler *iface, BSTR *prefix) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_startElement(IVBSAXContentHandler *iface, BSTR *uri, BSTR *localName, + BSTR *qname, IVBSAXAttributes * oAttributes) +{ + todo_wine + ok(uri != NULL && *uri != NULL, "Unexpected pointer.\n"); + ok(localName != NULL && *localName != NULL, "Unexpected pointer.\n"); + ok(qname != NULL && *qname != NULL, "Unexpected pointer.\n"); + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_endElement(IVBSAXContentHandler *iface, BSTR *uri, BSTR *localName, + BSTR * strQName) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_characters(IVBSAXContentHandler *iface, BSTR * chars) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_ignorableWhitespace(IVBSAXContentHandler *iface, BSTR * chars) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_processingInstruction(IVBSAXContentHandler *iface, BSTR * target, BSTR * data) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_skippedEntity(IVBSAXContentHandler *iface, BSTR * name) +{ + return S_OK; +} + +static const IVBSAXContentHandlerVtbl vbcontenthandlervtbl = +{ + vb_content_handler_QueryInterface, + vb_content_handler_AddRef, + vb_content_handler_Release, + vb_content_handler_GetTypeInfoCount, + vb_content_handler_GetTypeInfo, + vb_content_handler_GetIDsOfNames, + vb_content_handler_Invoke, + vb_content_handler_putref_documentLocator, + vb_content_handler_startDocument, + vb_content_handler_endDocument, + vb_content_handler_startPrefixMapping, + vb_content_handler_endPrefixMapping, + vb_content_handler_startElement, + vb_content_handler_endElement, + vb_content_handler_characters, + vb_content_handler_ignorableWhitespace, + vb_content_handler_processingInstruction, + vb_content_handler_skippedEntity, +}; + +static struct sink *create_test_sink(void) +{ + struct sink *sink = calloc(1, sizeof(*sink)); + + sink->IVBSAXContentHandler_iface.lpVtbl = &vbcontenthandlervtbl; + sink->refcount = 1; + + return sink; +} + #define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__) static void _expect_ref(IUnknown* obj, ULONG ref, int line) { @@ -5812,6 +5977,74 @@ static void test_mxwriter_indent(void) free_bstrs(); } +static void test_saxreader_vb_content_handler(void) +{ + IVBSAXXMLReader *reader; + struct sink *sink; + VARIANT var; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER, &IID_IVBSAXXMLReader, (void **)&reader); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + sink = create_test_sink(); + + hr = IVBSAXXMLReader_putref_contentHandler(reader, &sink->IVBSAXContentHandler_iface); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = _bstr_("<a>text</a>"); + hr = IVBSAXXMLReader_parse(reader, var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + IVBSAXContentHandler_Release(&sink->IVBSAXContentHandler_iface); + IVBSAXXMLReader_Release(reader); + + free_bstrs(); +} + +static void test_mxwriter_from_reader(void) +{ + IVBSAXContentHandler *content_handler; + IVBSAXXMLReader *reader; + IMXWriter *writer; + VARIANT var; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER, &IID_IVBSAXXMLReader, (void **)&reader); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IMXWriter, (void **)&writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMXWriter_QueryInterface(writer, &IID_IVBSAXContentHandler, (void **)&content_handler); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMXWriter_put_omitXMLDeclaration(writer, VARIANT_TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IVBSAXXMLReader_putref_contentHandler(reader, content_handler); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = _bstr_("<a>text</a>"); + hr = IVBSAXXMLReader_parse(reader, var); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + VariantClear(&var); + + V_VT(&var) = VT_EMPTY; + hr = IMXWriter_get_output(writer, &var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&var) == VT_BSTR, "Unexpected output type %d.\n", V_VT(&var)); + todo_wine + ok(!lstrcmpW(L"<a>text</a>", V_BSTR(&var)), "Unexpected content %s.\n", wine_dbgstr_w(V_BSTR(&var))); + VariantClear(&var); + + IMXWriter_Release(writer); + IVBSAXXMLReader_Release(reader); + IVBSAXContentHandler_Release(content_handler); +} + START_TEST(saxreader) { ISAXXMLReader *reader; @@ -5840,6 +6073,7 @@ START_TEST(saxreader) test_saxreader_features(); test_saxreader_encoding(); test_saxreader_dispex(); + test_saxreader_vb_content_handler(); /* MXXMLWriter tests */ get_class_support_data(mxwriter_support_data, &IID_IMXWriter); @@ -5860,6 +6094,7 @@ START_TEST(saxreader) test_mxwriter_encoding(); test_mxwriter_dispex(); test_mxwriter_indent(); + test_mxwriter_from_reader(); } else win_skip("MXXMLWriter not supported\n"); diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index cdd2be6fe82..996ffee6396 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -34,6 +34,171 @@ #include "wine/test.h" +struct sink +{ + IVBSAXContentHandler IVBSAXContentHandler_iface; + LONG refcount; +}; + +static struct sink *impl_from_IVBSAXContentHandler(IVBSAXContentHandler *iface) +{ + return CONTAINING_RECORD(iface, struct sink, IVBSAXContentHandler_iface); +} + +static HRESULT WINAPI vb_content_handler_QueryInterface(IVBSAXContentHandler *iface, + REFIID riid, void **obj) +{ + if (IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_IDispatch) + || IsEqualGUID(riid, &IID_IVBSAXContentHandler)) + { + *obj = iface; + IVBSAXContentHandler_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI vb_content_handler_AddRef(IVBSAXContentHandler *iface) +{ + struct sink *sink = impl_from_IVBSAXContentHandler(iface); + return InterlockedIncrement(&sink->refcount); +} + +static ULONG WINAPI vb_content_handler_Release(IVBSAXContentHandler *iface) +{ + struct sink *sink = impl_from_IVBSAXContentHandler(iface); + LONG refcount = InterlockedDecrement(&sink->refcount); + + if (!refcount) + free(sink); + + return refcount; +} + +static HRESULT WINAPI vb_content_handler_GetTypeInfoCount(IVBSAXContentHandler *iface, UINT *count) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_GetTypeInfo(IVBSAXContentHandler *iface, UINT index, + LCID lcid, ITypeInfo **ti) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_GetIDsOfNames(IVBSAXContentHandler *iface, REFIID riid, + LPOLESTR *names, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_Invoke(IVBSAXContentHandler *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, + UINT *puArgErr) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI vb_content_handler_putref_documentLocator(IVBSAXContentHandler *iface, IVBSAXLocator *locator) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_startDocument(IVBSAXContentHandler *iface) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_endDocument(IVBSAXContentHandler *iface) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_startPrefixMapping(IVBSAXContentHandler *iface, BSTR *prefix, BSTR *uri) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_endPrefixMapping(IVBSAXContentHandler *iface, BSTR *prefix) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_startElement(IVBSAXContentHandler *iface, BSTR *uri, BSTR *localName, + BSTR *qname, IVBSAXAttributes * oAttributes) +{ + todo_wine + ok(uri != NULL && *uri != NULL, "Unexpected pointer.\n"); + ok(localName != NULL && *localName != NULL, "Unexpected pointer.\n"); + ok(qname != NULL && *qname != NULL, "Unexpected pointer.\n"); + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_endElement(IVBSAXContentHandler *iface, BSTR *uri, BSTR *localName, + BSTR * strQName) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_characters(IVBSAXContentHandler *iface, BSTR * chars) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_ignorableWhitespace(IVBSAXContentHandler *iface, BSTR * chars) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_processingInstruction(IVBSAXContentHandler *iface, BSTR * target, BSTR * data) +{ + return S_OK; +} + +static HRESULT WINAPI vb_content_handler_skippedEntity(IVBSAXContentHandler *iface, BSTR * name) +{ + return S_OK; +} + +static const IVBSAXContentHandlerVtbl vbcontenthandlervtbl = +{ + vb_content_handler_QueryInterface, + vb_content_handler_AddRef, + vb_content_handler_Release, + vb_content_handler_GetTypeInfoCount, + vb_content_handler_GetTypeInfo, + vb_content_handler_GetIDsOfNames, + vb_content_handler_Invoke, + vb_content_handler_putref_documentLocator, + vb_content_handler_startDocument, + vb_content_handler_endDocument, + vb_content_handler_startPrefixMapping, + vb_content_handler_endPrefixMapping, + vb_content_handler_startElement, + vb_content_handler_endElement, + vb_content_handler_characters, + vb_content_handler_ignorableWhitespace, + vb_content_handler_processingInstruction, + vb_content_handler_skippedEntity, +}; + +static struct sink *create_test_sink(void) +{ + struct sink *sink = calloc(1, sizeof(*sink)); + + sink->IVBSAXContentHandler_iface.lpVtbl = &vbcontenthandlervtbl; + sink->refcount = 1; + + return sink; +} + typedef enum _CH { CH_ENDTEST, @@ -4812,6 +4977,32 @@ static void test_saxreader_properties(void) free_bstrs(); } +static void test_saxreader_vb_content_handler(void) +{ + IVBSAXXMLReader *reader; + struct sink *sink; + VARIANT var; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_SAXXMLReader60, NULL, CLSCTX_INPROC_SERVER, &IID_IVBSAXXMLReader, (void **)&reader); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + sink = create_test_sink(); + + hr = IVBSAXXMLReader_putref_contentHandler(reader, &sink->IVBSAXContentHandler_iface); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = _bstr_("<a>text</a>"); + hr = IVBSAXXMLReader_parse(reader, var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + IVBSAXContentHandler_Release(&sink->IVBSAXContentHandler_iface); + IVBSAXXMLReader_Release(reader); + + free_bstrs(); +} + START_TEST(saxreader) { HRESULT hr; @@ -4830,6 +5021,7 @@ START_TEST(saxreader) test_saxreader_features(); test_saxreader_encoding(); test_saxreader_dispex(); + test_saxreader_vb_content_handler(); } if (is_class_supported(&CLSID_MXXMLWriter60)) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10031
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/saxreader.c | 13 +++++++++++++ dlls/msxml3/tests/saxreader.c | 3 --- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 801106e3a07..75e44ca68a2 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -194,6 +194,7 @@ typedef struct struct bstrpool pool; saxreader_feature features; BSTR xmldecl_version; + BSTR empty_bstr; MSXML_VERSION version; } saxreader; @@ -1573,14 +1574,19 @@ static void libxmlStartElementNS( uri = local = NULL; if (This->vbInterface) + { + if (!uri) uri = This->saxreader->empty_bstr; hr = IVBSAXContentHandler_startElement(handler->vbhandler, &uri, &local, &element->qname, &This->IVBSAXAttributes_iface); + } else + { hr = ISAXContentHandler_startElement(handler->handler, uri ? uri : &empty_str, SysStringLen(uri), local ? local : &empty_str, SysStringLen(local), element->qname, SysStringLen(element->qname), &This->ISAXAttributes_iface); + } if (sax_callback_failed(This, hr)) format_error_message_from_id(This, hr); @@ -1645,15 +1651,20 @@ static void libxmlEndElementNS( uri = local = NULL; if (This->vbInterface) + { + if (!uri) uri = This->saxreader->empty_bstr; hr = IVBSAXContentHandler_endElement( handler->vbhandler, &uri, &local, &element->qname); + } else + { hr = ISAXContentHandler_endElement( handler->handler, uri ? uri : &empty_str, SysStringLen(uri), local ? local : &empty_str, SysStringLen(local), element->qname, SysStringLen(element->qname)); + } free_attribute_values(This); This->attr_count = 0; @@ -2922,6 +2933,7 @@ static ULONG WINAPI saxxmlreader_Release( } SysFreeString(reader->xmldecl_version); + SysFreeString(reader->empty_bstr); free_bstr_pool(&reader->pool); free(reader); @@ -3439,6 +3451,7 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, LPVOID *ppObj) reader->pool.len = 0; reader->features = Namespaces | NamespacePrefixes; reader->version = version; + reader->empty_bstr = SysAllocString(L""); init_dispex(&reader->dispex, (IUnknown*)&reader->IVBSAXXMLReader_iface, &saxreader_dispex); diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index f7a81e70244..327b823621d 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -135,7 +135,6 @@ static HRESULT WINAPI vb_content_handler_endPrefixMapping(IVBSAXContentHandler * static HRESULT WINAPI vb_content_handler_startElement(IVBSAXContentHandler *iface, BSTR *uri, BSTR *localName, BSTR *qname, IVBSAXAttributes * oAttributes) { - todo_wine ok(uri != NULL && *uri != NULL, "Unexpected pointer.\n"); ok(localName != NULL && *localName != NULL, "Unexpected pointer.\n"); ok(qname != NULL && *qname != NULL, "Unexpected pointer.\n"); @@ -6028,7 +6027,6 @@ static void test_mxwriter_from_reader(void) V_VT(&var) = VT_BSTR; V_BSTR(&var) = _bstr_("<a>text</a>"); hr = IVBSAXXMLReader_parse(reader, var); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); VariantClear(&var); @@ -6036,7 +6034,6 @@ static void test_mxwriter_from_reader(void) hr = IMXWriter_get_output(writer, &var); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&var) == VT_BSTR, "Unexpected output type %d.\n", V_VT(&var)); - todo_wine ok(!lstrcmpW(L"<a>text</a>", V_BSTR(&var)), "Unexpected content %s.\n", wine_dbgstr_w(V_BSTR(&var))); VariantClear(&var); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10031
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)