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