Nikolay Sivov : oledb32: Added IConnectionPoint stub for IRowPositionChange notification.

Alexandre Julliard julliard at winehq.org
Fri Aug 2 09:53:39 CDT 2013


Module: wine
Branch: master
Commit: b4bab7679228ef8b3ce4c57cb89117855e9098c8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b4bab7679228ef8b3ce4c57cb89117855e9098c8

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Aug  2 09:50:29 2013 +0400

oledb32: Added IConnectionPoint stub for IRowPositionChange notification.

---

 dlls/oledb32/oledb_private.h |   10 ++++
 dlls/oledb32/rowpos.c        |  102 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 109 insertions(+), 3 deletions(-)

diff --git a/dlls/oledb32/oledb_private.h b/dlls/oledb32/oledb_private.h
index 3ff8d1d..1570529 100644
--- a/dlls/oledb32/oledb_private.h
+++ b/dlls/oledb32/oledb_private.h
@@ -21,3 +21,13 @@ 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;
+
+static inline void *heap_alloc(size_t len)
+{
+    return HeapAlloc(GetProcessHeap(), 0, len);
+}
+
+static inline BOOL heap_free(void *mem)
+{
+    return HeapFree(GetProcessHeap(), 0, mem);
+}
diff --git a/dlls/oledb32/rowpos.c b/dlls/oledb32/rowpos.c
index 88cdb6e..96a36a5 100644
--- a/dlls/oledb32/rowpos.c
+++ b/dlls/oledb32/rowpos.c
@@ -30,14 +30,22 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(oledb);
 
+typedef struct rowpos rowpos;
 typedef struct
 {
+    IConnectionPoint IConnectionPoint_iface;
+    rowpos *container;
+} rowpos_cp;
+
+struct rowpos
+{
     IRowPosition IRowPosition_iface;
     IConnectionPointContainer IConnectionPointContainer_iface;
     LONG ref;
 
     IRowset *rowset;
-} rowpos;
+    rowpos_cp cp;
+};
 
 static inline rowpos *impl_from_IRowPosition(IRowPosition *iface)
 {
@@ -49,6 +57,11 @@ static inline rowpos *impl_from_IConnectionPointContainer(IConnectionPointContai
     return CONTAINING_RECORD(iface, rowpos, IConnectionPointContainer_iface);
 }
 
+static inline rowpos_cp *impl_from_IConnectionPoint(IConnectionPoint *iface)
+{
+    return CONTAINING_RECORD(iface, rowpos_cp, IConnectionPoint_iface);
+}
+
 static HRESULT WINAPI rowpos_QueryInterface(IRowPosition* iface, REFIID riid, void **obj)
 {
     rowpos *This = impl_from_IRowPosition(iface);
@@ -94,7 +107,7 @@ static ULONG WINAPI rowpos_Release(IRowPosition* iface)
     if (ref == 0)
     {
         if (This->rowset) IRowset_Release(This->rowset);
-        HeapFree(GetProcessHeap(), 0, This);
+        heap_free(This);
     }
 
     return ref;
@@ -194,6 +207,88 @@ static const struct IConnectionPointContainerVtbl rowpos_cpc_vtbl =
     cpc_FindConnectionPoint
 };
 
+static HRESULT WINAPI rowpos_cp_QueryInterface(IConnectionPoint *iface, REFIID riid, void **obj)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+    return IConnectionPointContainer_QueryInterface(&This->container->IConnectionPointContainer_iface, riid, obj);
+}
+
+static ULONG WINAPI rowpos_cp_AddRef(IConnectionPoint *iface)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+    return IConnectionPointContainer_AddRef(&This->container->IConnectionPointContainer_iface);
+}
+
+static ULONG WINAPI rowpos_cp_Release(IConnectionPoint *iface)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+    return IConnectionPointContainer_Release(&This->container->IConnectionPointContainer_iface);
+}
+
+static HRESULT WINAPI rowpos_cp_GetConnectionInterface(IConnectionPoint *iface, IID *iid)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+
+    TRACE("(%p)->(%p)\n", This, iid);
+
+    if (!iid) return E_POINTER;
+
+    *iid = IID_IRowPositionChange;
+    return S_OK;
+}
+
+static HRESULT WINAPI rowpos_cp_GetConnectionPointContainer(IConnectionPoint *iface, IConnectionPointContainer **container)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+
+    TRACE("(%p)->(%p)\n", This, container);
+
+    if (!container) return E_POINTER;
+
+    *container = &This->container->IConnectionPointContainer_iface;
+    IConnectionPointContainer_AddRef(*container);
+    return S_OK;
+}
+
+static HRESULT WINAPI rowpos_cp_Advise(IConnectionPoint *iface, IUnknown *sink, DWORD *cookie)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+    FIXME("(%p)->(%p %p): stub\n", This, sink, cookie);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowpos_cp_Unadvise(IConnectionPoint *iface, DWORD cookie)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+    FIXME("(%p)->(%d): stub\n", This, cookie);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowpos_cp_EnumConnections(IConnectionPoint *iface, IEnumConnections **enum_c)
+{
+    rowpos_cp *This = impl_from_IConnectionPoint(iface);
+    FIXME("(%p)->(%p): stub\n", This, enum_c);
+    return E_NOTIMPL;
+}
+
+static const struct IConnectionPointVtbl rowpos_cp_vtbl =
+{
+    rowpos_cp_QueryInterface,
+    rowpos_cp_AddRef,
+    rowpos_cp_Release,
+    rowpos_cp_GetConnectionInterface,
+    rowpos_cp_GetConnectionPointContainer,
+    rowpos_cp_Advise,
+    rowpos_cp_Unadvise,
+    rowpos_cp_EnumConnections
+};
+
+static void rowposchange_cp_init(rowpos_cp *cp, rowpos *container)
+{
+    cp->IConnectionPoint_iface.lpVtbl = &rowpos_cp_vtbl;
+    cp->container = container;
+}
+
 HRESULT create_oledb_rowpos(IUnknown *outer, void **obj)
 {
     rowpos *This;
@@ -204,13 +299,14 @@ HRESULT create_oledb_rowpos(IUnknown *outer, void **obj)
 
     if(outer) return CLASS_E_NOAGGREGATION;
 
-    This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+    This = heap_alloc(sizeof(*This));
     if(!This) return E_OUTOFMEMORY;
 
     This->IRowPosition_iface.lpVtbl = &rowpos_vtbl;
     This->IConnectionPointContainer_iface.lpVtbl = &rowpos_cpc_vtbl;
     This->ref = 1;
     This->rowset = NULL;
+    rowposchange_cp_init(&This->cp, This);
 
     *obj = &This->IRowPosition_iface;
 




More information about the wine-cvs mailing list