diff --git a/dlls/mshtml/conpoint.c b/dlls/mshtml/conpoint.c index 421a72ef09b..7900ff67aff 100644 --- a/dlls/mshtml/conpoint.c +++ b/dlls/mshtml/conpoint.c @@ -184,13 +184,17 @@ static const IConnectionPointVtbl ConnectionPointVtbl = ConnectionPoint_EnumConnections }; -static void ConnectionPoint_Init(HTMLDocument *doc, REFIID riid, ConnectionPoint *cp) +void ConnectionPoint_Init(ConnectionPoint *cp, HTMLDocument *doc, REFIID riid, ConnectionPoint *prev) { cp->lpConnectionPointVtbl = &ConnectionPointVtbl; cp->doc = doc; cp->sinks = NULL; cp->sinks_size = 0; cp->iid = *riid; + cp->next = NULL; + + if(prev) + prev->next = cp; } static void ConnectionPoint_Destroy(ConnectionPoint *This) @@ -238,18 +242,15 @@ static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPo REFIID riid, IConnectionPoint **ppCP) { HTMLDocument *This = CONPTCONT_THIS(iface); + ConnectionPoint *iter; + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppCP); *ppCP = NULL; - if(IsEqualGUID(&DIID_HTMLDocumentEvents, riid)) { - TRACE("(%p)->(DIID_HTMLDocumentEvents %p)\n", This, ppCP); - *ppCP = CONPOINT(&This->cp_htmldocevents); - }else if(IsEqualGUID(&DIID_HTMLDocumentEvents2, riid)) { - TRACE("(%p)->(DIID_HTMLDocumentEvents2 %p)\n", This, ppCP); - *ppCP = CONPOINT(&This->cp_htmldocevents2); - }else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) { - TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppCP); - *ppCP = CONPOINT(&This->cp_propnotif); + for(iter = &This->cp_propnotif; iter; iter = iter->next) { + if(IsEqualGUID(&iter->iid, riid)) + *ppCP = CONPOINT(iter); } if(*ppCP) { @@ -257,7 +258,7 @@ static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPo return S_OK; } - FIXME("(%p)->(%s %p) unsupported riid\n", This, debugstr_guid(riid), ppCP); + FIXME("unsupported riid %s\n", debugstr_guid(riid)); return CONNECT_E_NOCONNECTION; } @@ -274,15 +275,14 @@ static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { void HTMLDocument_ConnectionPoints_Init(HTMLDocument *This) { This->lpConnectionPointContainerVtbl = &ConnectionPointContainerVtbl; - - ConnectionPoint_Init(This, &IID_IPropertyNotifySink, &This->cp_propnotif); - ConnectionPoint_Init(This, &DIID_HTMLDocumentEvents, &This->cp_htmldocevents); - ConnectionPoint_Init(This, &DIID_HTMLDocumentEvents2, &This->cp_htmldocevents2); } void HTMLDocument_ConnectionPoints_Destroy(HTMLDocument *This) { - ConnectionPoint_Destroy(&This->cp_propnotif); - ConnectionPoint_Destroy(&This->cp_htmldocevents); - ConnectionPoint_Destroy(&This->cp_htmldocevents2); + ConnectionPoint *iter = &This->cp_propnotif; + + while(iter) { + ConnectionPoint_Destroy(iter); + iter = iter->next; + } } diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index a606dace389..649a84995e3 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -1143,6 +1143,11 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject) HTMLDocument_Hlink_Init(ret); HTMLDocument_ConnectionPoints_Init(ret); + ConnectionPoint_Init(&ret->cp_propnotif, ret, &IID_IPropertyNotifySink, NULL); + ConnectionPoint_Init(&ret->cp_htmldocevents, ret, &DIID_HTMLDocumentEvents, &ret->cp_propnotif); + ConnectionPoint_Init(&ret->cp_htmldocevents2, ret, &DIID_HTMLDocumentEvents2, + &ret->cp_htmldocevents); + ret->nscontainer = NSContainer_Create(ret, NULL); ret->window = HTMLWindow_Create(ret); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index b343697b6ac..40bf08f610f 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -84,6 +84,8 @@ struct ConnectionPoint { DWORD sinks_size; IID iid; + + ConnectionPoint *next; }; struct HTMLDocument { @@ -340,6 +342,8 @@ void HTMLDocument_ConnectionPoints_Init(HTMLDocument*); void HTMLDocument_ConnectionPoints_Destroy(HTMLDocument*); +void ConnectionPoint_Init(ConnectionPoint*,HTMLDocument*,REFIID,ConnectionPoint*); + NSContainer *NSContainer_Create(HTMLDocument*,NSContainer*); void NSContainer_Release(NSContainer*);