| /* |
| * WiaDevMgr functions |
| * |
| * Copyright 2009 Damjan Jovanovic |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #define COBJMACROS |
| |
| #include "objbase.h" |
| #include "wia_lh.h" |
| |
| #include "wiaservc_private.h" |
| |
| #include "wine/debug.h" |
| |
| 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); |
| |
| TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppvObject); |
| |
| if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IWiaDevMgr)) |
| *ppvObject = iface; |
| else |
| { |
| FIXME("interface %s not implemented\n", debugstr_guid(riid)); |
| *ppvObject = NULL; |
| return E_NOINTERFACE; |
| } |
| IUnknown_AddRef((IUnknown*) *ppvObject); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI wiadevmgr_AddRef(IWiaDevMgr *iface) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| return InterlockedIncrement(&This->ref); |
| } |
| |
| static ULONG WINAPI wiadevmgr_Release(IWiaDevMgr *iface) |
| { |
| ULONG ref; |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| |
| ref = InterlockedDecrement(&This->ref); |
| if (ref == 0) |
| HeapFree(GetProcessHeap(), 0, This); |
| return ref; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_EnumDeviceInfo(IWiaDevMgr *iface, LONG flag, IEnumWIA_DEV_INFO **ret) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| 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) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, %s, %p): stub\n", This, debugstr_w(bstrDeviceID), ppWiaItemRoot); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_SelectDeviceDlg(IWiaDevMgr *iface, HWND hwndParent, LONG lDeviceType, |
| LONG lFlags, BSTR *pbstrDeviceID, IWiaItem **ppItemRoot) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, %p, %d, 0x%x, %p, %p): stub\n", This, hwndParent, lDeviceType, lFlags, pbstrDeviceID, ppItemRoot); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_SelectDeviceDlgID(IWiaDevMgr *iface, HWND hwndParent, LONG lDeviceType, |
| LONG lFlags, BSTR *pbstrDeviceID) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, %p, %d, 0x%x, %p): stub\n", This, hwndParent, lDeviceType, lFlags, pbstrDeviceID); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_GetImageDlg(IWiaDevMgr *iface, HWND hwndParent, LONG lDeviceType, |
| LONG lFlags, LONG lIntent, IWiaItem *pItemRoot, |
| BSTR bstrFilename, GUID *pguidFormat) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, %p, %d, 0x%x, %d, %p, %s, %s): stub\n", This, hwndParent, lDeviceType, lFlags, |
| lIntent, pItemRoot, debugstr_w(bstrFilename), debugstr_guid(pguidFormat)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_RegisterEventCallbackProgram(IWiaDevMgr *iface, LONG lFlags, BSTR bstrDeviceID, |
| const GUID *pEventGUID, BSTR bstrCommandline, |
| BSTR bstrName, BSTR bstrDescription, BSTR bstrIcon) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, 0x%x, %s, %s, %s, %s, %s, %s): stub\n", This, lFlags, debugstr_w(bstrDeviceID), |
| debugstr_guid(pEventGUID), debugstr_w(bstrCommandline), debugstr_w(bstrName), |
| debugstr_w(bstrDescription), debugstr_w(bstrIcon)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_RegisterEventCallbackInterface(IWiaDevMgr *iface, LONG lFlags, BSTR bstrDeviceID, |
| const GUID *pEventGUID, IWiaEventCallback *pIWiaEventCallback, |
| IUnknown **pEventObject) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, 0x%x, %s, %s, %p, %p): stub\n", This, lFlags, debugstr_w(bstrDeviceID), |
| debugstr_guid(pEventGUID), pIWiaEventCallback, pEventObject); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_RegisterEventCallbackCLSID(IWiaDevMgr *iface, LONG lFlags, BSTR bstrDeviceID, |
| const GUID *pEventGUID, const GUID *pClsID, BSTR bstrName, |
| BSTR bstrDescription, BSTR bstrIcon) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, 0x%x, %s, %s, %s, %s, %s, %s): stub\n", This, lFlags, debugstr_w(bstrDeviceID), |
| debugstr_guid(pEventGUID), debugstr_guid(pClsID), debugstr_w(bstrName), |
| debugstr_w(bstrDescription), debugstr_w(bstrIcon)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI wiadevmgr_AddDeviceDlg(IWiaDevMgr *iface, HWND hwndParent, LONG lFlags) |
| { |
| wiadevmgr *This = impl_from_IWiaDevMgr(iface); |
| FIXME("(%p, %p, 0x%x): stub\n", This, hwndParent, lFlags); |
| return E_NOTIMPL; |
| } |
| |
| static const IWiaDevMgrVtbl WIASERVC_IWiaDevMgr_Vtbl = |
| { |
| wiadevmgr_QueryInterface, |
| wiadevmgr_AddRef, |
| wiadevmgr_Release, |
| wiadevmgr_EnumDeviceInfo, |
| wiadevmgr_CreateDevice, |
| wiadevmgr_SelectDeviceDlg, |
| wiadevmgr_SelectDeviceDlgID, |
| wiadevmgr_GetImageDlg, |
| wiadevmgr_RegisterEventCallbackProgram, |
| wiadevmgr_RegisterEventCallbackInterface, |
| wiadevmgr_RegisterEventCallbackCLSID, |
| wiadevmgr_AddDeviceDlg |
| }; |
| |
| HRESULT wiadevmgr_Constructor(IWiaDevMgr **ppObj) |
| { |
| wiadevmgr *This; |
| TRACE("(%p)\n", ppObj); |
| This = HeapAlloc(GetProcessHeap(), 0, sizeof(wiadevmgr)); |
| if (This) |
| { |
| This->IWiaDevMgr_iface.lpVtbl = &WIASERVC_IWiaDevMgr_Vtbl; |
| This->ref = 1; |
| *ppObj = &This->IWiaDevMgr_iface; |
| return S_OK; |
| } |
| *ppObj = NULL; |
| return E_OUTOFMEMORY; |
| } |