Huw Davies : ole32: Reimplement SendOnDataChange using the connection enumerator.
Alexandre Julliard
julliard at winehq.org
Wed Jan 5 12:40:28 CST 2011
Module: wine
Branch: master
Commit: 6ac2cb3ddcb3021cc737a6c9b4dd16128d187038
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6ac2cb3ddcb3021cc737a6c9b4dd16128d187038
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Jan 5 10:13:38 2011 +0000
ole32: Reimplement SendOnDataChange using the connection enumerator.
---
dlls/ole32/oleobj.c | 62 +++++++++++++++++++++++++++-----------------------
1 files changed, 33 insertions(+), 29 deletions(-)
diff --git a/dlls/ole32/oleobj.c b/dlls/ole32/oleobj.c
index df2898d..2495f9a 100644
--- a/dlls/ole32/oleobj.c
+++ b/dlls/ole32/oleobj.c
@@ -24,6 +24,8 @@
#include <string.h>
#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
#include "windef.h"
#include "winbase.h"
@@ -804,41 +806,43 @@ static HRESULT WINAPI DataAdviseHolder_EnumAdvise(IDataAdviseHolder *iface,
* DataAdviseHolder_SendOnDataChange
*/
static HRESULT WINAPI DataAdviseHolder_SendOnDataChange(IDataAdviseHolder *iface,
- IDataObject *pDataObject,
+ IDataObject *data_obj,
DWORD dwReserved, DWORD advf)
{
- DataAdviseHolder *This = impl_from_IDataAdviseHolder(iface);
- DWORD index;
- STGMEDIUM stg;
- HRESULT res;
+ IEnumSTATDATA *pEnum;
+ HRESULT hr;
- TRACE("(%p)->(%p,%08x,%08x)\n", This, pDataObject, dwReserved, advf);
+ TRACE("(%p)->(%p, %08x, %08x)\n", iface, data_obj, dwReserved, advf);
- for(index = 0; index < This->maxCons; index++)
- {
- if(This->connections[index].pAdvSink != NULL)
+ hr = IDataAdviseHolder_EnumAdvise(iface, &pEnum);
+ if (SUCCEEDED(hr))
{
- memset(&stg, 0, sizeof(stg));
- if(!(This->connections[index].advf & ADVF_NODATA))
- {
- TRACE("Calling IDataObject_GetData\n");
- res = IDataObject_GetData(pDataObject,
- &(This->connections[index].formatetc),
- &stg);
- TRACE("returns %08x\n", res);
- }
- TRACE("Calling IAdviseSink_OnDataChange\n");
- IAdviseSink_OnDataChange(This->connections[index].pAdvSink,
- &(This->connections[index].formatetc),
- &stg);
- TRACE("Done IAdviseSink_OnDataChange\n");
- if(This->connections[index].advf & ADVF_ONLYONCE) {
- TRACE("Removing connection\n");
- DataAdviseHolder_Unadvise(iface, This->connections[index].dwConnection);
- }
+ STATDATA statdata;
+ while (IEnumSTATDATA_Next(pEnum, 1, &statdata, NULL) == S_OK)
+ {
+ STGMEDIUM stg;
+ stg.tymed = TYMED_NULL;
+ stg.u.pstg = NULL;
+ stg.pUnkForRelease = NULL;
+
+ if(!(statdata.advf & ADVF_NODATA))
+ {
+ hr = IDataObject_GetData(data_obj, &statdata.formatetc, &stg);
+ }
+
+ IAdviseSink_OnDataChange(statdata.pAdvSink, &statdata.formatetc, &stg);
+
+ if(statdata.advf & ADVF_ONLYONCE)
+ {
+ IDataAdviseHolder_Unadvise(iface, statdata.dwConnection);
+ }
+
+ release_statdata(&statdata);
+ }
+ IEnumSTATDATA_Release(pEnum);
}
- }
- return S_OK;
+
+ return S_OK;
}
/**************************************************************************
More information about the wine-cvs
mailing list