Jacek Caban : shdocvw: Move IConnectionPointContainer implementation to separated object.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 17 14:48:38 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 0b613f291ff836255723543b342cdaca97b4434f
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=0b613f291ff836255723543b342cdaca97b4434f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed May 17 18:26:30 2006 +0200

shdocvw: Move IConnectionPointContainer implementation to separated object.

---

 dlls/shdocvw/dochost.c    |    6 +++-
 dlls/shdocvw/events.c     |   67 +++++++++++++++++++++------------------------
 dlls/shdocvw/shdocvw.h    |   11 +++++--
 dlls/shdocvw/webbrowser.c |    3 +-
 4 files changed, 43 insertions(+), 44 deletions(-)

diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c
index 1680f1c..a22b319 100644
--- a/dlls/shdocvw/dochost.c
+++ b/dlls/shdocvw/dochost.c
@@ -494,13 +494,15 @@ void DocHost_Init(DocHost *This, IDispat
 
     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 194002b..3f65375 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 @@ #define CONPOINT(x)  ((IConnectionPoint*
  * 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 ConnectionPointCon
 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 ConnectionPointCon
 
     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_Qu
     }
 
     if(*ppv) {
-        IOleClientSite_AddRef(CLIENTSITE(This->doc_host));
+        IConnectionPointContainer_AddRef(This->container);
         return S_OK;
     }
 
@@ -151,13 +151,13 @@ static HRESULT WINAPI ConnectionPoint_Qu
 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, DI
     }
 }
 
-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(Conn
     shdocvw_free(This);
 }
 
-void DocHost_Events_Init(DocHost *This)
+void ConnectionPointContainer_Init(ConnectionPointContainer *This, IUnknown *impl)
 {
-    ConnectionPoint_Create(This, &DIID_DWebBrowserEvents2, &This->cps.wbe2);
-    ConnectionPoint_Create(This, &DIID_DWebBrowserEvents,  &This->cps.wbe);
-    ConnectionPoint_Create(This, &IID_IPropertyNotifySink, &This->cps.pns);
-}
+    This->lpConnectionPointContainerVtbl = &ConnectionPointContainerVtbl;
 
-void DocHost_Events_Release(DocHost *This)
-{
-    ConnectionPoint_Destroy(This->cps.wbe2);
-    ConnectionPoint_Destroy(This->cps.wbe);
-    ConnectionPoint_Destroy(This->cps.pns);
+    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 WebBrowser_Events_Init(WebBrowser *This)
+void ConnectionPointContainer_Destroy(ConnectionPointContainer *This)
 {
-    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_Destroy(This->wbe2);
+    ConnectionPoint_Destroy(This->wbe);
+    ConnectionPoint_Destroy(This->pns);
 }
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
index db7206a..2cad496 100644
--- a/dlls/shdocvw/shdocvw.h
+++ b/dlls/shdocvw/shdocvw.h
@@ -52,9 +52,13 @@ extern HRESULT SHDOCVW_GetShellInstanceO
 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(WebBrowse
 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 b021d1b..ca17166 100644
--- a/dlls/shdocvw/webbrowser.c
+++ b/dlls/shdocvw/webbrowser.c
@@ -83,7 +83,7 @@ static HRESULT WINAPI WebBrowser_QueryIn
         *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 *pOut
     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);




More information about the wine-cvs mailing list