Nikolay Sivov : xmllite: Add IXmlReaderInput stub implementation.

Alexandre Julliard julliard at winehq.org
Fri Jan 22 08:26:53 CST 2010


Module: wine
Branch: master
Commit: 4e3283fdd25d019e78da89590ad19854bdf43d4f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4e3283fdd25d019e78da89590ad19854bdf43d4f

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Thu Jan 21 18:19:20 2010 +0300

xmllite: Add IXmlReaderInput stub implementation.

---

 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 5877474..2c7d3f1 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,7 +372,22 @@ 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);




More information about the wine-cvs mailing list