static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface, IEnumConnections **ppEnum) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); FIXME("(%p)->(%p)\n", This, ppEnum); return E_NOTIMPL; }
/************************************************************************ * ConnectionPointImpl_Advise (IConnectionPoint) * */ static HRESULT WINAPI ConnectionPointImpl_Advise(IConnectionPoint *iface, IUnknown *lpUnk, DWORD *pdwCookie) { DWORD i; ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); IUnknown *lpSink; TRACE("(%p)->(%p, %p)\n", This, lpUnk, pdwCookie); *pdwCookie = 0; if(FAILED(IUnknown_QueryInterface(lpUnk, &This->iid, (void**)&lpSink))) return CONNECT_E_CANNOTCONNECT; for(i = 0; i < This->maxSinks; i++) { if(This->sinks[i] == NULL) break; } if(i == This->maxSinks) { This->maxSinks += MAXSINKS; This->sinks = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->sinks, This->maxSinks * sizeof(IUnknown *)); } This->sinks[i] = lpSink; This->nSinks++; *pdwCookie = i + 1; return S_OK; }
/************************************************************************ * ConnectionPointImpl_AddRef (IUnknown) * * See Windows documentation for more details on IUnknown methods. */ static ULONG WINAPI ConnectionPointImpl_AddRef(IConnectionPoint* iface) { ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->(ref before=%d)\n", This, refCount - 1); return refCount; }
/************************************************************************ * ConnectionPointImpl_GetConnectionInterface (IConnectionPoint) * */ static HRESULT WINAPI ConnectionPointImpl_GetConnectionInterface( IConnectionPoint *iface, IID *piid) { ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%p) returning %s\n", This, piid, debugstr_guid(&(This->iid))); *piid = This->iid; return S_OK; }
/************************************************************************ * ConnectionPointImpl_GetConnectionPointContainer (IConnectionPoint) * */ static HRESULT WINAPI ConnectionPointImpl_GetConnectionPointContainer( IConnectionPoint *iface, IConnectionPointContainer **ppCPC) { ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%p)\n", This, ppCPC); return IUnknown_QueryInterface(This->Obj, &IID_IConnectionPointContainer, (void**)ppCPC); }
static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *pIID) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%p)\n", This, pIID); *pIID = This->iid; return S_OK; }
static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface, IConnectionPointContainer **ppCPC) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%p)\n", This, ppCPC); *ppCPC = This->container; IConnectionPointContainer_AddRef(This->container); return S_OK; }
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 ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD dwCookie) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%d)\n", This, dwCookie); if(!dwCookie || dwCookie > This->sinks_size || !This->sinks[dwCookie-1].unk) return CONNECT_E_NOCONNECTION; IUnknown_Release(This->sinks[dwCookie-1].unk); This->sinks[dwCookie-1].unk = NULL; return S_OK; }
static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface, IConnectionPointContainer **ppCPC) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%p)\n", This, ppCPC); if(!ppCPC) return E_POINTER; *ppCPC = &This->container->IConnectionPointContainer_iface; IConnectionPointContainer_AddRef(*ppCPC); return S_OK; }
static HRESULT WINAPI rowpos_cp_Unadvise(IConnectionPoint *iface, DWORD cookie) { rowpos_cp *This = impl_from_IConnectionPoint(iface); 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; }
/************************************************************************ * ConnectionPointImpl_Unadvise (IConnectionPoint) * */ static HRESULT WINAPI ConnectionPointImpl_Unadvise(IConnectionPoint *iface, DWORD dwCookie) { ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%d)\n", This, dwCookie); if(dwCookie == 0 || dwCookie > This->maxSinks) return E_INVALIDARG; if(This->sinks[dwCookie-1] == NULL) return CONNECT_E_NOCONNECTION; IUnknown_Release(This->sinks[dwCookie-1]); This->sinks[dwCookie-1] = NULL; This->nSinks--; return S_OK; }
/************************************************************************ * ConnectionPointImpl_Release (IUnknown) * * See Windows documentation for more details on IUnknown methods. */ static ULONG WINAPI ConnectionPointImpl_Release( IConnectionPoint* iface) { ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(ref before=%d)\n", This, refCount + 1); /* * If the reference count goes down to 0, perform suicide. */ if (!refCount) ConnectionPointImpl_Destroy(This); return refCount; }
static HRESULT WINAPI rowpos_cp_Advise(IConnectionPoint *iface, IUnknown *unksink, DWORD *cookie) { rowpos_cp *This = impl_from_IConnectionPoint(iface); IRowPositionChange *sink; HRESULT hr; DWORD i; TRACE("(%p)->(%p %p)\n", This, unksink, cookie); if (!cookie) return E_POINTER; 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; }
/************************************************************************ * ConnectionPointImpl_QueryInterface (IUnknown) * * See Windows documentation for more details on IUnknown methods. */ static HRESULT WINAPI ConnectionPointImpl_QueryInterface( IConnectionPoint* iface, REFIID riid, void** ppvObject) { ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppvObject); /* * Perform a sanity check on the parameters. */ if ( (This==0) || (ppvObject==0) ) return E_INVALIDARG; /* * Initialize the return parameter. */ *ppvObject = 0; /* * Compare the riid with the interface IDs implemented by this object. */ if (IsEqualIID(&IID_IUnknown, riid)) *ppvObject = This; else if (IsEqualIID(&IID_IConnectionPoint, riid)) *ppvObject = This; /* * Check that we obtained an interface. */ if ((*ppvObject)==0) { FIXME("() : asking for un supported interface %s\n",debugstr_guid(riid)); return E_NOINTERFACE; } /* * Query Interface always increases the reference count by one when it is * successful */ ConnectionPointImpl_AddRef(&This->IConnectionPoint_iface); return S_OK; }
static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, REFIID riid, LPVOID *ppv) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); if(IsEqualGUID(&IID_IUnknown, riid)) { *ppv = &This->IConnectionPoint_iface; }else if(IsEqualGUID(&IID_IConnectionPoint, riid)) { *ppv = &This->IConnectionPoint_iface; }else { *ppv = NULL; WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid)); return E_NOINTERFACE; } IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
/************************************************************************ * ConnectionPointImpl_EnumConnections (IConnectionPoint) * */ static HRESULT WINAPI ConnectionPointImpl_EnumConnections( IConnectionPoint *iface, LPENUMCONNECTIONS *ppEnum) { ConnectionPointImpl *This = impl_from_IConnectionPoint(iface); CONNECTDATA *pCD; DWORD i, nextslot; EnumConnectionsImpl *EnumObj; HRESULT hr; TRACE("(%p)->(%p)\n", This, ppEnum); *ppEnum = NULL; if(This->nSinks == 0) return OLE_E_NOCONNECTION; pCD = HeapAlloc(GetProcessHeap(), 0, sizeof(CONNECTDATA) * This->nSinks); for(i = 0, nextslot = 0; i < This->maxSinks; i++) { if(This->sinks[i] != NULL) { pCD[nextslot].pUnk = This->sinks[i]; pCD[nextslot].dwCookie = i + 1; nextslot++; } } assert(nextslot == This->nSinks); /* Bump the ref count of this object up by one. It gets Released in IEnumConnections_Release */ IUnknown_AddRef((IUnknown*)This); EnumObj = EnumConnectionsImpl_Construct((IUnknown*)This, This->nSinks, pCD); hr = IEnumConnections_QueryInterface(&EnumObj->IEnumConnections_iface, &IID_IEnumConnections, (void**)ppEnum); IEnumConnections_Release(&EnumObj->IEnumConnections_iface); HeapFree(GetProcessHeap(), 0, pCD); return hr; }
static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, DWORD *pdwCookie) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); IUnknown *sink; DWORD i; HRESULT hres; TRACE("(%p)->(%p %p)\n", This, pUnkSink, pdwCookie); hres = IUnknown_QueryInterface(pUnkSink, This->iid, (void**)&sink); if(FAILED(hres) && !IsEqualGUID(&IID_IPropertyNotifySink, This->iid)) hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatch, (void**)&sink); if(FAILED(hres)) return CONNECT_E_CANNOTCONNECT; if(This->sinks) { for(i=0; i<This->sinks_size; i++) { if(!This->sinks[i].unk) break; } if(i == This->sinks_size) This->sinks = heap_realloc(This->sinks,(++This->sinks_size)*sizeof(*This->sinks)); }else { This->sinks = heap_alloc(sizeof(*This->sinks)); This->sinks_size = 1; i = 0; } This->sinks[i].unk = sink; if(pdwCookie) *pdwCookie = i+1; if(!i && This->data && This->data->on_advise) This->data->on_advise(This->container->outer, This->data); return S_OK; }
static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface, IEnumConnections **ppEnum) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); EnumConnections *ret; TRACE("(%p)->(%p)\n", This, ppEnum); ret = heap_alloc(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->IEnumConnections_iface.lpVtbl = &EnumConnectionsVtbl; ret->ref = 1; ret->iter = 0; IConnectionPoint_AddRef(&This->IConnectionPoint_iface); ret->cp = This; *ppEnum = &ret->IEnumConnections_iface; return S_OK; }
static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, REFIID riid, LPVOID *ppv) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IConnectionPoint_iface; }else if(IsEqualGUID(&IID_IConnectionPoint, riid)) { TRACE("(%p)->(IID_IConnectionPoint %p)\n", This, ppv); *ppv = &This->IConnectionPoint_iface; } if(*ppv) { IConnectionPointContainer_AddRef(This->container); return S_OK; } WARN("Unsupported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; }
static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, DWORD *pdwCookie) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); IDispatch *disp; DWORD i; HRESULT hres; TRACE("(%p)->(%p %p)\n", This, pUnkSink, pdwCookie); hres = IUnknown_QueryInterface(pUnkSink, &This->iid, (void**)&disp); if(FAILED(hres)) { hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatch, (void**)&disp); if(FAILED(hres)) 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 = heap_realloc(This->sinks, (++This->sinks_size)*sizeof(*This->sinks)); }else { This->sinks = heap_alloc(sizeof(*This->sinks)); This->sinks_size = 1; i = 0; } This->sinks[i] = disp; *pdwCookie = i+1; return S_OK; }
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 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 ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); return IConnectionPointContainer_Release(This->container); }
static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface) { ConnectionPoint *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); }