Nikolay Sivov : xmllite: Fail to set input for external IXmlReaderInput.

Alexandre Julliard julliard at winehq.org
Mon Jan 28 13:43:19 CST 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Jan 27 11:54:58 2013 +0400

xmllite: Fail to set input for external IXmlReaderInput.

---

 dlls/xmllite/reader.c |   31 ++++++++++++++++++++++++-------
 1 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 785d9bf..b3f7194 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -114,6 +114,8 @@ typedef struct
     unsigned int pending : 1;
 } xmlreaderinput;
 
+static const struct IUnknownVtbl xmlreaderinputvtbl;
+
 typedef struct
 {
     WCHAR *str;
@@ -1764,7 +1766,7 @@ static HRESULT WINAPI xmlreader_QueryInterface(IXmlReader *iface, REFIID riid, v
 {
     xmlreader *This = impl_from_IXmlReader(iface);
 
-    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
 
     if (IsEqualGUID(riid, &IID_IUnknown) ||
         IsEqualGUID(riid, &IID_IXmlReader))
@@ -1774,6 +1776,7 @@ static HRESULT WINAPI xmlreader_QueryInterface(IXmlReader *iface, REFIID riid, v
     else
     {
         FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        *ppvObject = NULL;
         return E_NOINTERFACE;
     }
 
@@ -1814,6 +1817,7 @@ static ULONG WINAPI xmlreader_Release(IXmlReader *iface)
 static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
 {
     xmlreader *This = impl_from_IXmlReader(iface);
+    IXmlReaderInput *readerinput;
     HRESULT hr;
 
     TRACE("(%p)->(%p)\n", This, input);
@@ -1838,11 +1842,23 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
     }
 
     /* now try IXmlReaderInput, ISequentialStream, IStream */
-    hr = IUnknown_QueryInterface(input, &IID_IXmlReaderInput, (void**)&This->input);
-    if (hr != S_OK)
+    hr = IUnknown_QueryInterface(input, &IID_IXmlReaderInput, (void**)&readerinput);
+    if (hr == S_OK)
     {
-        IXmlReaderInput *readerinput;
+        if (readerinput->lpVtbl == &xmlreaderinputvtbl)
+            This->input = impl_from_IXmlReaderInput(readerinput);
+        else
+        {
+            ERR("got external IXmlReaderInput implementation: %p, vtbl=%p\n",
+                readerinput, readerinput->lpVtbl);
+            IUnknown_Release(readerinput);
+            return E_FAIL;
 
+        }
+    }
+
+    if (hr != S_OK || !readerinput)
+    {
         /* create IXmlReaderInput basing on supplied interface */
         hr = CreateXmlReaderInputWithEncodingName(input,
                                          NULL, NULL, FALSE, NULL, &readerinput);
@@ -2160,7 +2176,7 @@ static HRESULT WINAPI xmlreaderinput_QueryInterface(IXmlReaderInput *iface, REFI
 {
     xmlreaderinput *This = impl_from_IXmlReaderInput(iface);
 
-    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
 
     if (IsEqualGUID(riid, &IID_IXmlReaderInput) ||
         IsEqualGUID(riid, &IID_IUnknown))
@@ -2170,6 +2186,7 @@ static HRESULT WINAPI xmlreaderinput_QueryInterface(IXmlReaderInput *iface, REFI
     else
     {
         WARN("interface %s not implemented\n", debugstr_guid(riid));
+        *ppvObject = NULL;
         return E_NOINTERFACE;
     }
 
@@ -2207,7 +2224,7 @@ static ULONG WINAPI xmlreaderinput_Release(IXmlReaderInput *iface)
     return ref;
 }
 
-static const struct IUnknownVtbl xmlreaderinput_vtbl =
+static const struct IUnknownVtbl xmlreaderinputvtbl =
 {
     xmlreaderinput_QueryInterface,
     xmlreaderinput_AddRef,
@@ -2281,7 +2298,7 @@ HRESULT WINAPI CreateXmlReaderInputWithEncodingName(IUnknown *stream,
         readerinput = heap_alloc(sizeof(*readerinput));
     if(!readerinput) return E_OUTOFMEMORY;
 
-    readerinput->IXmlReaderInput_iface.lpVtbl = &xmlreaderinput_vtbl;
+    readerinput->IXmlReaderInput_iface.lpVtbl = &xmlreaderinputvtbl;
     readerinput->ref = 1;
     readerinput->imalloc = imalloc;
     readerinput->stream = NULL;




More information about the wine-cvs mailing list