From 2111d70c252ebeba145552f64aa03a2abafb8dc0 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 2 Aug 2013 09:44:43 +0400 Subject: [PATCH] oledb32: Added IConnectionPointContainer stub. --- dlls/oledb32/rowpos.c | 52 +++++++++++++++++++++++++++++++++++ dlls/oledb32/tests/database.c | 40 +++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/dlls/oledb32/rowpos.c b/dlls/oledb32/rowpos.c index d789c1918b5..88cdb6e205e 100644 --- a/dlls/oledb32/rowpos.c +++ b/dlls/oledb32/rowpos.c @@ -33,6 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(oledb); typedef struct { IRowPosition IRowPosition_iface; + IConnectionPointContainer IConnectionPointContainer_iface; LONG ref; IRowset *rowset; @@ -43,6 +44,11 @@ static inline rowpos *impl_from_IRowPosition(IRowPosition *iface) return CONTAINING_RECORD(iface, rowpos, IRowPosition_iface); } +static inline rowpos *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface) +{ + return CONTAINING_RECORD(iface, rowpos, IConnectionPointContainer_iface); +} + static HRESULT WINAPI rowpos_QueryInterface(IRowPosition* iface, REFIID riid, void **obj) { rowpos *This = impl_from_IRowPosition(iface); @@ -56,6 +62,10 @@ static HRESULT WINAPI rowpos_QueryInterface(IRowPosition* iface, REFIID riid, vo { *obj = iface; } + else if (IsEqualIID(riid, &IID_IConnectionPointContainer)) + { + *obj = &This->IConnectionPointContainer_iface; + } else { FIXME("interface %s not implemented\n", debugstr_guid(riid)); @@ -143,6 +153,47 @@ static const struct IRowPositionVtbl rowpos_vtbl = rowpos_SetRowPosition }; +static HRESULT WINAPI cpc_QueryInterface(IConnectionPointContainer *iface, REFIID riid, void **obj) +{ + rowpos *This = impl_from_IConnectionPointContainer(iface); + return IRowPosition_QueryInterface(&This->IRowPosition_iface, riid, obj); +} + +static ULONG WINAPI cpc_AddRef(IConnectionPointContainer *iface) +{ + rowpos *This = impl_from_IConnectionPointContainer(iface); + return IRowPosition_AddRef(&This->IRowPosition_iface); +} + +static ULONG WINAPI cpc_Release(IConnectionPointContainer *iface) +{ + rowpos *This = impl_from_IConnectionPointContainer(iface); + return IRowPosition_Release(&This->IRowPosition_iface); +} + +static HRESULT WINAPI cpc_EnumConnectionPoints(IConnectionPointContainer *iface, IEnumConnectionPoints **enum_points) +{ + rowpos *This = impl_from_IConnectionPointContainer(iface); + FIXME("(%p)->(%p): stub\n", This, enum_points); + return E_NOTIMPL; +} + +static HRESULT WINAPI cpc_FindConnectionPoint(IConnectionPointContainer *iface, REFIID riid, IConnectionPoint **point) +{ + rowpos *This = impl_from_IConnectionPointContainer(iface); + FIXME("(%p)->(%s %p): stub\n", This, debugstr_guid(riid), point); + return E_NOTIMPL; +} + +static const struct IConnectionPointContainerVtbl rowpos_cpc_vtbl = +{ + cpc_QueryInterface, + cpc_AddRef, + cpc_Release, + cpc_EnumConnectionPoints, + cpc_FindConnectionPoint +}; + HRESULT create_oledb_rowpos(IUnknown *outer, void **obj) { rowpos *This; @@ -157,6 +208,7 @@ HRESULT create_oledb_rowpos(IUnknown *outer, void **obj) if(!This) return E_OUTOFMEMORY; This->IRowPosition_iface.lpVtbl = &rowpos_vtbl; + This->IConnectionPointContainer_iface.lpVtbl = &rowpos_cpc_vtbl; This->ref = 1; This->rowset = NULL; diff --git a/dlls/oledb32/tests/database.c b/dlls/oledb32/tests/database.c index d54d546f184..7b129b8ea75 100644 --- a/dlls/oledb32/tests/database.c +++ b/dlls/oledb32/tests/database.c @@ -17,6 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include +#include #define COBJMACROS #define NONAMELESSUNION @@ -37,6 +38,21 @@ DEFINE_GUID(CSLID_MSDAER, 0xc8b522cf,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44 static WCHAR initstring_default[] = {'D','a','t','a',' ','S','o','u','r','c','e','=','d','u','m','m','y',';',0}; +static const char *debugstr_guid(REFIID riid) +{ + static char buf[50]; + + if(!riid) + return "(null)"; + + sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], + riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], + riid->Data4[5], riid->Data4[6], riid->Data4[7]); + + return buf; +} + static void test_GetDataSource(WCHAR *initstring) { IDataInitialize *datainit = NULL; @@ -188,12 +204,36 @@ static void test_initializationstring(void) static void test_rowposition(void) { + IEnumConnectionPoints *enum_points; + IConnectionPointContainer *cpc; + IConnectionPoint *cp; IRowPosition *rowpos; HRESULT hr; + IID iid; hr = CoCreateInstance(&CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IRowPosition, (void**)&rowpos); ok(hr == S_OK, "got %08x\n", hr); + hr = IRowPosition_QueryInterface(rowpos, &IID_IConnectionPointContainer, (void**)&cpc); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IConnectionPointContainer_EnumConnectionPoints(cpc, &enum_points); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); +if (hr == S_OK) { + hr = IEnumConnectionPoints_Next(enum_points, 1, &cp, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IConnectionPoint_GetConnectionInterface(cp, &iid); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(IsEqualIID(&iid, &IID_IRowPositionChange), "got %s\n", debugstr_guid(&iid)); + IConnectionPoint_Release(cp); + + hr = IEnumConnectionPoints_Next(enum_points, 1, &cp, NULL); + ok(hr == S_FALSE, "got 0x%08x\n", hr); + + IEnumConnectionPoints_Release(enum_points); +} + IConnectionPointContainer_Release(cpc); IRowPosition_Release(rowpos); }