Module: wine Branch: refs/heads/master Commit: bf1724ef33b107f97bd6e2dfbdbfdcba616a3647 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=bf1724ef33b107f97bd6e2df...
Author: Jacek Caban jacek@codeweavers.com Date: Sun Jun 25 15:48:47 2006 +0200
mshtml: Added Advise implementation.
---
dlls/mshtml/conpoint.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/conpoint.c b/dlls/mshtml/conpoint.c index 480814a..6ef49ea 100644 --- a/dlls/mshtml/conpoint.c +++ b/dlls/mshtml/conpoint.c @@ -40,6 +40,14 @@ struct ConnectionPoint { const IConnectionPointVtbl *lpConnectionPointVtbl;
HTMLDocument *doc; + + union { + IUnknown *unk; + IDispatch *disp; + IPropertyNotifySink *propnotif; + } *sinks; + DWORD sinks_size; + IID iid; };
@@ -113,8 +121,38 @@ static HRESULT WINAPI ConnectionPoint_Ad DWORD *pdwCookie) { ConnectionPoint *This = CONPOINT_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pUnkSink, pdwCookie); - return E_NOTIMPL; + 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 = HeapReAlloc(GetProcessHeap(), 0, This->sinks, + (++This->sinks_size)*sizeof(*This->sinks)); + }else { + This->sinks = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->sinks)); + This->sinks_size = 1; + i = 0; + } + + This->sinks[i].unk = sink; + *pdwCookie = i+1; + + return S_OK; }
static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD dwCookie) @@ -152,6 +190,8 @@ static void ConnectionPoint_Create(HTMLD
ret->lpConnectionPointVtbl = &ConnectionPointVtbl; ret->doc = doc; + ret->sinks = NULL; + ret->sinks_size = 0; memcpy(&ret->iid, riid, sizeof(IID));
*cp = ret;