[PATCH 3/4] Add IXmlReaderInput stub implementation
Nikolay Sivov
bunglehead at gmail.com
Thu Jan 21 09:19:20 CST 2010
---
dlls/xmllite/reader.c | 88 +++++++++++++++++++++++++++++++++++++++++-
dlls/xmllite/tests/reader.c | 17 +++-----
2 files changed, 92 insertions(+), 13 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 7d51e54..60df234 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -31,17 +31,31 @@
WINE_DEFAULT_DEBUG_CHANNEL(xmllite);
+/* not defined in public headers */
+DEFINE_GUID(IID_IXmlReaderInput, 0x0b3ccc9b, 0x9214, 0x428b, 0xa2, 0xae, 0xef, 0x3a, 0xa8, 0x71, 0xaf, 0xda);
+
typedef struct _xmlreader
{
const IXmlReaderVtbl *lpVtbl;
LONG ref;
} xmlreader;
+typedef struct _xmlreaderinput
+{
+ const IUnknownVtbl *lpVtbl;
+ LONG ref;
+} xmlreaderinput;
+
static inline xmlreader *impl_from_IXmlReader(IXmlReader *iface)
{
return (xmlreader *)((char*)iface - FIELD_OFFSET(xmlreader, lpVtbl));
}
+static inline xmlreaderinput *impl_from_IXmlReaderInput(IXmlReaderInput *iface)
+{
+ return (xmlreaderinput *)((char*)iface - FIELD_OFFSET(xmlreaderinput, lpVtbl));
+}
+
static HRESULT WINAPI xmlreader_QueryInterface(IXmlReader *iface, REFIID riid, void** ppvObject)
{
xmlreader *This = impl_from_IXmlReader(iface);
@@ -271,6 +285,59 @@ static const struct IXmlReaderVtbl xmlreader_vtbl =
xmlreader_IsEOF
};
+/* IXmlReaderInput */
+static HRESULT WINAPI xmlreaderinput_QueryInterface(IXmlReaderInput *iface, REFIID riid, void** ppvObject)
+{
+ xmlreaderinput *This = impl_from_IXmlReaderInput(iface);
+
+ TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+
+ if (IsEqualGUID(riid, &IID_IXmlReaderInput) ||
+ IsEqualGUID(riid, &IID_IUnknown))
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef(iface);
+
+ return S_OK;
+}
+
+static ULONG WINAPI xmlreaderinput_AddRef(IXmlReaderInput *iface)
+{
+ xmlreaderinput *This = impl_from_IXmlReaderInput(iface);
+ TRACE("%p\n", This);
+ return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI xmlreaderinput_Release(IXmlReaderInput *iface)
+{
+ xmlreaderinput *This = impl_from_IXmlReaderInput(iface);
+ LONG ref;
+
+ TRACE("%p\n", This);
+
+ ref = InterlockedDecrement(&This->ref);
+ if (ref == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static const struct IUnknownVtbl xmlreaderinput_vtbl =
+{
+ xmlreaderinput_QueryInterface,
+ xmlreaderinput_AddRef,
+ xmlreaderinput_Release
+};
+
HRESULT WINAPI CreateXmlReader(REFIID riid, void **pObject, IMalloc *pMalloc)
{
xmlreader *reader;
@@ -305,8 +372,23 @@ HRESULT WINAPI CreateXmlReaderInputWithEncodingName(IUnknown *stream,
LPCWSTR base_uri,
IXmlReaderInput **ppInput)
{
- FIXME("%p %p %s %d %s %p\n", stream, pMalloc, wine_dbgstr_w(encoding),
- hint, wine_dbgstr_w(base_uri), ppInput);
- return E_NOTIMPL;
+ xmlreaderinput *readerinput;
+
+ FIXME("%p %p %s %d %s %p: stub\n", stream, pMalloc, wine_dbgstr_w(encoding),
+ hint, wine_dbgstr_w(base_uri), ppInput);
+
+ if (!stream || !ppInput) return E_INVALIDARG;
+
+ readerinput = HeapAlloc(GetProcessHeap(), 0, sizeof (*readerinput));
+ if(!readerinput) return E_OUTOFMEMORY;
+
+ readerinput->lpVtbl = &xmlreaderinput_vtbl;
+ readerinput->ref = 1;
+
+ *ppInput = (IXmlReaderInput*)&readerinput->lpVtbl;
+
+ TRACE("returning iface %p\n", *ppInput);
+
+ return S_OK;
}
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 8faf469..5585853 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -218,9 +218,9 @@ static void test_readerinput(void)
LONG ref;
hr = pCreateXmlReaderInputWithEncodingName(NULL, NULL, NULL, FALSE, NULL, NULL);
- todo_wine ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+ ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
hr = pCreateXmlReaderInputWithEncodingName(NULL, NULL, NULL, FALSE, NULL, &reader_input);
- todo_wine ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+ ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
@@ -229,17 +229,11 @@ static void test_readerinput(void)
ok(ref == 2, "Expected 2, got %d\n", ref);
IStream_Release(stream);
hr = pCreateXmlReaderInputWithEncodingName((IUnknown*)stream, NULL, NULL, FALSE, NULL, &reader_input);
- todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
- if(hr != S_OK)
- {
- skip("CreateXmlReaderInputWithEncodingName not implemented\n");
- IStream_Release(stream);
- return;
- }
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
/* IXmlReader grabs a stream reference */
ref = IStream_AddRef(stream);
- ok(ref == 3, "Expected 3, got %d\n", ref);
+ todo_wine ok(ref == 3, "Expected 3, got %d\n", ref);
IStream_Release(stream);
/* IID_IXmlReaderInput */
@@ -249,6 +243,9 @@ static void test_readerinput(void)
obj = (IUnknown*)0xdeadbeef;
hr = IUnknown_QueryInterface(reader_input, &IID_IXmlReaderInput, (void**)&obj);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ref = IUnknown_AddRef(reader_input);
+ ok(ref == 3, "Expected 3, got %d\n", ref);
+ IUnknown_Release(reader_input);
IUnknown_Release(reader_input);
IStream_Release(stream);
--
1.5.6.5
--=-6bxnN5SkW+8HADvVOfRM--
More information about the wine-patches
mailing list