Huw Davies : ole32: Store the ole advise sinks in a STATDATA array.

Alexandre Julliard julliard at winehq.org
Wed Jan 5 12:40:28 CST 2011


Module: wine
Branch: master
Commit: 62cd56ce811e753b7b8c49ec996367b0a373a6c0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=62cd56ce811e753b7b8c49ec996367b0a373a6c0

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Jan  5 11:20:11 2011 +0000

ole32: Store the ole advise sinks in a STATDATA array.

---

 dlls/ole32/oleobj.c |  131 ++++++++++++++-------------------------------------
 1 files changed, 36 insertions(+), 95 deletions(-)

diff --git a/dlls/ole32/oleobj.c b/dlls/ole32/oleobj.c
index 2495f9a..6a84681 100644
--- a/dlls/ole32/oleobj.c
+++ b/dlls/ole32/oleobj.c
@@ -243,8 +243,8 @@ typedef struct
 
     LONG ref;
 
-    DWORD         maxSinks;
-    IAdviseSink** arrayOfSinks;
+    DWORD max_cons;
+    STATDATA *connections;
 } OleAdviseHolderImpl;
 
 static inline OleAdviseHolderImpl *impl_from_IOleAdviseHolder(IOleAdviseHolder *iface)
@@ -255,28 +255,19 @@ static inline OleAdviseHolderImpl *impl_from_IOleAdviseHolder(IOleAdviseHolder *
 /**************************************************************************
  *  OleAdviseHolderImpl_Destructor
  */
-static void OleAdviseHolderImpl_Destructor(OleAdviseHolderImpl* ptrToDestroy)
+static void OleAdviseHolderImpl_Destructor(OleAdviseHolderImpl *This)
 {
-  DWORD index;
-  TRACE("%p\n", ptrToDestroy);
+    DWORD index;
+    TRACE("%p\n", This);
 
-  for (index = 0; index < ptrToDestroy->maxSinks; index++)
-  {
-    if (ptrToDestroy->arrayOfSinks[index]!=0)
+    for (index = 0; index < This->max_cons; index++)
     {
-      IAdviseSink_Release(ptrToDestroy->arrayOfSinks[index]);
-      ptrToDestroy->arrayOfSinks[index] = NULL;
+        if (This->connections[index].pAdvSink != NULL)
+            release_statdata(This->connections + index);
     }
-  }
 
-  HeapFree(GetProcessHeap(),
-	   0,
-	   ptrToDestroy->arrayOfSinks);
-
-
-  HeapFree(GetProcessHeap(),
-	   0,
-	   ptrToDestroy);
+    HeapFree(GetProcessHeap(), 0, This->connections);
+    HeapFree(GetProcessHeap(), 0, This);
 }
 
 /**************************************************************************
@@ -344,6 +335,8 @@ static HRESULT WINAPI OleAdviseHolderImpl_Advise(IOleAdviseHolder *iface,
 {
   DWORD index;
   OleAdviseHolderImpl *This = impl_from_IOleAdviseHolder(iface);
+  STATDATA new_conn;
+  static const FORMATETC empty_fmtetc = {0, NULL, 0, -1, 0};
 
   TRACE("(%p)->(%p, %p)\n", This, pAdvise, pdwConnection);
 
@@ -352,38 +345,27 @@ static HRESULT WINAPI OleAdviseHolderImpl_Advise(IOleAdviseHolder *iface,
 
   *pdwConnection = 0;
 
-  for (index = 0; index < This->maxSinks; index++)
+  for (index = 0; index < This->max_cons; index++)
   {
-    if (This->arrayOfSinks[index]==NULL)
+    if (This->connections[index].pAdvSink == NULL)
       break;
   }
 
-  if (index == This->maxSinks)
+  if (index == This->max_cons)
   {
-    DWORD i;
-
-    This->maxSinks+=INITIAL_SINKS;
-
-    This->arrayOfSinks = HeapReAlloc(GetProcessHeap(),
-				     0,
-				     This->arrayOfSinks,
-				     This->maxSinks*sizeof(IAdviseSink*));
-
-    for (i=index;i < This->maxSinks; i++)
-      This->arrayOfSinks[i]=0;
+    This->max_cons += INITIAL_SINKS;
+    This->connections = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->connections,
+                                    This->max_cons * sizeof(*This->connections));
   }
 
-  This->arrayOfSinks[index] = pAdvise;
+  new_conn.pAdvSink = pAdvise;
+  new_conn.advf = 0;
+  new_conn.formatetc = empty_fmtetc;
+  new_conn.dwConnection = index + 1; /* 0 is not a valid cookie, so increment the index */
 
-  if (This->arrayOfSinks[index]!=NULL)
-    IAdviseSink_AddRef(This->arrayOfSinks[index]);
+  copy_statdata(This->connections + index, &new_conn);
 
-  /*
-   * Return the index as the cookie.
-   * Since 0 is not a valid cookie, we will increment by
-   * 1 the index in the table.
-   */
-  *pdwConnection = index+1;
+  *pdwConnection = new_conn.dwConnection;
 
   return S_OK;
 }
@@ -395,30 +377,17 @@ static HRESULT WINAPI OleAdviseHolderImpl_Unadvise(IOleAdviseHolder *iface,
                                                    DWORD dwConnection)
 {
   OleAdviseHolderImpl *This = impl_from_IOleAdviseHolder(iface);
+  DWORD index;
 
   TRACE("(%p)->(%u)\n", This, dwConnection);
 
-  /*
-   * So we don't return 0 as a cookie, the index was
-   * incremented by 1 in OleAdviseHolderImpl_Advise
-   * we have to compensate.
-   */
-  dwConnection--;
-
-  /*
-   * Check for invalid cookies.
-   */
-  if (dwConnection >= This->maxSinks)
-    return OLE_E_NOCONNECTION;
+  /* The connection number is 1 more than the index, see OleAdviseHolder_Advise */
+  index = dwConnection - 1;
 
-  if (This->arrayOfSinks[dwConnection] == NULL)
-    return OLE_E_NOCONNECTION;
+  if (index >= This->max_cons || This->connections[index].pAdvSink == NULL)
+     return OLE_E_NOCONNECTION;
 
-  /*
-   * Release the sink and mark the spot in the list as free.
-   */
-  IAdviseSink_Release(This->arrayOfSinks[dwConnection]);
-  This->arrayOfSinks[dwConnection] = NULL;
+  release_statdata(This->connections + index);
 
   return S_OK;
 }
@@ -426,40 +395,17 @@ static HRESULT WINAPI OleAdviseHolderImpl_Unadvise(IOleAdviseHolder *iface,
 /******************************************************************************
  * OleAdviseHolderImpl_EnumAdvise
  */
-static HRESULT WINAPI OleAdviseHolderImpl_EnumAdvise(IOleAdviseHolder *iface, IEnumSTATDATA **ppenumAdvise)
+static HRESULT WINAPI OleAdviseHolderImpl_EnumAdvise(IOleAdviseHolder *iface, IEnumSTATDATA **enum_advise)
 {
     OleAdviseHolderImpl *This = impl_from_IOleAdviseHolder(iface);
     IUnknown *unk;
-    DWORD i, count;
-    STATDATA *data;
-    static const FORMATETC empty_fmtetc = {0, NULL, 0, -1, 0};
     HRESULT hr;
 
-    TRACE("(%p)->(%p)\n", This, ppenumAdvise);
-
-    *ppenumAdvise = NULL;
-
-    /* Build an array of STATDATA structures */
-    data = HeapAlloc(GetProcessHeap(), 0, This->maxSinks * sizeof(*data));
-    if(!data) return E_OUTOFMEMORY;
-
-    for(i = 0, count = 0; i < This->maxSinks; i++)
-    {
-        if(This->arrayOfSinks[i])
-        {
-            data[count].formatetc = empty_fmtetc;
-            data[count].advf = 0;
-            data[count].pAdvSink = This->arrayOfSinks[i]; /* The constructor will take a ref. */
-            data[count].dwConnection = i;
-            count++;
-        }
-    }
+    TRACE("(%p)->(%p)\n", This, enum_advise);
 
     IOleAdviseHolder_QueryInterface(iface, &IID_IUnknown, (void**)&unk);
-    hr = EnumSTATDATA_Construct(unk, 0, count, data, ppenumAdvise);
+    hr = EnumSTATDATA_Construct(unk, 0, This->max_cons, This->connections, enum_advise);
     IUnknown_Release(unk);
-    HeapFree(GetProcessHeap(), 0, data);
-
     return hr;
 }
 
@@ -564,19 +510,14 @@ static const IOleAdviseHolderVtbl oahvt =
 static IOleAdviseHolder *OleAdviseHolderImpl_Constructor(void)
 {
   OleAdviseHolderImpl* lpoah;
-  DWORD                index;
 
   lpoah = HeapAlloc(GetProcessHeap(), 0, sizeof(OleAdviseHolderImpl));
 
   lpoah->IOleAdviseHolder_iface.lpVtbl = &oahvt;
   lpoah->ref = 1;
-  lpoah->maxSinks = INITIAL_SINKS;
-  lpoah->arrayOfSinks = HeapAlloc(GetProcessHeap(),
-				  0,
-				  lpoah->maxSinks * sizeof(IAdviseSink*));
-
-  for (index = 0; index < lpoah->maxSinks; index++)
-    lpoah->arrayOfSinks[index]=0;
+  lpoah->max_cons = INITIAL_SINKS;
+  lpoah->connections = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                 lpoah->max_cons * sizeof(*lpoah->connections));
 
   TRACE("returning %p\n",  &lpoah->IOleAdviseHolder_iface);
   return &lpoah->IOleAdviseHolder_iface;




More information about the wine-cvs mailing list