From 0fd6649988b72837d17de7fe28d10ec967cde801 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Mon, 24 Sep 2012 14:20:13 +1000 Subject: [PATCH] oledb32: Add IDataInitialize interface support. --- dlls/oledb32/Makefile.in | 1 + dlls/oledb32/datainit.c | 193 +++++++++++++++++++++++++++++++++++++++++++ dlls/oledb32/main.c | 7 ++ dlls/oledb32/oledb_private.h | 1 + 4 files changed, 202 insertions(+) create mode 100644 dlls/oledb32/datainit.c diff --git a/dlls/oledb32/Makefile.in b/dlls/oledb32/Makefile.in index 5c66a2ceb3e..71e352bd467 100644 --- a/dlls/oledb32/Makefile.in +++ b/dlls/oledb32/Makefile.in @@ -4,6 +4,7 @@ IMPORTS = uuid oleaut32 ole32 user32 advapi32 C_SRCS = \ convert.c \ + datainit.c \ main.c IDL_I_SRCS = convert.idl diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c new file mode 100644 index 00000000000..af596fead30 --- /dev/null +++ b/dlls/oledb32/datainit.c @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2012 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 + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "ole2.h" +#include "msdasc.h" +#include "oledberr.h" + +#include "oledb_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(oledb); + + +typedef struct datainit +{ + IDataInitialize IDataInitialize_iface; + + LONG ref; +} datainit; + +static inline datainit *impl_from_IDataInitialize(IDataInitialize *iface) +{ + return CONTAINING_RECORD(iface, datainit, IDataInitialize_iface); +} + +static HRESULT WINAPI datainit_QueryInterface(IDataInitialize *iface, REFIID riid, void **obj) +{ + datainit *This = impl_from_IDataInitialize(iface); + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj); + + *obj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDataInitialize)) + { + *obj = &This->IDataInitialize_iface; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IDataInitialize_AddRef(iface); + return S_OK; +} + +static ULONG WINAPI datainit_AddRef(IDataInitialize *iface) +{ + datainit *This = impl_from_IDataInitialize(iface); + TRACE("(%p)\n", This); + + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI datainit_Release(IDataInitialize *iface) +{ + datainit *This = impl_from_IDataInitialize(iface); + LONG ref; + + TRACE("(%p)\n", This); + + ref = InterlockedDecrement(&This->ref); + if(ref == 0) + { + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +/*** IDataInitialize methods ***/ +static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *pUnkOuter, DWORD dwClsCtx, + LPWSTR pwszInitializationString, REFIID riid, IUnknown **ppDataSource) +{ + datainit *This = impl_from_IDataInitialize(iface); + + FIXME("(%p)->(%p %d %s %s %p)\n", This, pUnkOuter, dwClsCtx, debugstr_w(pwszInitializationString), + debugstr_guid(riid), ppDataSource); + + return E_NOTIMPL; +} + +static HRESULT WINAPI datainit_GetInitializationString(IDataInitialize *iface, IUnknown *pDataSource, + boolean fIncludePassword, LPWSTR *ppwszInitString) +{ + datainit *This = impl_from_IDataInitialize(iface); + + FIXME("(%p)->(%p %d %p)\n", This, pDataSource, fIncludePassword, ppwszInitString); + + return E_NOTIMPL; +} + +static HRESULT WINAPI datainit_CreateDBInstance(IDataInitialize *iface, REFCLSID clsidProvider, + IUnknown *pUnkOuter, DWORD dwClsCtx, LPWSTR pwszReserved, REFIID riid, + IUnknown **ppDataSource) +{ + datainit *This = impl_from_IDataInitialize(iface); + + FIXME("(%p)->()\n", This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI datainit_RemoteCreateDBInstanceEx(IDataInitialize *iface, REFCLSID clsidProvider, + IUnknown *pUnkOuter, DWORD dwClsCtx, LPWSTR pwszReserved, COSERVERINFO *pServerInfo, + DWORD cmq, GUID **rgpIID, IUnknown **rgpItf, HRESULT *rghr) +{ + datainit *This = impl_from_IDataInitialize(iface); + + FIXME("(%p)->()\n", This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI datainit_LoadStringFromStorage(IDataInitialize *iface, LPWSTR pwszFileName, + LPWSTR *ppwszInitializationString) +{ + datainit *This = impl_from_IDataInitialize(iface); + + FIXME("(%p)->(%s %p)\n", This, debugstr_w(pwszFileName), ppwszInitializationString); + + return E_NOTIMPL; +} + +static HRESULT WINAPI datainit_WriteStringToStorage(IDataInitialize *iface, LPWSTR pwszFileName, + LPWSTR pwszInitializationString, DWORD dwCreationDisposition) +{ + datainit *This = impl_from_IDataInitialize(iface); + + FIXME("(%p)->(%s %s %d)\n", This, debugstr_w(pwszFileName), debugstr_w(pwszInitializationString), dwCreationDisposition); + + return E_NOTIMPL; +} + + +static const struct IDataInitializeVtbl datainit_vtbl = +{ + datainit_QueryInterface, + datainit_AddRef, + datainit_Release, + datainit_GetDataSource, + datainit_GetInitializationString, + datainit_CreateDBInstance, + datainit_RemoteCreateDBInstanceEx, + datainit_LoadStringFromStorage, + datainit_WriteStringToStorage +}; + +HRESULT create_data_init(IUnknown *outer, void **obj) +{ + datainit *This; + + TRACE("(%p)\n", obj); + + if(outer) return CLASS_E_NOAGGREGATION; + + *obj = NULL; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); + if(!This) return E_OUTOFMEMORY; + + This->IDataInitialize_iface.lpVtbl = &datainit_vtbl; + This->ref = 1; + + *obj = &This->IDataInitialize_iface; + + return S_OK; +} diff --git a/dlls/oledb32/main.c b/dlls/oledb32/main.c index af81d7792e4..e8a1d468957 100644 --- a/dlls/oledb32/main.c +++ b/dlls/oledb32/main.c @@ -27,6 +27,7 @@ #include "winbase.h" #include "ole2.h" #include "rpcproxy.h" +#include "msdasc.h" #include "initguid.h" #include "msdaguid.h" @@ -127,6 +128,7 @@ static const IClassFactoryVtbl CF_Vtbl = }; static cf oledb_convert_cf = { { &CF_Vtbl }, create_oledb_convert }; +static cf oledb_datainit_cf = { { &CF_Vtbl }, create_data_init }; /****************************************************************** * DllGetClassObject @@ -140,6 +142,11 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **obj) *obj = &oledb_convert_cf; return S_OK; } + else if ( IsEqualCLSID (rclsid, &CLSID_MSDAINITIALIZE) ) + { + *obj = &oledb_datainit_cf; + return S_OK; + } return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/dlls/oledb32/oledb_private.h b/dlls/oledb32/oledb_private.h index a79d25146d1..ad5d67f52dc 100644 --- a/dlls/oledb32/oledb_private.h +++ b/dlls/oledb32/oledb_private.h @@ -18,3 +18,4 @@ */ HRESULT create_oledb_convert(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; +HRESULT create_data_init(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; -- 2.11.4.GIT