From 8f09d3470a6ff38b53499bff5764a278270db815 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Thu, 1 Aug 2013 12:28:36 +1000 Subject: [PATCH] oledb32: Add IDataSourceLocator support. --- dlls/oledb32/Makefile.in | 1 + dlls/oledb32/dslocator.c | 208 +++++++++++++++++++++++++++++++++++ dlls/oledb32/main.c | 6 + dlls/oledb32/oledb_private.h | 1 + 4 files changed, 216 insertions(+) create mode 100644 dlls/oledb32/dslocator.c diff --git a/dlls/oledb32/Makefile.in b/dlls/oledb32/Makefile.in index b019bdb9376..0f4f36a9d0d 100644 --- a/dlls/oledb32/Makefile.in +++ b/dlls/oledb32/Makefile.in @@ -5,6 +5,7 @@ IMPORTS = uuid oleaut32 ole32 user32 advapi32 C_SRCS = \ convert.c \ datainit.c \ + dslocator.c \ errorinfo.c \ main.c \ rowpos.c diff --git a/dlls/oledb32/dslocator.c b/dlls/oledb32/dslocator.c new file mode 100644 index 00000000000..dcc2fe3c390 --- /dev/null +++ b/dlls/oledb32/dslocator.c @@ -0,0 +1,208 @@ +/* Data Links + * + * Copyright 2013 Alistair Leslie-Hughes + * + * 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 + */ +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "oleauto.h" +#include "winerror.h" +#include "oledb.h" +#include "oledberr.h" +#include "msdasc.h" + +#include "oledb_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(oledb); + + +typedef struct DSLocatorImpl +{ + IDataSourceLocator IDataSourceLocator_iface; + LONG ref; + +} DSLocatorImpl; + +static inline DSLocatorImpl *impl_from_IDataSourceLocator( IDataSourceLocator *iface ) +{ + return CONTAINING_RECORD(iface, DSLocatorImpl, IDataSourceLocator_iface); +} + + +static HRESULT WINAPI dslocator_QueryInterface(IDataSourceLocator *iface, REFIID riid, void **ppvoid) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid),ppvoid); + + *ppvoid = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDispatch) || + IsEqualIID(riid, &IID_IDataSourceLocator)) + { + *ppvoid = &This->IDataSourceLocator_iface; + } + + if(*ppvoid) + { + IUnknown_AddRef( (IUnknown*)*ppvoid ); + return S_OK; + } + + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI dslocator_AddRef(IDataSourceLocator *iface) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + TRACE("(%p)->%u\n",This,This->ref); + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI dslocator_Release(IDataSourceLocator *iface) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->%u\n",This,ref+1); + + if (!ref) + { + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI dslocator_GetTypeInfoCount(IDataSourceLocator *iface, UINT *pctinfo) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->()\n", This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dslocator_GetTypeInfo(IDataSourceLocator *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dslocator_GetIDsOfNames(IDataSourceLocator *iface, REFIID riid, LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dslocator_Invoke(IDataSourceLocator *iface, DISPID dispIdMember, REFIID riid, + LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dslocator_get_hWnd(IDataSourceLocator *iface, LONG *phwndParent) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->(%p)\n",This, phwndParent); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dslocator_put_hWnd(IDataSourceLocator *iface, LONG phwndParent) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->(%d)\n",This, phwndParent); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dslocator_PromptNew(IDataSourceLocator *iface, IDispatch **ppADOConnection) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->(%p)\n",This, ppADOConnection); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dslocator_PromptEdit(IDataSourceLocator *iface, IDispatch **ppADOConnection, VARIANT_BOOL *success) +{ + DSLocatorImpl *This = impl_from_IDataSourceLocator(iface); + + FIXME("(%p)->(%p %p)\n",This, ppADOConnection, success); + + return E_NOTIMPL; +} + +static const IDataSourceLocatorVtbl DSLocatorVtbl = +{ + dslocator_QueryInterface, + dslocator_AddRef, + dslocator_Release, + dslocator_GetTypeInfoCount, + dslocator_GetTypeInfo, + dslocator_GetIDsOfNames, + dslocator_Invoke, + dslocator_get_hWnd, + dslocator_put_hWnd, + dslocator_PromptNew, + dslocator_PromptEdit +}; + +HRESULT create_dslocator(IUnknown *outer, void **obj) +{ + DSLocatorImpl *This; + + TRACE("(%p, %p)\n", outer, obj); + + *obj = NULL; + + if(outer) return CLASS_E_NOAGGREGATION; + + This = heap_alloc(sizeof(*This)); + if(!This) return E_OUTOFMEMORY; + + This->IDataSourceLocator_iface.lpVtbl = &DSLocatorVtbl; + This->ref = 1; + + *obj = &This->IDataSourceLocator_iface; + + return S_OK; +} diff --git a/dlls/oledb32/main.c b/dlls/oledb32/main.c index d101316b79e..48aa5a3311b 100644 --- a/dlls/oledb32/main.c +++ b/dlls/oledb32/main.c @@ -130,6 +130,7 @@ static cf oledb_convert_cf = { { &CF_Vtbl }, create_oledb_convert }; static cf oledb_datainit_cf = { { &CF_Vtbl }, create_data_init }; static cf oledb_errorinfo_cf = { { &CF_Vtbl }, create_error_info }; static cf oledb_rowpos_cf = { { &CF_Vtbl }, create_oledb_rowpos }; +static cf oledb_dslocator_cf = { { &CF_Vtbl }, create_dslocator }; /****************************************************************** * DllGetClassObject @@ -158,6 +159,11 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **obj) *obj = &oledb_rowpos_cf; return S_OK; } + else if ( IsEqualCLSID (rclsid, &CLSID_DataLinks) ) + { + *obj = &oledb_dslocator_cf; + return S_OK; + } return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/dlls/oledb32/oledb_private.h b/dlls/oledb32/oledb_private.h index c23246463ae..1422b0b58cb 100644 --- a/dlls/oledb32/oledb_private.h +++ b/dlls/oledb32/oledb_private.h @@ -21,6 +21,7 @@ HRESULT create_oledb_convert(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; HRESULT create_data_init(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; HRESULT create_error_info(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; HRESULT create_oledb_rowpos(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; +HRESULT create_dslocator(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; static inline void *heap_alloc(size_t len) {