From b241d5170828d58b1eddd32c3b45fd6a07184768 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 12 Sep 2005 10:10:04 +0000 Subject: [PATCH] Make IConnectionPointContainer interface heap based. --- dlls/shdocvw/events.c | 74 ++++++++++++++++++--------------------- dlls/shdocvw/shdocvw.h | 48 ++++++++++--------------- dlls/shdocvw/webbrowser.c | 5 +-- 3 files changed, 57 insertions(+), 70 deletions(-) diff --git a/dlls/shdocvw/events.c b/dlls/shdocvw/events.c index 7dd26561cb8..2fb6dc2e107 100644 --- a/dlls/shdocvw/events.c +++ b/dlls/shdocvw/events.c @@ -1,5 +1,5 @@ /* - * Implementation of event-related interfaces for IE Web Browser control: + * Implementation of event-related interfaces for WebBrowser control: * * - IConnectionPointContainer * - IConnectionPoint @@ -36,46 +36,41 @@ static const GUID IID_INotifyDBEvents = * Implement the IConnectionPointContainer interface */ -static HRESULT WINAPI WBCPC_QueryInterface(LPCONNECTIONPOINTCONTAINER iface, - REFIID riid, LPVOID *ppobj) -{ - FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); +#define CONPTCONT_THIS(iface) DEFINE_THIS(WebBrowser, ConnectionPointContainer, iface) - if (ppobj == NULL) return E_POINTER; - - return E_NOINTERFACE; +static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, + REFIID riid, LPVOID *ppobj) +{ + WebBrowser *This = CONPTCONT_THIS(iface); + return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj); } -static ULONG WINAPI WBCPC_AddRef(LPCONNECTIONPOINTCONTAINER iface) +static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) { - SHDOCVW_LockModule(); - - return 2; /* non-heap based object */ + WebBrowser *This = CONPTCONT_THIS(iface); + return IWebBrowser_AddRef(WEBBROWSER(This)); } -static ULONG WINAPI WBCPC_Release(LPCONNECTIONPOINTCONTAINER iface) +static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) { - SHDOCVW_UnlockModule(); - - return 1; /* non-heap based object */ + WebBrowser *This = CONPTCONT_THIS(iface); + return IWebBrowser_Release(WEBBROWSER(This)); } -/* Get a list of connection points inside this container. */ -static HRESULT WINAPI WBCPC_EnumConnectionPoints(LPCONNECTIONPOINTCONTAINER iface, - LPENUMCONNECTIONPOINTS *ppEnum) +static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, + LPENUMCONNECTIONPOINTS *ppEnum) { - FIXME("stub: IEnumConnectionPoints = %p\n", *ppEnum); - return S_OK; + WebBrowser *This = CONPTCONT_THIS(iface); + FIXME("(%p)->(%p)\n", This, ppEnum); + return E_NOTIMPL; } -/* Retrieve the connection point in this container associated with the - * riid interface. When events occur in the control, the control can - * call backwards into its embedding site, through these interfaces. - */ -static HRESULT WINAPI WBCPC_FindConnectionPoint(LPCONNECTIONPOINTCONTAINER iface, - REFIID riid, LPCONNECTIONPOINT *ppCP) +static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, + REFIID riid, LPCONNECTIONPOINT *ppCP) { - TRACE(": IID = %s, IConnectionPoint = %p\n", debugstr_guid(riid), *ppCP); + WebBrowser *This = CONPTCONT_THIS(iface); + + FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppCP); /* For now, return the same IConnectionPoint object for both * event interface requests. @@ -98,21 +93,17 @@ static HRESULT WINAPI WBCPC_FindConnectionPoint(LPCONNECTIONPOINTCONTAINER iface return E_FAIL; } -/********************************************************************** - * IConnectionPointContainer virtual function table for IE Web Browser component - */ +#undef CONPTCONT_THIS -static const IConnectionPointContainerVtbl WBCPC_Vtbl = +static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { - WBCPC_QueryInterface, - WBCPC_AddRef, - WBCPC_Release, - WBCPC_EnumConnectionPoints, - WBCPC_FindConnectionPoint + ConnectionPointContainer_QueryInterface, + ConnectionPointContainer_AddRef, + ConnectionPointContainer_Release, + ConnectionPointContainer_EnumConnectionPoints, + ConnectionPointContainer_FindConnectionPoint }; -IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer = {&WBCPC_Vtbl}; - /********************************************************************** * Implement the IConnectionPoint interface @@ -207,3 +198,8 @@ static const IConnectionPointVtbl WBCP_Vtbl = }; static IConnectionPointImpl SHDOCVW_ConnectionPoint = {&WBCP_Vtbl}; + +void WebBrowser_Events_Init(WebBrowser *This) +{ + This->lpConnectionPointContainerVtbl = &ConnectionPointContainerVtbl; +} diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index 3ce7768c6f6..42dac55fa5c 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -53,47 +53,37 @@ extern IClassFactoryImpl SHDOCVW_ClassFactory; * WebBrowser declaration for SHDOCVW.DLL */ typedef struct { - const IWebBrowserVtbl *lpWebBrowserVtbl; - const IOleObjectVtbl *lpOleObjectVtbl; - const IOleInPlaceObjectVtbl *lpOleInPlaceObjectVtbl; - const IOleControlVtbl *lpOleControlVtbl; - const IPersistStorageVtbl *lpPersistStorageVtbl; - const IPersistStreamInitVtbl *lpPersistStreamInitVtbl; - const IProvideClassInfo2Vtbl *lpProvideClassInfoVtbl; - const IQuickActivateVtbl *lpQuickActivateVtbl; + const IWebBrowserVtbl *lpWebBrowserVtbl; + const IOleObjectVtbl *lpOleObjectVtbl; + const IOleInPlaceObjectVtbl *lpOleInPlaceObjectVtbl; + const IOleControlVtbl *lpOleControlVtbl; + const IPersistStorageVtbl *lpPersistStorageVtbl; + const IPersistStreamInitVtbl *lpPersistStreamInitVtbl; + const IProvideClassInfo2Vtbl *lpProvideClassInfoVtbl; + const IQuickActivateVtbl *lpQuickActivateVtbl; + const IConnectionPointContainerVtbl *lpConnectionPointContainerVtbl; LONG ref; } WebBrowser; -#define WEBBROWSER(x) ((IWebBrowser*) &(x)->lpWebBrowserVtbl) -#define OLEOBJ(x) ((IOleObject*) &(x)->lpOleObjectVtbl) -#define INPLACEOBJ(x) ((IOleInPlaceObject*) &(x)->lpOleInPlaceObjectVtbl) -#define CONTROL(x) ((IOleControl*) &(x)->lpOleControlVtbl) -#define PERSTORAGE(x) ((IPersistStorage*) &(x)->lpPersistStorageVtbl) -#define PERSTRINIT(x) ((IPersistStreamInit*) &(x)->lpPersistStreamInitVtbl) -#define CLASSINFO(x) ((IProvideClassInfo2*) &(x)->lpProvideClassInfoVtbl) -#define QUICKACT(x) ((IQuickActivate*) &(x)->lpQuickActivateVtbl) +#define WEBBROWSER(x) ((IWebBrowser*) &(x)->lpWebBrowserVtbl) +#define OLEOBJ(x) ((IOleObject*) &(x)->lpOleObjectVtbl) +#define INPLACEOBJ(x) ((IOleInPlaceObject*) &(x)->lpOleInPlaceObjectVtbl) +#define CONTROL(x) ((IOleControl*) &(x)->lpOleControlVtbl) +#define PERSTORAGE(x) ((IPersistStorage*) &(x)->lpPersistStorageVtbl) +#define PERSTRINIT(x) ((IPersistStreamInit*) &(x)->lpPersistStreamInitVtbl) +#define CLASSINFO(x) ((IProvideClassInfo2*) &(x)->lpProvideClassInfoVtbl) +#define QUICKACT(x) ((IQuickActivate*) &(x)->lpQuickActivateVtbl) +#define CONPTCONT(x) ((IConnectionPointContainer*) &(x)->lpConnectionPointContainerVtbl) void WebBrowser_OleObject_Init(WebBrowser*); void WebBrowser_Persist_Init(WebBrowser*); void WebBrowser_ClassInfo_Init(WebBrowser*); void WebBrowser_Misc_Init(WebBrowser*); +void WebBrowser_Events_Init(WebBrowser*); HRESULT WebBrowser_Create(IUnknown*,REFIID,void**); -/********************************************************************** - * IConnectionPointContainer declaration for SHDOCVW.DLL - */ -typedef struct -{ - /* IUnknown fields */ - const IConnectionPointContainerVtbl *lpVtbl; - LONG ref; -} IConnectionPointContainerImpl; - -extern IConnectionPointContainerImpl SHDOCVW_ConnectionPointContainer; - - /********************************************************************** * IConnectionPoint declaration for SHDOCVW.DLL */ diff --git a/dlls/shdocvw/webbrowser.c b/dlls/shdocvw/webbrowser.c index ba40cfa409f..276f57527e8 100644 --- a/dlls/shdocvw/webbrowser.c +++ b/dlls/shdocvw/webbrowser.c @@ -78,8 +78,8 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser *iface, REFIID riid, TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv); *ppv = QUICKACT(This); }else if(IsEqualGUID (&IID_IConnectionPointContainer, riid)) { - FIXME("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv); - *ppv = &SHDOCVW_ConnectionPointContainer; + TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv); + *ppv = CONPTCONT(This); } if(*ppv) { @@ -388,6 +388,7 @@ HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv) WebBrowser_Persist_Init(ret); WebBrowser_ClassInfo_Init(ret); WebBrowser_Misc_Init(ret); + WebBrowser_Events_Init(ret); hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv); if(SUCCEEDED(hres)) {