oledb32: Implement Advise/Unadvise for IRowPositionChange.
This commit is contained in:
parent
2139a402c7
commit
f339c2fa0d
|
@ -27,6 +27,16 @@ static inline void *heap_alloc(size_t len)
|
||||||
return HeapAlloc(GetProcessHeap(), 0, len);
|
return HeapAlloc(GetProcessHeap(), 0, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void *heap_alloc_zero(size_t len)
|
||||||
|
{
|
||||||
|
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *heap_realloc_zero(void *mem, size_t len)
|
||||||
|
{
|
||||||
|
return HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len);
|
||||||
|
}
|
||||||
|
|
||||||
static inline BOOL heap_free(void *mem)
|
static inline BOOL heap_free(void *mem)
|
||||||
{
|
{
|
||||||
return HeapFree(GetProcessHeap(), 0, mem);
|
return HeapFree(GetProcessHeap(), 0, mem);
|
||||||
|
|
|
@ -36,6 +36,8 @@ typedef struct
|
||||||
{
|
{
|
||||||
IConnectionPoint IConnectionPoint_iface;
|
IConnectionPoint IConnectionPoint_iface;
|
||||||
rowpos *container;
|
rowpos *container;
|
||||||
|
IRowPositionChange **sinks;
|
||||||
|
DWORD sinks_size;
|
||||||
} rowpos_cp;
|
} rowpos_cp;
|
||||||
|
|
||||||
struct rowpos
|
struct rowpos
|
||||||
|
@ -48,6 +50,8 @@ struct rowpos
|
||||||
rowpos_cp cp;
|
rowpos_cp cp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void rowposchange_cp_destroy(rowpos_cp*);
|
||||||
|
|
||||||
static inline rowpos *impl_from_IRowPosition(IRowPosition *iface)
|
static inline rowpos *impl_from_IRowPosition(IRowPosition *iface)
|
||||||
{
|
{
|
||||||
return CONTAINING_RECORD(iface, rowpos, IRowPosition_iface);
|
return CONTAINING_RECORD(iface, rowpos, IRowPosition_iface);
|
||||||
|
@ -108,6 +112,7 @@ static ULONG WINAPI rowpos_Release(IRowPosition* iface)
|
||||||
if (ref == 0)
|
if (ref == 0)
|
||||||
{
|
{
|
||||||
if (This->rowset) IRowset_Release(This->rowset);
|
if (This->rowset) IRowset_Release(This->rowset);
|
||||||
|
rowposchange_cp_destroy(&This->cp);
|
||||||
heap_free(This);
|
heap_free(This);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,18 +268,62 @@ static HRESULT WINAPI rowpos_cp_GetConnectionPointContainer(IConnectionPoint *if
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI rowpos_cp_Advise(IConnectionPoint *iface, IUnknown *sink, DWORD *cookie)
|
static HRESULT WINAPI rowpos_cp_Advise(IConnectionPoint *iface, IUnknown *unksink, DWORD *cookie)
|
||||||
{
|
{
|
||||||
rowpos_cp *This = impl_from_IConnectionPoint(iface);
|
rowpos_cp *This = impl_from_IConnectionPoint(iface);
|
||||||
FIXME("(%p)->(%p %p): stub\n", This, sink, cookie);
|
IRowPositionChange *sink;
|
||||||
return E_NOTIMPL;
|
HRESULT hr;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
TRACE("(%p)->(%p %p)\n", This, unksink, cookie);
|
||||||
|
|
||||||
|
hr = IUnknown_QueryInterface(unksink, &IID_IRowPositionChange, (void**)&sink);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
FIXME("sink doesn't support IRowPositionChange\n");
|
||||||
|
return CONNECT_E_CANNOTCONNECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (This->sinks)
|
||||||
|
{
|
||||||
|
for (i = 0; i < This->sinks_size; i++)
|
||||||
|
{
|
||||||
|
if (!This->sinks[i])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == This->sinks_size)
|
||||||
|
{
|
||||||
|
This->sinks_size *= 2;
|
||||||
|
This->sinks = heap_realloc_zero(This->sinks, This->sinks_size*sizeof(*This->sinks));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
This->sinks_size = 10;
|
||||||
|
This->sinks = heap_alloc_zero(This->sinks_size*sizeof(*This->sinks));
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
This->sinks[i] = sink;
|
||||||
|
if (cookie) *cookie = i + 1;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI rowpos_cp_Unadvise(IConnectionPoint *iface, DWORD cookie)
|
static HRESULT WINAPI rowpos_cp_Unadvise(IConnectionPoint *iface, DWORD cookie)
|
||||||
{
|
{
|
||||||
rowpos_cp *This = impl_from_IConnectionPoint(iface);
|
rowpos_cp *This = impl_from_IConnectionPoint(iface);
|
||||||
FIXME("(%p)->(%d): stub\n", This, cookie);
|
|
||||||
return E_NOTIMPL;
|
TRACE("(%p)->(%d)\n", This, cookie);
|
||||||
|
|
||||||
|
if (!cookie || cookie > This->sinks_size || !This->sinks[cookie-1])
|
||||||
|
return CONNECT_E_NOCONNECTION;
|
||||||
|
|
||||||
|
IRowPositionChange_Release(This->sinks[cookie-1]);
|
||||||
|
This->sinks[cookie-1] = NULL;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI rowpos_cp_EnumConnections(IConnectionPoint *iface, IEnumConnections **enum_c)
|
static HRESULT WINAPI rowpos_cp_EnumConnections(IConnectionPoint *iface, IEnumConnections **enum_c)
|
||||||
|
@ -300,6 +349,19 @@ static void rowposchange_cp_init(rowpos_cp *cp, rowpos *container)
|
||||||
{
|
{
|
||||||
cp->IConnectionPoint_iface.lpVtbl = &rowpos_cp_vtbl;
|
cp->IConnectionPoint_iface.lpVtbl = &rowpos_cp_vtbl;
|
||||||
cp->container = container;
|
cp->container = container;
|
||||||
|
cp->sinks = NULL;
|
||||||
|
cp->sinks_size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rowposchange_cp_destroy(rowpos_cp *cp)
|
||||||
|
{
|
||||||
|
DWORD i;
|
||||||
|
for (i = 0; i < cp->sinks_size; i++)
|
||||||
|
{
|
||||||
|
if (cp->sinks[i])
|
||||||
|
IRowPositionChange_Release(cp->sinks[i]);
|
||||||
|
}
|
||||||
|
heap_free(cp->sinks);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT create_oledb_rowpos(IUnknown *outer, void **obj)
|
HRESULT create_oledb_rowpos(IUnknown *outer, void **obj)
|
||||||
|
|
Loading…
Reference in New Issue