wine/dlls/shdocvw events.c shdocvw.h

Alexandre Julliard julliard at wine.codeweavers.com
Fri Dec 2 04:30:19 CST 2005


ChangeSet ID:	21618
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/12/02 04:30:19

Modified files:
	dlls/shdocvw   : events.c shdocvw.h 

Log message:
	Jacek Caban <jacek at codeweavers.com>
	Added implementation of IConnectionPoint::Advise and Unadvise.

Patch: http://cvs.winehq.org/patch.py?id=21618

Old revision  New revision  Changes     Path
 1.18          1.19          +83 -14     wine/dlls/shdocvw/events.c
 1.37          1.38          +7 -3       wine/dlls/shdocvw/shdocvw.h

Index: wine/dlls/shdocvw/events.c
diff -u -p wine/dlls/shdocvw/events.c:1.18 wine/dlls/shdocvw/events.c:1.19
--- wine/dlls/shdocvw/events.c:1.18	2 Dec 2005 10:30:19 -0000
+++ wine/dlls/shdocvw/events.c	2 Dec 2005 10:30:19 -0000
@@ -27,13 +27,16 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
 
-typedef struct {
+struct ConnectionPoint {
     const IConnectionPointVtbl *lpConnectionPointVtbl;
 
     WebBrowser *webbrowser;
 
+    IDispatch **sinks;
+    DWORD sinks_size;
+
     IID iid;
-} ConnectionPoint;
+};
 
 #define CONPOINT(x)  ((IConnectionPoint*) &(x)->lpConnectionPointVtbl)
 
@@ -84,13 +87,13 @@ static HRESULT WINAPI ConnectionPointCon
 
     if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid)) {
         TRACE("(%p)->(DIID_DWebBrowserEvents2 %p)\n", This, ppCP);
-        *ppCP = This->cp_wbe2;
+        *ppCP = CONPOINT(This->cp_wbe2);
     }else if(IsEqualGUID(&DIID_DWebBrowserEvents, riid)) {
         TRACE("(%p)->(DIID_DWebBrowserEvents %p)\n", This, ppCP);
-        *ppCP = This->cp_wbe;
+        *ppCP = CONPOINT(This->cp_wbe);
     }else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
         TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppCP);
-        *ppCP = This->cp_pns;
+        *ppCP = CONPOINT(This->cp_pns);
     }
 
     if(*ppCP) {
@@ -181,15 +184,53 @@ static HRESULT WINAPI ConnectionPoint_Ad
                                              DWORD *pdwCookie)
 {
     ConnectionPoint *This = CONPOINT_THIS(iface);
-    FIXME("(%p)->(%p %p)\n", This, pUnkSink, pdwCookie);
-    return E_NOTIMPL;
+    IDispatch *disp;
+    DWORD i;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p %p)\n", This, pUnkSink, pdwCookie);
+
+    hres = IUnknown_QueryInterface(pUnkSink, &This->iid, (void**)&disp);
+    if(FAILED(hres)) {
+        hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatch, (void**)&disp);
+        if(FAILED(hres))
+            return CONNECT_E_CANNOTCONNECT;
+    }
+
+    if(This->sinks) {
+        for(i=0; i<This->sinks_size; i++) {
+            if(!This->sinks[i])
+                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] = disp;
+    *pdwCookie = i+1;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD dwCookie)
 {
     ConnectionPoint *This = CONPOINT_THIS(iface);
-    FIXME("(%p)->(%ld)\n", This, dwCookie);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%ld)\n", This, dwCookie);
+
+    if(!dwCookie || dwCookie > This->sinks_size || !This->sinks[dwCookie-1])
+        return CONNECT_E_NOCONNECTION;
+
+    IDispatch_Release(This->sinks[dwCookie-1]);
+    This->sinks[dwCookie-1] = NULL;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface,
@@ -214,15 +255,43 @@ static const IConnectionPointVtbl Connec
     ConnectionPoint_EnumConnections
 };
 
-static void ConnectionPoint_Create(WebBrowser *wb, REFIID riid, IConnectionPoint **cp)
+void call_sink(ConnectionPoint *This, DISPID dispid, DISPPARAMS *dispparams)
+{
+    DWORD i;
+
+    for(i=0; i<This->sinks_size; i++) {
+        if(This->sinks[i])
+            IDispatch_Invoke(This->sinks[i], dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
+                             DISPATCH_METHOD, dispparams, NULL, NULL, NULL);
+    }
+}
+
+static void ConnectionPoint_Create(WebBrowser *wb, REFIID riid, ConnectionPoint **cp)
 {
     ConnectionPoint *ret = HeapAlloc(GetProcessHeap(), 0, sizeof(ConnectionPoint));
 
     ret->lpConnectionPointVtbl = &ConnectionPointVtbl;
     ret->webbrowser = wb;
+
+    ret->sinks = NULL;
+    ret->sinks_size = 0;
+
     memcpy(&ret->iid, riid, sizeof(IID));
 
-    *cp = CONPOINT(ret);
+    *cp = ret;
+}
+
+static void ConnectionPoint_Destroy(ConnectionPoint *This)
+{
+    int i;
+
+    for(i=0; i<This->sinks_size; i++) {
+        if(This->sinks[i])
+            IDispatch_Release(This->sinks[i]);
+    }
+
+    HeapFree(GetProcessHeap(), 0, This->sinks);
+    HeapFree(GetProcessHeap(), 0, This);
 }
 
 void WebBrowser_Events_Init(WebBrowser *This)
@@ -236,7 +305,7 @@ void WebBrowser_Events_Init(WebBrowser *
 
 void WebBrowser_Events_Destroy(WebBrowser *This)
 {
-    HeapFree(GetProcessHeap(), 0, This->cp_wbe2);
-    HeapFree(GetProcessHeap(), 0, This->cp_wbe);
-    HeapFree(GetProcessHeap(), 0, This->cp_pns);
+    ConnectionPoint_Destroy(This->cp_wbe2);
+    ConnectionPoint_Destroy(This->cp_wbe);
+    ConnectionPoint_Destroy(This->cp_pns);
 }
Index: wine/dlls/shdocvw/shdocvw.h
diff -u -p wine/dlls/shdocvw/shdocvw.h:1.37 wine/dlls/shdocvw/shdocvw.h:1.38
--- wine/dlls/shdocvw/shdocvw.h:1.37	2 Dec 2005 10:30:19 -0000
+++ wine/dlls/shdocvw/shdocvw.h	2 Dec 2005 10:30:19 -0000
@@ -58,6 +58,9 @@ extern HRESULT SHDOCVW_GetShellInstanceO
 /**********************************************************************
  * WebBrowser declaration for SHDOCVW.DLL
  */
+
+typedef struct ConnectionPoint ConnectionPoint;
+
 typedef struct {
     /* Interfaces available via WebBrowser object */
 
@@ -109,9 +112,9 @@ typedef struct {
 
     /* Connection points */
 
-    IConnectionPoint *cp_wbe2;
-    IConnectionPoint *cp_wbe;
-    IConnectionPoint *cp_pns;
+    ConnectionPoint *cp_wbe2;
+    ConnectionPoint *cp_wbe;
+    ConnectionPoint *cp_pns;
 } WebBrowser;
 
 #define WEBBROWSER(x)   ((IWebBrowser*)                 &(x)->lpWebBrowser2Vtbl)
@@ -155,6 +158,7 @@ void WebBrowser_ClientSite_Destroy(WebBr
 HRESULT WebBrowser_Create(IUnknown*,REFIID,void**);
 
 void create_doc_view_hwnd(WebBrowser *This);
+void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*);
 
 #define WB_WM_NAVIGATE2 (WM_USER+100)
 



More information about the wine-cvs mailing list