ChangeSet ID: 21476 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/28 05:04:19
Modified files: dlls/ole32 : compobj_private.h defaulthandler.c oleobj.c
Log message: Robert Shearman rob@codeweavers.com Delegate advises to the remote object to enable the client to receive data change notifications.
Patch: http://cvs.winehq.org/patch.py?id=21476
Old revision New revision Changes Path 1.59 1.60 +4 -0 wine/dlls/ole32/compobj_private.h 1.37 1.38 +20 -1 wine/dlls/ole32/defaulthandler.c 1.27 1.28 +32 -1 wine/dlls/ole32/oleobj.c
Index: wine/dlls/ole32/compobj_private.h diff -u -p wine/dlls/ole32/compobj_private.h:1.59 wine/dlls/ole32/compobj_private.h:1.60 --- wine/dlls/ole32/compobj_private.h:1.59 28 Nov 2005 11: 4:19 -0000 +++ wine/dlls/ole32/compobj_private.h 28 Nov 2005 11: 4:19 -0000 @@ -263,4 +263,8 @@ extern HINSTANCE OLE32_hInstance; /* FIX
#define CHARS_IN_GUID 39 /* including NULL */
+/* Exported non-interface Data Advise Holder functions */ +HRESULT DataAdviseHolder_OnConnect(IDataAdviseHolder *iface, IDataObject *pDelegate); +void DataAdviseHolder_OnDisconnect(IDataAdviseHolder *iface); + #endif /* __WINE_OLE_COMPOBJ_H */ Index: wine/dlls/ole32/defaulthandler.c diff -u -p wine/dlls/ole32/defaulthandler.c:1.37 wine/dlls/ole32/defaulthandler.c:1.38 --- wine/dlls/ole32/defaulthandler.c:1.37 28 Nov 2005 11: 4:19 -0000 +++ wine/dlls/ole32/defaulthandler.c 28 Nov 2005 11: 4:19 -0000 @@ -55,8 +55,11 @@ #include "winbase.h" #include "winuser.h" #include "winerror.h" -#include "wine/unicode.h" #include "ole2.h" + +#include "compobj_private.h" + +#include "wine/unicode.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole); @@ -108,6 +111,8 @@ struct DefaultHandler IOleObject *pOleDelegate; /* IPersistStorage delegate */ IPersistStorage *pPSDelegate; + /* IDataObject delegate */ + IDataObject *pDataDelegate;
/* connection cookie for the advise on the delegate OLE object */ DWORD dwAdvConn; @@ -411,6 +416,12 @@ static void WINAPI DefaultHandler_Stop(D
/* FIXME: call IOleCache_OnStop */
+ DataAdviseHolder_OnDisconnect(This->dataAdviseHolder); + if (This->pDataDelegate) + { + IDataObject_Release(This->pDataDelegate); + This->pDataDelegate = NULL; + } if (This->pPSDelegate) { IPersistStorage_Release(This->pPSDelegate); @@ -1284,6 +1295,13 @@ static HRESULT WINAPI DefaultHandler_Run * - IOleCache_OnRun */
+ if (SUCCEEDED(hr)) + hr = IOleObject_QueryInterface(This->pOleDelegate, &IID_IDataObject, + (void **)&This->pDataDelegate); + + if (SUCCEEDED(hr) && This->dataAdviseHolder) + hr = DataAdviseHolder_OnConnect(This->dataAdviseHolder, This->pDataDelegate); + if (FAILED(hr)) DefaultHandler_Stop(This);
@@ -1558,6 +1576,7 @@ static DefaultHandler* DefaultHandler_Co This->containerObj = NULL; This->pOleDelegate = NULL; This->pPSDelegate = NULL; + This->pDataDelegate = NULL;
This->dwAdvConn = 0;
Index: wine/dlls/ole32/oleobj.c diff -u -p wine/dlls/ole32/oleobj.c:1.27 wine/dlls/ole32/oleobj.c:1.28 --- wine/dlls/ole32/oleobj.c:1.27 28 Nov 2005 11: 4:19 -0000 +++ wine/dlls/ole32/oleobj.c 28 Nov 2005 11: 4:19 -0000 @@ -351,6 +351,7 @@ typedef struct DataAdviseConnection { IAdviseSink *sink; FORMATETC fmat; DWORD advf; + DWORD remote_connection; } DataAdviseConnection;
typedef struct DataAdviseHolder @@ -362,6 +363,9 @@ typedef struct DataAdviseHolder DataAdviseConnection* Connections; } DataAdviseHolder;
+/* this connection has also has been advised to the delegate data object */ +#define WINE_ADVF_REMOTE 0x80000000 + /****************************************************************************** * DataAdviseHolder_Destructor */ @@ -520,7 +524,7 @@ static HRESULT WINAPI DataAdviseHolder_A */ This->Connections[index].sink = pAdvise; memcpy(&(This->Connections[index].fmat), pFetc, sizeof(FORMATETC)); - This->Connections[index].advf = advf; + This->Connections[index].advf = advf & ~WINE_ADVF_REMOTE;
if (This->Connections[index].sink != NULL) { IAdviseSink_AddRef(This->Connections[index].sink); @@ -636,6 +640,33 @@ static const IDataAdviseHolderVtbl DataA DataAdviseHolder_SendOnDataChange };
+HRESULT DataAdviseHolder_OnConnect(IDataAdviseHolder *iface, IDataObject *pDelegate) +{ + DataAdviseHolder *This = (DataAdviseHolder *)iface; + DWORD index; + HRESULT hr = S_OK; + + for(index = 0; index < This->maxCons; index++) + { + if(This->Connections[index].sink != NULL) + { + hr = IDataObject_DAdvise(pDelegate, &This->Connections[index].fmat, + This->Connections[index].advf, + This->Connections[index].sink, + &This->Connections[index].remote_connection); + if (FAILED(hr)) break; + This->Connections[index].advf |= WINE_ADVF_REMOTE; + } + } + /* FIXME: store pDelegate somewhere */ + return hr; +} + +void DataAdviseHolder_OnDisconnect(IDataAdviseHolder *iface) +{ + /* FIXME: Unadvise all remote interfaces */ +} + /****************************************************************************** * DataAdviseHolder_Constructor */