Nikolay Sivov : wiaservc: Added a stub for IEnumWIA_DEV_INFO.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Oct 9 09:55:20 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Oct  8 21:09:11 2015 +0300

wiaservc: Added a stub for IEnumWIA_DEV_INFO.

Based on original patch by Mikael Ståldal <mikael at staldal.nu>.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wiaservc/tests/wia.c |   4 +-
 dlls/wiaservc/wiadevmgr.c | 127 ++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 125 insertions(+), 6 deletions(-)

diff --git a/dlls/wiaservc/tests/wia.c b/dlls/wiaservc/tests/wia.c
index e3f4edb..c7c2fd9 100644
--- a/dlls/wiaservc/tests/wia.c
+++ b/dlls/wiaservc/tests/wia.c
@@ -40,21 +40,19 @@ static void test_EnumDeviceInfo(void)
     ok(FAILED(hr), "got 0x%08x\n", hr);
 
     hr = IWiaDevMgr_EnumDeviceInfo(devmanager, WIA_DEVINFO_ENUM_LOCAL, &devenum);
-todo_wine
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
-if (hr == S_OK) {
     hr = IEnumWIA_DEV_INFO_GetCount(devenum, NULL);
     ok(FAILED(hr), "got 0x%08x\n", hr);
 
     count = 1000;
     hr = IEnumWIA_DEV_INFO_GetCount(devenum, &count);
+todo_wine
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(count != 1000, "got %u\n", count);
 
     IEnumWIA_DEV_INFO_Release(devenum);
 }
-}
 
 START_TEST(wia)
 {
diff --git a/dlls/wiaservc/wiadevmgr.c b/dlls/wiaservc/wiadevmgr.c
index 6eb82aa..58720ef 100644
--- a/dlls/wiaservc/wiadevmgr.c
+++ b/dlls/wiaservc/wiadevmgr.c
@@ -29,11 +29,119 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(wia);
 
+typedef struct
+{
+    IEnumWIA_DEV_INFO IEnumWIA_DEV_INFO_iface;
+    LONG ref;
+} enumwiadevinfo;
+
 static inline wiadevmgr *impl_from_IWiaDevMgr(IWiaDevMgr *iface)
 {
     return CONTAINING_RECORD(iface, wiadevmgr, IWiaDevMgr_iface);
 }
 
+static inline enumwiadevinfo *impl_from_IEnumWIA_DEV_INFO(IEnumWIA_DEV_INFO *iface)
+{
+    return CONTAINING_RECORD(iface, enumwiadevinfo, IEnumWIA_DEV_INFO_iface);
+}
+
+static HRESULT WINAPI enumwiadevinfo_QueryInterface(IEnumWIA_DEV_INFO *iface, REFIID riid, void **obj)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+
+    TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), obj);
+
+    if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumWIA_DEV_INFO))
+        *obj = iface;
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        *obj = NULL;
+        return E_NOINTERFACE;
+    }
+    IUnknown_AddRef((IUnknown*)*obj);
+    return S_OK;
+}
+
+static ULONG WINAPI enumwiadevinfo_AddRef(IEnumWIA_DEV_INFO *iface)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+    TRACE("(%p)->(%u)\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI enumwiadevinfo_Release(IEnumWIA_DEV_INFO *iface)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p)->(%u)\n", This, ref);
+
+    if (ref == 0)
+        HeapFree(GetProcessHeap(), 0, This);
+    return ref;
+}
+
+static HRESULT WINAPI enumwiadevinfo_Next(IEnumWIA_DEV_INFO *iface, ULONG count, IWiaPropertyStorage **elem, ULONG *fetched)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+
+    FIXME("(%p, %d, %p, %p): stub\n", This, count, elem, fetched);
+
+    *fetched = 0;
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI enumwiadevinfo_Skip(IEnumWIA_DEV_INFO *iface, ULONG count)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+
+    FIXME("(%p, %u): stub\n", This, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI enumwiadevinfo_Reset(IEnumWIA_DEV_INFO *iface)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+
+    FIXME("(%p): stub\n", This);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI enumwiadevinfo_Clone(IEnumWIA_DEV_INFO *iface, IEnumWIA_DEV_INFO **ret)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+
+    FIXME("(%p, %p): stub\n", This, ret);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI enumwiadevinfo_GetCount(IEnumWIA_DEV_INFO *iface, ULONG *count)
+{
+    enumwiadevinfo *This = impl_from_IEnumWIA_DEV_INFO(iface);
+
+    FIXME("(%p, %p): stub\n", This, count);
+
+    *count = 0;
+    return E_NOTIMPL;
+}
+
+static const IEnumWIA_DEV_INFOVtbl EnumWIA_DEV_INFOVtbl =
+{
+    enumwiadevinfo_QueryInterface,
+    enumwiadevinfo_AddRef,
+    enumwiadevinfo_Release,
+    enumwiadevinfo_Next,
+    enumwiadevinfo_Skip,
+    enumwiadevinfo_Reset,
+    enumwiadevinfo_Clone,
+    enumwiadevinfo_GetCount
+};
+
 static HRESULT WINAPI wiadevmgr_QueryInterface(IWiaDevMgr *iface, REFIID riid, void **ppvObject)
 {
     wiadevmgr *This = impl_from_IWiaDevMgr(iface);
@@ -69,11 +177,24 @@ static ULONG WINAPI wiadevmgr_Release(IWiaDevMgr *iface)
     return ref;
 }
 
-static HRESULT WINAPI wiadevmgr_EnumDeviceInfo(IWiaDevMgr *iface, LONG lFlag, IEnumWIA_DEV_INFO **ppIEnum)
+static HRESULT WINAPI wiadevmgr_EnumDeviceInfo(IWiaDevMgr *iface, LONG flag, IEnumWIA_DEV_INFO **ret)
 {
     wiadevmgr *This = impl_from_IWiaDevMgr(iface);
-    FIXME("(%p, %d, %p): stub\n", This, lFlag, ppIEnum);
-    return E_NOTIMPL;
+    enumwiadevinfo *enuminfo;
+
+    TRACE("(%p)->(%x, %p)\n", This, flag, ret);
+
+    *ret = NULL;
+
+    enuminfo = HeapAlloc(GetProcessHeap(), 0, sizeof(*enuminfo));
+    if (!enuminfo)
+        return E_OUTOFMEMORY;
+
+    enuminfo->IEnumWIA_DEV_INFO_iface.lpVtbl = &EnumWIA_DEV_INFOVtbl;
+    enuminfo->ref = 1;
+
+    *ret = &enuminfo->IEnumWIA_DEV_INFO_iface;
+    return S_OK;
 }
 
 static HRESULT WINAPI wiadevmgr_CreateDevice(IWiaDevMgr *iface, BSTR bstrDeviceID, IWiaItem **ppWiaItemRoot)




More information about the wine-cvs mailing list