Module: wine Branch: master Commit: 850d077a4bf65a3c4f0682589eff2692ba8d2f63 URL: http://source.winehq.org/git/wine.git/?a=commit;h=850d077a4bf65a3c4f0682589e...
Author: Alistair Leslie-Hughes leslie_alistair@hotmail.com Date: Wed Mar 6 16:01:45 2013 +1100
msxml3: Implement IXMLParser Get/Set Factory.
---
dlls/msxml3/tests/xmlparser.c | 88 +++++++++++++++++++++++++++++++++++++++++ dlls/msxml3/xmlparser.c | 28 +++++++++++-- 2 files changed, 112 insertions(+), 4 deletions(-)
diff --git a/dlls/msxml3/tests/xmlparser.c b/dlls/msxml3/tests/xmlparser.c index 4bf80bb..46812c8 100644 --- a/dlls/msxml3/tests/xmlparser.c +++ b/dlls/msxml3/tests/xmlparser.c @@ -28,10 +28,81 @@ #include "xmlparser.h" #include "wine/test.h"
+ +static HRESULT WINAPI nodefact_QueryInterface(IXMLNodeFactory *iface, + REFIID riid, void **ppvObject) +{ + *ppvObject = NULL; + + if (IsEqualGUID(riid, &IID_IXMLNodeFactory) || + IsEqualGUID(riid, &IID_IUnknown)) + *ppvObject = iface; + else + return E_NOINTERFACE; + + return S_OK; +} + +static ULONG WINAPI nodefact_AddRef(IXMLNodeFactory *iface) +{ + return 2; +} + +static ULONG WINAPI nodefact_Release(IXMLNodeFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI nodefact_NotifyEvent(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, XML_NODEFACTORY_EVENT iEvt) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_BeginChildren(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, XML_NODE_INFO *pNodeInfo) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_EndChildren(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, BOOL fEmpty, XML_NODE_INFO *pNodeInfo) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_Error(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, HRESULT hrErrorCode, USHORT cNumRecs, + XML_NODE_INFO **ppNodeInfo) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_CreateNode(IXMLNodeFactory *iface, IXMLNodeSource *pSource, + PVOID pNodeParent, USHORT cNumRecs, XML_NODE_INFO **ppNodeInfo) +{ + return E_NOTIMPL; +} + +static const IXMLNodeFactoryVtbl nodefactoryVtbl = +{ + nodefact_QueryInterface, + nodefact_AddRef, + nodefact_Release, + nodefact_NotifyEvent, + nodefact_BeginChildren, + nodefact_EndChildren, + nodefact_Error, + nodefact_CreateNode +}; + +static IXMLNodeFactory thenodefactory = { &nodefactoryVtbl }; + static void create_test(void) { HRESULT hr; IXMLParser *parser; + IXMLNodeFactory *nodefactory; DWORD flags;
hr = CoCreateInstance(&CLSID_XMLParser30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLParser, (void**)&parser); @@ -50,6 +121,23 @@ static void create_test(void) flags = IXMLParser_GetFlags(parser); ok(flags == XMLFLAG_SAX, "Expected 0 got %d\n", flags);
+ hr = IXMLParser_GetFactory(parser, NULL); + ok(hr == E_INVALIDARG, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_GetFactory(parser, &nodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + ok(nodefactory == NULL, "expected NULL\n"); + + hr = IXMLParser_SetFactory(parser, &thenodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_GetFactory(parser, &nodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + ok(nodefactory == &thenodefactory, "expected NULL\n"); + + hr = IXMLParser_SetFactory(parser, NULL); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + hr = IXMLParser_SetFlags(parser, 0); ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr);
diff --git a/dlls/msxml3/xmlparser.c b/dlls/msxml3/xmlparser.c index f18f454..154e439 100644 --- a/dlls/msxml3/xmlparser.c +++ b/dlls/msxml3/xmlparser.c @@ -46,6 +46,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml); typedef struct _xmlparser { IXMLParser IXMLParser_iface; + IXMLNodeFactory *nodefactory; LONG ref;
int flags; @@ -95,6 +96,9 @@ static ULONG WINAPI xmlparser_Release(IXMLParser* iface) TRACE("(%p)->(%d)\n", This, ref); if ( ref == 0 ) { + if(This->nodefactory) + IXMLNodeFactory_Release(This->nodefactory); + heap_free( This ); }
@@ -106,18 +110,33 @@ static HRESULT WINAPI xmlparser_SetFactory(IXMLParser *iface, IXMLNodeFactory *p { xmlparser *This = impl_from_IXMLParser( iface );
- FIXME("(%p %p)\n", This, pNodeFactory); + TRACE("(%p %p)\n", This, pNodeFactory);
- return E_NOTIMPL; + if(This->nodefactory) + IXMLNodeFactory_Release(This->nodefactory); + + This->nodefactory = pNodeFactory; + if(This->nodefactory) + IXMLNodeFactory_AddRef(This->nodefactory); + + return S_OK; }
static HRESULT WINAPI xmlparser_GetFactory(IXMLParser *iface, IXMLNodeFactory **ppNodeFactory) { xmlparser *This = impl_from_IXMLParser( iface );
- FIXME("(%p, %p)\n", This, ppNodeFactory); + TRACE("(%p, %p)\n", This, ppNodeFactory);
- return E_NOTIMPL; + if(!ppNodeFactory) + return E_INVALIDARG; + + *ppNodeFactory = This->nodefactory; + + if(*ppNodeFactory) + IXMLNodeFactory_AddRef(*ppNodeFactory); + + return S_OK; }
static HRESULT WINAPI xmlparser_Abort(IXMLParser *iface, BSTR bstrErrorInfo) @@ -415,6 +434,7 @@ HRESULT XMLParser_create(IUnknown* pUnkOuter, void**ppObj) return E_OUTOFMEMORY;
This->IXMLParser_iface.lpVtbl = &xmlparser_vtbl; + This->nodefactory = NULL; This->flags = 0; This->ref = 1;