Nikolay Sivov : ole32/composite: Cleanup enumerator methods.

Alexandre Julliard julliard at winehq.org
Thu Sep 30 16:04:42 CDT 2021


Module: wine
Branch: master
Commit: 966d74a1b4eba96a646f8c38647cbd2cc78bf4c9
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=966d74a1b4eba96a646f8c38647cbd2cc78bf4c9

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Sep 30 11:26:48 2021 +0300

ole32/composite: Cleanup enumerator methods.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ole32/compositemoniker.c | 137 ++++++++++++++++--------------------------
 1 file changed, 52 insertions(+), 85 deletions(-)

diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 652962e1a87..a94e4734f45 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -72,13 +72,13 @@ static inline CompositeMonikerImpl *impl_from_IMarshal(IMarshal *iface)
     return CONTAINING_RECORD(iface, CompositeMonikerImpl, IMarshal_iface);
 }
 
-/* EnumMoniker data structure */
-typedef struct EnumMonikerImpl{
+typedef struct EnumMonikerImpl
+{
     IEnumMoniker IEnumMoniker_iface;
     LONG ref;
-    IMoniker** tabMoniker; /* dynamic table containing the enumerated monikers */
-    ULONG      tabSize; /* size of tabMoniker */
-    ULONG      currentPos;  /* index pointer on the current moniker */
+    IMoniker **monikers;
+    unsigned int count;
+    unsigned int pos;
 } EnumMonikerImpl;
 
 static inline EnumMonikerImpl *impl_from_IEnumMoniker(IEnumMoniker *iface)
@@ -86,7 +86,7 @@ static inline EnumMonikerImpl *impl_from_IEnumMoniker(IEnumMoniker *iface)
     return CONTAINING_RECORD(iface, EnumMonikerImpl, IEnumMoniker_iface);
 }
 
-static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker,ULONG tabSize,ULONG currentPos,BOOL leftToRight,IEnumMoniker ** ppmk);
+static HRESULT create_enumerator(IMoniker **components, unsigned int count, BOOL forward, IEnumMoniker **ret);
 static HRESULT composite_get_rightmost(CompositeMonikerImpl *composite, IMoniker **left, IMoniker **rightmost);
 static HRESULT composite_get_leftmost(CompositeMonikerImpl *composite, IMoniker **leftmost);
 
@@ -492,21 +492,21 @@ static HRESULT composite_get_components_alloc(IMoniker *iface, unsigned int *cou
     return S_OK;
 }
 
-static HRESULT WINAPI CompositeMonikerImpl_Enum(IMoniker *iface, BOOL forward, IEnumMoniker **ppenumMoniker)
+static HRESULT WINAPI CompositeMonikerImpl_Enum(IMoniker *iface, BOOL forward, IEnumMoniker **ret_enum)
 {
     IMoniker **monikers;
     unsigned int count;
     HRESULT hr;
 
-    TRACE("%p, %d, %p\n", iface, forward, ppenumMoniker);
+    TRACE("%p, %d, %p\n", iface, forward, ret_enum);
 
-    if (!ppenumMoniker)
+    if (!ret_enum)
         return E_INVALIDARG;
 
     if (FAILED(hr = composite_get_components_alloc(iface, &count, &monikers)))
         return hr;
 
-    hr = EnumMonikerImpl_CreateEnumMoniker(monikers, count, 0, forward, ppenumMoniker);
+    hr = create_enumerator(monikers, count, forward, ret_enum);
     heap_free(monikers);
 
     return hr;
@@ -1280,36 +1280,30 @@ EnumMonikerImpl_AddRef(IEnumMoniker* iface)
 
 }
 
-/******************************************************************************
- *        EnumMonikerImpl_Release
- ******************************************************************************/
-static ULONG WINAPI
-EnumMonikerImpl_Release(IEnumMoniker* iface)
+static ULONG WINAPI EnumMonikerImpl_Release(IEnumMoniker *iface)
 {
-    EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
-    ULONG i;
-    ULONG ref;
-    TRACE("(%p)\n",This);
-
-    ref = InterlockedDecrement(&This->ref);
-
-    /* destroy the object if there are no more references to it */
-    if (ref == 0) {
+    EnumMonikerImpl *e = impl_from_IEnumMoniker(iface);
+    ULONG refcount = InterlockedDecrement(&e->ref);
+    unsigned int i;
 
-        for(i=0;i<This->tabSize;i++)
-            IMoniker_Release(This->tabMoniker[i]);
+    TRACE("%p, refcount %d.\n", iface, refcount);
 
-        HeapFree(GetProcessHeap(),0,This->tabMoniker);
-        HeapFree(GetProcessHeap(),0,This);
+    if (!refcount)
+    {
+        for (i = 0; i < e->count; ++i)
+            IMoniker_Release(e->monikers[i]);
+        heap_free(e->monikers);
+        heap_free(e);
     }
-    return ref;
+
+    return refcount;
 }
 
 static HRESULT WINAPI EnumMonikerImpl_Next(IEnumMoniker *iface, ULONG count,
         IMoniker **m, ULONG *fetched)
 {
-    EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
-    ULONG i;
+    EnumMonikerImpl *e = impl_from_IEnumMoniker(iface);
+    unsigned int i;
 
     TRACE("%p, %u, %p, %p.\n", iface, count, m, fetched);
 
@@ -1319,9 +1313,9 @@ static HRESULT WINAPI EnumMonikerImpl_Next(IEnumMoniker *iface, ULONG count,
     *m = NULL;
 
     /* retrieve the requested number of moniker from the current position */
-    for(i=0;((This->currentPos < This->tabSize) && (i < count));i++)
+    for (i = 0; (e->pos < e->count) && (i < count); ++i)
     {
-        m[i] = This->tabMoniker[This->currentPos++];
+        m[i] = e->monikers[e->pos++];
         IMoniker_AddRef(m[i]);
     }
 
@@ -1333,30 +1327,28 @@ static HRESULT WINAPI EnumMonikerImpl_Next(IEnumMoniker *iface, ULONG count,
 
 static HRESULT WINAPI EnumMonikerImpl_Skip(IEnumMoniker *iface, ULONG count)
 {
-    EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
+    EnumMonikerImpl *e = impl_from_IEnumMoniker(iface);
 
     TRACE("%p, %u.\n", iface, count);
 
     if (!count)
         return S_OK;
 
-    if ((This->currentPos + count) >= This->tabSize)
+    if ((e->pos + count) >= e->count)
         return S_FALSE;
 
-    This->currentPos += count;
+    e->pos += count;
 
     return S_OK;
 }
 
-/******************************************************************************
- *        EnumMonikerImpl_Reset
- ******************************************************************************/
-static HRESULT WINAPI
-EnumMonikerImpl_Reset(IEnumMoniker* iface)
+static HRESULT WINAPI EnumMonikerImpl_Reset(IEnumMoniker* iface)
 {
-    EnumMonikerImpl *This = impl_from_IEnumMoniker(iface);
+    EnumMonikerImpl *e = impl_from_IEnumMoniker(iface);
 
-    This->currentPos=0;
+    TRACE("%p.\n", iface);
+
+    e->pos = 0;
 
     return S_OK;
 }
@@ -1384,60 +1376,35 @@ static const IEnumMonikerVtbl VT_EnumMonikerImpl =
     EnumMonikerImpl_Clone
 };
 
-/******************************************************************************
- *        EnumMonikerImpl_CreateEnumMoniker
- ******************************************************************************/
-static HRESULT
-EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker, ULONG tabSize,
-               ULONG currentPos, BOOL leftToRight, IEnumMoniker ** ppmk)
+static HRESULT create_enumerator(IMoniker **components, unsigned int count, BOOL forward, IEnumMoniker **ret)
 {
-    EnumMonikerImpl* newEnumMoniker;
-    ULONG i;
-
-    if (currentPos > tabSize)
-        return E_INVALIDARG;
-
-    newEnumMoniker = HeapAlloc(GetProcessHeap(), 0, sizeof(EnumMonikerImpl));
-
-    if (newEnumMoniker == 0)
-        return STG_E_INSUFFICIENTMEMORY;
-
-    /* Initialize the virtual function table. */
-    newEnumMoniker->IEnumMoniker_iface.lpVtbl = &VT_EnumMonikerImpl;
-    newEnumMoniker->ref          = 1;
+    EnumMonikerImpl *object;
+    unsigned int i;
 
-    newEnumMoniker->tabSize=tabSize;
-    newEnumMoniker->currentPos=currentPos;
+    if (!(object = heap_alloc_zero(sizeof(*object))))
+        return E_OUTOFMEMORY;
 
-    newEnumMoniker->tabMoniker=HeapAlloc(GetProcessHeap(),0,tabSize*sizeof(newEnumMoniker->tabMoniker[0]));
+    object->IEnumMoniker_iface.lpVtbl = &VT_EnumMonikerImpl;
+    object->ref = 1;
+    object->count = count;
 
-    if (newEnumMoniker->tabMoniker==NULL) {
-        HeapFree(GetProcessHeap(), 0, newEnumMoniker);
+    if (!(object->monikers = heap_calloc(count, sizeof(*object->monikers))))
+    {
+        heap_free(object);
         return E_OUTOFMEMORY;
     }
 
-    if (leftToRight)
-        for (i=0;i<tabSize;i++){
-
-            newEnumMoniker->tabMoniker[i]=tabMoniker[i];
-            IMoniker_AddRef(tabMoniker[i]);
-        }
-    else
-        for (i = tabSize; i > 0; i--){
-
-            newEnumMoniker->tabMoniker[tabSize-i]=tabMoniker[i - 1];
-            IMoniker_AddRef(tabMoniker[i - 1]);
-        }
+    for (i = 0; i < count; ++i)
+    {
+        object->monikers[i] = forward ? components[i] : components[count - i - 1];
+        IMoniker_AddRef(object->monikers[i]);
+    }
 
-    *ppmk=&newEnumMoniker->IEnumMoniker_iface;
+    *ret = &object->IEnumMoniker_iface;
 
     return S_OK;
 }
 
-/********************************************************************************/
-/* Virtual function table for the CompositeMonikerImpl class which includes     */
-/* IPersist, IPersistStream and IMoniker functions.                             */
-
 static const IMonikerVtbl VT_CompositeMonikerImpl =
 {
     CompositeMonikerImpl_QueryInterface,




More information about the wine-cvs mailing list