From f2490c50d9896bc27e4cf1737812003fc7686931 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 2 Sep 2009 12:13:12 +0100 Subject: [PATCH] oledb32: Add a stub implementation of the conversion library class. --- .gitignore | 2 + dlls/oledb32/Makefile.in | 5 +- dlls/oledb32/convert.c | 166 +++++++++++++++++++++++++++++++ dlls/oledb32/convert.idl | 1 + dlls/oledb32/main.c | 99 ++++++++++++++++++ dlls/oledb32/oledb32.spec | 2 +- dlls/oledb32/{main.c => oledb_private.h} | 21 +--- 7 files changed, 275 insertions(+), 21 deletions(-) create mode 100644 dlls/oledb32/convert.c create mode 100644 dlls/oledb32/convert.idl copy dlls/oledb32/{main.c => oledb_private.h} (69%) diff --git a/.gitignore b/.gitignore index 049657d46ef..799496f1523 100644 --- a/.gitignore +++ b/.gitignore @@ -80,6 +80,8 @@ dlls/oleaut32/tests/test_tlb.tlb dlls/oleaut32/tests/tmarshal.h dlls/oleaut32/tests/tmarshal.tlb dlls/oleaut32/tests/tmarshal_i.c +dlls/oledb32/convert.h +dlls/oledb32/convert_i.c dlls/qmgr/qmgr_local.h dlls/qmgr/qmgr_local_i.c dlls/qmgrprxy/qmgrprxy.h diff --git a/dlls/oledb32/Makefile.in b/dlls/oledb32/Makefile.in index 538150311ea..bb32e4c2cd2 100644 --- a/dlls/oledb32/Makefile.in +++ b/dlls/oledb32/Makefile.in @@ -4,11 +4,14 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = oledb32.dll -IMPORTS = oleaut32 ole32 user32 advapi32 kernel32 +IMPORTS = uuid oleaut32 ole32 user32 advapi32 kernel32 C_SRCS = \ + convert.c \ main.c +IDL_I_SRCS = convert.idl + @MAKE_DLL_RULES@ @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c new file mode 100644 index 00000000000..ca2040cc19b --- /dev/null +++ b/dlls/oledb32/convert.c @@ -0,0 +1,166 @@ +/* OLE DB Conversion library + * + * Copyright 2009 Huw Davies + * + * 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 "ole2.h" +#include "msdadc.h" + +#include "oledb_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(oledb); + +typedef struct +{ + const struct IDataConvertVtbl *lpVtbl; + + LONG ref; +} convert; + +static inline convert *impl_from_IDataConvert(IDataConvert *iface) +{ + return (convert *)((char*)iface - FIELD_OFFSET(convert, lpVtbl)); +} + +static HRESULT WINAPI convert_QueryInterface(IDataConvert* iface, + REFIID riid, + void **obj) +{ + convert *This = impl_from_IDataConvert(iface); + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj); + + *obj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDataConvert)) + { + *obj = iface; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IDataConvert_AddRef(iface); + return S_OK; +} + + +static ULONG WINAPI convert_AddRef(IDataConvert* iface) +{ + convert *This = impl_from_IDataConvert(iface); + TRACE("(%p)\n", This); + + return InterlockedIncrement(&This->ref); +} + + +static ULONG WINAPI convert_Release(IDataConvert* iface) +{ + convert *This = impl_from_IDataConvert(iface); + LONG ref; + + TRACE("(%p)\n", This); + + ref = InterlockedDecrement(&This->ref); + if(ref == 0) + { + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI convert_DataConvert(IDataConvert* iface, + DBTYPE wSrcType, DBTYPE wDstType, + DBLENGTH cbSrcLength, DBLENGTH *pcbDstLength, + void *pSrc, void *pDst, + DBLENGTH cbDstMaxLength, + DBSTATUS dbsSrcStatus, DBSTATUS *pdbsDstStatus, + BYTE bPrecision, BYTE bScale, + DBDATACONVERT dwFlags) +{ + convert *This = impl_from_IDataConvert(iface); + FIXME("(%p)->(%d, %d, %d, %p, %p, %p, %d, %d, %p, %d, %d, %x): stub\n", This, + wSrcType, wDstType, cbSrcLength, pcbDstLength, pSrc, pDst, cbDstMaxLength, + dbsSrcStatus, pdbsDstStatus, bPrecision, bScale, dwFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI convert_CanConvert(IDataConvert* iface, + DBTYPE wSrcType, DBTYPE wDstType) +{ + convert *This = impl_from_IDataConvert(iface); + FIXME("(%p)->(%d, %d): stub\n", This, wSrcType, wDstType); + + return E_NOTIMPL; +} + +static HRESULT WINAPI convert_GetConversionSize(IDataConvert* iface, + DBTYPE wSrcType, DBTYPE wDstType, + DBLENGTH *pcbSrcLength, DBLENGTH *pcbDstLength, + void *pSrc) +{ + convert *This = impl_from_IDataConvert(iface); + FIXME("(%p)->(%d, %d, %p, %p, %p): stub\n", This, wSrcType, wDstType, pcbSrcLength, pcbDstLength, pSrc); + + return E_NOTIMPL; + +} + +static const struct IDataConvertVtbl convert_vtbl = +{ + convert_QueryInterface, + convert_AddRef, + convert_Release, + convert_DataConvert, + convert_CanConvert, + convert_GetConversionSize +}; + +HRESULT create_oledb_convert(IUnknown *outer, void **obj) +{ + convert *This; + + TRACE("(%p, %p)\n", outer, obj); + + *obj = NULL; + + if(outer) return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); + if(!This) return E_OUTOFMEMORY; + + This->lpVtbl = &convert_vtbl; + This->ref = 1; + + *obj = &This->lpVtbl; + + return S_OK; +} diff --git a/dlls/oledb32/convert.idl b/dlls/oledb32/convert.idl new file mode 100644 index 00000000000..081be3d9665 --- /dev/null +++ b/dlls/oledb32/convert.idl @@ -0,0 +1 @@ +#include "msdadc.idl" diff --git a/dlls/oledb32/main.c b/dlls/oledb32/main.c index 46c54381155..6ff580ce2ef 100644 --- a/dlls/oledb32/main.c +++ b/dlls/oledb32/main.c @@ -19,8 +19,22 @@ #include +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + #include "windef.h" #include "winbase.h" +#include "ole2.h" + +#include "initguid.h" +#include "msdaguid.h" + +#include "oledb_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(oledb); BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID lpv) { @@ -35,3 +49,88 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID lpv) } return TRUE; } + +/****************************************************************************** + * ClassFactory + */ +typedef struct +{ + const IClassFactoryVtbl *lpVtbl; + HRESULT (*create_object)( IUnknown*, LPVOID* ); +} cf; + +static HRESULT WINAPI CF_QueryInterface(IClassFactory *iface, REFIID riid, void **obj) +{ + cf *This = (cf *)iface; + + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), obj); + + if( IsEqualCLSID( riid, &IID_IUnknown ) || + IsEqualCLSID( riid, &IID_IClassFactory ) ) + { + IClassFactory_AddRef( iface ); + *obj = iface; + return S_OK; + } + return E_NOINTERFACE; +} + +static ULONG WINAPI CF_AddRef(IClassFactory *iface) +{ + return 2; +} + +static ULONG WINAPI CF_Release(IClassFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI CF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **obj) +{ + cf *This = (cf *)iface; + IUnknown *unk = NULL; + HRESULT r; + + TRACE("(%p, %p, %s, %p)\n", This, pOuter, debugstr_guid(riid), obj); + + r = This->create_object( pOuter, (void **) &unk ); + if (SUCCEEDED(r)) + { + r = IUnknown_QueryInterface( unk, riid, obj ); + IUnknown_Release( unk ); + } + return r; +} + +static HRESULT WINAPI CF_LockServer(IClassFactory *iface, BOOL dolock) +{ + FIXME("(%p, %d): stub\n", iface, dolock); + return S_OK; +} + +static const IClassFactoryVtbl CF_Vtbl = +{ + CF_QueryInterface, + CF_AddRef, + CF_Release, + CF_CreateInstance, + CF_LockServer +}; + +static cf oledb_convert_cf = { &CF_Vtbl, create_oledb_convert }; + +/****************************************************************** + * DllGetClassObject + */ +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **obj) +{ + TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), obj); + + if ( IsEqualCLSID (rclsid, &CLSID_OLEDB_CONVERSIONLIBRARY) ) + { + *obj = &oledb_convert_cf; + return S_OK; + } + + return CLASS_E_CLASSNOTAVAILABLE; +} diff --git a/dlls/oledb32/oledb32.spec b/dlls/oledb32/oledb32.spec index c5fc87af6d5..68c9a3528da 100644 --- a/dlls/oledb32/oledb32.spec +++ b/dlls/oledb32/oledb32.spec @@ -1,4 +1,4 @@ @ stub DllCanUnloadNow -@ stub DllGetClassObject +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stub DllRegisterServer @ stub DllUnregisterServer diff --git a/dlls/oledb32/main.c b/dlls/oledb32/oledb_private.h similarity index 69% copy from dlls/oledb32/main.c copy to dlls/oledb32/oledb_private.h index 46c54381155..1c98fa063cd 100644 --- a/dlls/oledb32/main.c +++ b/dlls/oledb32/oledb_private.h @@ -1,4 +1,4 @@ -/* OLE DB Initialization +/* OLE DB Internal header * * Copyright 2009 Huw Davies * @@ -17,21 +17,4 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include - -#include "windef.h" -#include "winbase.h" - -BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID lpv) -{ - switch(reason) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinst); - break; - - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} +HRESULT create_oledb_convert(IUnknown *outer, void **obj); -- 2.11.4.GIT