diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c index 1680f1cff82..a22b319fe71 100644 --- a/dlls/shdocvw/dochost.c +++ b/dlls/shdocvw/dochost.c @@ -494,13 +494,15 @@ void DocHost_Init(DocHost *This, IDispatch *disp) DocHost_ClientSite_Init(This); DocHost_Frame_Init(This); - DocHost_Events_Init(This); + + ConnectionPointContainer_Init(&This->cps, (IUnknown*)disp); } void DocHost_Release(DocHost *This) { DocHost_ClientSite_Release(This); - DocHost_Events_Release(This); + + ConnectionPointContainer_Destroy(&This->cps); SysFreeString(This->url); } diff --git a/dlls/shdocvw/events.c b/dlls/shdocvw/events.c index 194002bb07f..3f6537571f8 100644 --- a/dlls/shdocvw/events.c +++ b/dlls/shdocvw/events.c @@ -5,6 +5,7 @@ * - IConnectionPoint * * Copyright 2001 John R. Sheets (for CodeWeavers) + * Copyright 2006 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,7 +31,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); struct ConnectionPoint { const IConnectionPointVtbl *lpConnectionPointVtbl; - DocHost *doc_host; IConnectionPointContainer *container; IDispatch **sinks; @@ -45,31 +45,31 @@ struct ConnectionPoint { * Implement the IConnectionPointContainer interface */ -#define CONPTCONT_THIS(iface) DEFINE_THIS(WebBrowser, ConnectionPointContainer, iface) +#define CONPTCONT_THIS(iface) DEFINE_THIS(ConnectionPointContainer, ConnectionPointContainer, iface) static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, - REFIID riid, LPVOID *ppobj) + REFIID riid, LPVOID *ppv) { - WebBrowser *This = CONPTCONT_THIS(iface); - return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj); + ConnectionPointContainer *This = CONPTCONT_THIS(iface); + return IUnknown_QueryInterface(This->impl, riid, ppv); } static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) { - WebBrowser *This = CONPTCONT_THIS(iface); - return IWebBrowser_AddRef(WEBBROWSER(This)); + ConnectionPointContainer *This = CONPTCONT_THIS(iface); + return IUnknown_AddRef(This->impl); } static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) { - WebBrowser *This = CONPTCONT_THIS(iface); - return IWebBrowser_Release(WEBBROWSER(This)); + ConnectionPointContainer *This = CONPTCONT_THIS(iface); + return IUnknown_Release(This->impl); } static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, LPENUMCONNECTIONPOINTS *ppEnum) { - WebBrowser *This = CONPTCONT_THIS(iface); + ConnectionPointContainer *This = CONPTCONT_THIS(iface); FIXME("(%p)->(%p)\n", This, ppEnum); return E_NOTIMPL; } @@ -77,7 +77,7 @@ static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionP static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, REFIID riid, LPCONNECTIONPOINT *ppCP) { - WebBrowser *This = CONPTCONT_THIS(iface); + ConnectionPointContainer *This = CONPTCONT_THIS(iface); if(!ppCP) { WARN("ppCP == NULL\n"); @@ -88,13 +88,13 @@ static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPo if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid)) { TRACE("(%p)->(DIID_DWebBrowserEvents2 %p)\n", This, ppCP); - *ppCP = CONPOINT(This->doc_host.cps.wbe2); + *ppCP = CONPOINT(This->wbe2); }else if(IsEqualGUID(&DIID_DWebBrowserEvents, riid)) { TRACE("(%p)->(DIID_DWebBrowserEvents %p)\n", This, ppCP); - *ppCP = CONPOINT(This->doc_host.cps.wbe); + *ppCP = CONPOINT(This->wbe); }else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) { TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppCP); - *ppCP = CONPOINT(This->doc_host.cps.pns); + *ppCP = CONPOINT(This->pns); } if(*ppCP) { @@ -140,7 +140,7 @@ static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, } if(*ppv) { - IOleClientSite_AddRef(CLIENTSITE(This->doc_host)); + IConnectionPointContainer_AddRef(This->container); return S_OK; } @@ -151,13 +151,13 @@ static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface) { ConnectionPoint *This = CONPOINT_THIS(iface); - return IOleClientSite_AddRef(CLIENTSITE(This->doc_host)); + return IConnectionPointContainer_AddRef(This->container); } static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface) { ConnectionPoint *This = CONPOINT_THIS(iface); - return IOleClientSite_Release(CLIENTSITE(This->doc_host)); + return IConnectionPointContainer_Release(This->container); } static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *pIID) @@ -268,16 +268,16 @@ void call_sink(ConnectionPoint *This, DISPID dispid, DISPPARAMS *dispparams) } } -static void ConnectionPoint_Create(DocHost *doc_host, REFIID riid, ConnectionPoint **cp) +static void ConnectionPoint_Create(REFIID riid, ConnectionPoint **cp, + IConnectionPointContainer *container) { ConnectionPoint *ret = shdocvw_alloc(sizeof(ConnectionPoint)); ret->lpConnectionPointVtbl = &ConnectionPointVtbl; - ret->doc_host = doc_host; ret->sinks = NULL; ret->sinks_size = 0; - ret->container = NULL; + ret->container = container; memcpy(&ret->iid, riid, sizeof(IID)); @@ -297,25 +297,20 @@ static void ConnectionPoint_Destroy(ConnectionPoint *This) shdocvw_free(This); } -void DocHost_Events_Init(DocHost *This) -{ - ConnectionPoint_Create(This, &DIID_DWebBrowserEvents2, &This->cps.wbe2); - ConnectionPoint_Create(This, &DIID_DWebBrowserEvents, &This->cps.wbe); - ConnectionPoint_Create(This, &IID_IPropertyNotifySink, &This->cps.pns); -} - -void DocHost_Events_Release(DocHost *This) -{ - ConnectionPoint_Destroy(This->cps.wbe2); - ConnectionPoint_Destroy(This->cps.wbe); - ConnectionPoint_Destroy(This->cps.pns); -} - -void WebBrowser_Events_Init(WebBrowser *This) +void ConnectionPointContainer_Init(ConnectionPointContainer *This, IUnknown *impl) { This->lpConnectionPointContainerVtbl = &ConnectionPointContainerVtbl; - This->doc_host.cps.wbe2->container = CONPTCONT(This); - This->doc_host.cps.wbe->container = CONPTCONT(This); - This->doc_host.cps.pns->container = CONPTCONT(This); + ConnectionPoint_Create(&DIID_DWebBrowserEvents2, &This->wbe2, CONPTCONT(This)); + ConnectionPoint_Create(&DIID_DWebBrowserEvents, &This->wbe, CONPTCONT(This)); + ConnectionPoint_Create(&IID_IPropertyNotifySink, &This->pns, CONPTCONT(This)); + + This->impl = impl; +} + +void ConnectionPointContainer_Destroy(ConnectionPointContainer *This) +{ + ConnectionPoint_Destroy(This->wbe2); + ConnectionPoint_Destroy(This->wbe); + ConnectionPoint_Destroy(This->pns); } diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index db7206acea4..2cad496e526 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -52,9 +52,13 @@ extern HRESULT SHDOCVW_GetShellInstanceObjectClassObject(REFCLSID rclsid, typedef struct ConnectionPoint ConnectionPoint; typedef struct { + const IConnectionPointContainerVtbl *lpConnectionPointContainerVtbl; + ConnectionPoint *wbe2; ConnectionPoint *wbe; ConnectionPoint *pns; + + IUnknown *impl; } ConnectionPointContainer; typedef struct { @@ -93,7 +97,6 @@ typedef struct { const IPersistStorageVtbl *lpPersistStorageVtbl; const IPersistStreamInitVtbl *lpPersistStreamInitVtbl; const IProvideClassInfo2Vtbl *lpProvideClassInfoVtbl; - const IConnectionPointContainerVtbl *lpConnectionPointContainerVtbl; const IViewObject2Vtbl *lpViewObjectVtbl; const IOleInPlaceActiveObjectVtbl *lpOleInPlaceActiveObjectVtbl; const IOleCommandTargetVtbl *lpWBOleCommandTargetVtbl; @@ -166,19 +169,19 @@ void WebBrowser_OleObject_Init(WebBrowser*); void WebBrowser_ViewObject_Init(WebBrowser*); void WebBrowser_Persist_Init(WebBrowser*); void WebBrowser_ClassInfo_Init(WebBrowser*); -void WebBrowser_Events_Init(WebBrowser*); void WebBrowser_HlinkFrame_Init(WebBrowser*); void WebBrowser_OleObject_Destroy(WebBrowser*); void DocHost_Init(DocHost*,IDispatch*); void DocHost_ClientSite_Init(DocHost*); -void DocHost_Events_Init(DocHost*); void DocHost_Frame_Init(DocHost*); void DocHost_Release(DocHost*); void DocHost_ClientSite_Release(DocHost*); -void DocHost_Events_Release(DocHost*); + +void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*); +void ConnectionPointContainer_Destroy(ConnectionPointContainer*); HRESULT WebBrowser_Create(IUnknown*,REFIID,void**); diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c index b021d1b4d8f..ca17166770a 100644 --- a/dlls/shdocvw/webbrowser.c +++ b/dlls/shdocvw/webbrowser.c @@ -83,7 +83,7 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid *ppv = CLASSINFO(This); }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) { TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv); - *ppv = CONPTCONT(This); + *ppv = CONPTCONT(&This->doc_host.cps); }else if(IsEqualGUID(&IID_IViewObject, riid)) { TRACE("(%p)->(IID_IViewObject %p)\n", This, ppv); *ppv = VIEWOBJ(This); @@ -942,7 +942,6 @@ HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv) WebBrowser_ViewObject_Init(ret); WebBrowser_Persist_Init(ret); WebBrowser_ClassInfo_Init(ret); - WebBrowser_Events_Init(ret); WebBrowser_HlinkFrame_Init(ret); hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);