static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) { HTMLDocument *This = VIEWOBJ_THIS(iface); TRACE("(%p)->(%d %d %p)\n", This, aspects, advf, pAdvSink); if(aspects != DVASPECT_CONTENT || advf != ADVF_PRIMEFIRST) FIXME("unsupported arguments\n"); if(This->doc_obj->view_sink) IAdviseSink_Release(This->doc_obj->view_sink); if(pAdvSink) IAdviseSink_AddRef(pAdvSink); This->doc_obj->view_sink = pAdvSink; return S_OK; }
static HRESULT WINAPI ViewObject_SetAdvise(IViewObject2 *iface, DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) { WebBrowser *This = impl_from_IViewObject2(iface); TRACE("(%p)->(%d %08x %p)\n", This, aspects, advf, pAdvSink); if (aspects || advf) FIXME("aspects and/or flags not supported yet\n"); This->sink_aspects = aspects; This->sink_flags = advf; if (This->sink) IAdviseSink_Release(This->sink); This->sink = pAdvSink; if (This->sink) IAdviseSink_AddRef(This->sink); return S_OK; }
static HRESULT WINAPI ViewObject_GetAdvise(IViewObject2 *iface, DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink) { WebBrowser *This = impl_from_IViewObject2(iface); TRACE("(%p)->(%p %p %p)\n", This, pAspects, pAdvf, ppAdvSink); if (pAspects) *pAspects = This->sink_aspects; if (pAdvf) *pAdvf = This->sink_flags; if (ppAdvSink) { *ppAdvSink = This->sink; if (*ppAdvSink) IAdviseSink_AddRef(*ppAdvSink); } return S_OK; }
static HRESULT WINAPI EnumOleSTATDATA_Next( IEnumSTATDATA *iface, ULONG celt, LPSTATDATA rgelt, ULONG *pceltFetched) { EnumOleSTATDATA *This = (EnumOleSTATDATA *)iface; HRESULT hr = S_OK; TRACE("(%d, %p, %p)\n", celt, rgelt, pceltFetched); if (pceltFetched) *pceltFetched = 0; for (; celt; celt--, rgelt++) { while ((This->index < This->pOleAdviseHolder->maxSinks) && !This->pOleAdviseHolder->arrayOfSinks[This->index]) { This->index++; } if (This->index >= This->pOleAdviseHolder->maxSinks) { hr = S_FALSE; break; } memset(&rgelt->formatetc, 0, sizeof(rgelt->formatetc)); rgelt->advf = 0; rgelt->pAdvSink = This->pOleAdviseHolder->arrayOfSinks[This->index]; IAdviseSink_AddRef(rgelt->pAdvSink); rgelt->dwConnection = This->index; if (pceltFetched) (*pceltFetched)++; This->index++; } return hr; }
/************************************************************************ * DataAdviseHolder_Advise * */ static HRESULT WINAPI DataAdviseHolder_Advise( IDataAdviseHolder* iface, IDataObject* pDataObject, FORMATETC* pFetc, DWORD advf, IAdviseSink* pAdvise, DWORD* pdwConnection) { DWORD index; DataAdviseHolder *This = (DataAdviseHolder *)iface; TRACE("(%p)->(%p, %p, %08x, %p, %p)\n", This, pDataObject, pFetc, advf, pAdvise, pdwConnection); /* * Sanity check */ if (pdwConnection==NULL) return E_POINTER; *pdwConnection = 0; /* * Find a free spot in the array. */ for (index = 0; index < This->maxCons; index++) { if (This->Connections[index].sink == NULL) break; } /* * If the array is full, we need to grow it. */ if (index == This->maxCons) { This->maxCons+=INITIAL_SINKS; This->Connections = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->Connections, This->maxCons*sizeof(DataAdviseConnection)); } /* * Store the new sink */ This->Connections[index].sink = pAdvise; This->Connections[index].advf = advf & ~WINE_ADVF_REMOTE; This->Connections[index].fmat = *pFetc; if (pFetc->ptd) { This->Connections[index].fmat.ptd = CoTaskMemAlloc(pFetc->ptd->tdSize); if (!This->Connections[index].fmat.ptd) { IDataAdviseHolder_Unadvise(iface, index + 1); return E_OUTOFMEMORY; } memcpy(This->Connections[index].fmat.ptd, pFetc->ptd, pFetc->ptd->tdSize); } if (This->Connections[index].sink != NULL) { IAdviseSink_AddRef(This->Connections[index].sink); /* if we are already connected advise the remote object */ if (This->delegate) { HRESULT hr; hr = IDataObject_DAdvise(This->delegate, &This->Connections[index].fmat, This->Connections[index].advf, This->Connections[index].sink, &This->Connections[index].remote_connection); if (FAILED(hr)) { IDataAdviseHolder_Unadvise(iface, index + 1); return hr; } This->Connections[index].advf |= WINE_ADVF_REMOTE; } else if(advf & ADVF_PRIMEFIRST) /* only do this if we have no delegate, since in the above case the * delegate will do the priming for us */ IDataAdviseHolder_SendOnDataChange(iface, pDataObject, 0, advf); } /* * Return the index as the cookie. * Since 0 is not a valid cookie, we will increment by * 1 the index in the table. */ *pdwConnection = index+1; return S_OK; }
/****************************************************************************** * OleAdviseHolderImpl_Advise */ static HRESULT WINAPI OleAdviseHolderImpl_Advise( LPOLEADVISEHOLDER iface, IAdviseSink* pAdvise, DWORD* pdwConnection) { DWORD index; OleAdviseHolderImpl *This = (OleAdviseHolderImpl *)iface; TRACE("(%p)->(%p, %p)\n", This, pAdvise, pdwConnection); /* * Sanity check */ if (pdwConnection==NULL) return E_POINTER; *pdwConnection = 0; /* * Find a free spot in the array. */ for (index = 0; index < This->maxSinks; index++) { if (This->arrayOfSinks[index]==NULL) break; } /* * If the array is full, we need to grow it. */ if (index == This->maxSinks) { DWORD i; This->maxSinks+=INITIAL_SINKS; This->arrayOfSinks = HeapReAlloc(GetProcessHeap(), 0, This->arrayOfSinks, This->maxSinks*sizeof(IAdviseSink*)); for (i=index;i < This->maxSinks; i++) This->arrayOfSinks[i]=0; } /* * Store the new sink */ This->arrayOfSinks[index] = pAdvise; if (This->arrayOfSinks[index]!=NULL) IAdviseSink_AddRef(This->arrayOfSinks[index]); /* * Return the index as the cookie. * Since 0 is not a valid cookie, we will increment by * 1 the index in the table. */ *pdwConnection = index+1; return S_OK; }