msxml3: Implement IXMLParser Get/Set Factory
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Tue Mar 5 23:11:40 CST 2013
Hi,
Changelog:
msxml3: Implement IXMLParser Get/Set Factory
Best Regards
Alistair Leslie-Hughes
-------------- next part --------------
>From 2217b53fa2407f0a0904f33e36406780edca5960 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Wed, 6 Mar 2013 16:01:45 +1100
Subject: [PATCH] Implement IXMLParser Get/Set Factory
To: wine-patches <wine-patches at winehq.org>
---
dlls/msxml3/tests/xmlparser.c | 88 +++++++++++++++++++++++++++++++++++++++++
dlls/msxml3/xmlparser.c | 25 ++++++++++--
2 files changed, 109 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..3509aac 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;
@@ -106,18 +107,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 +431,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;
--
1.7.10.4
More information about the wine-patches
mailing list