Nikolay Sivov : ole32/composite: Cleanup IsRunning() implementation.

Alexandre Julliard julliard at winehq.org
Wed Sep 29 15:54:09 CDT 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Sep 29 10:23:25 2021 +0300

ole32/composite: Cleanup IsRunning() implementation.

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

---

 dlls/ole32/compositemoniker.c | 93 ++++++++++++++-----------------------------
 dlls/ole32/tests/moniker.c    |  9 +++++
 2 files changed, 39 insertions(+), 63 deletions(-)

diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 77e1e8aff35..df9b23c515d 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -612,82 +612,49 @@ static HRESULT WINAPI CompositeMonikerImpl_Hash(IMoniker *iface, DWORD *hash)
     return hr;
 }
 
-/******************************************************************************
- *        CompositeMoniker_IsRunning
- ******************************************************************************/
-static HRESULT WINAPI
-CompositeMonikerImpl_IsRunning(IMoniker* iface, IBindCtx* pbc,
-               IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning)
+static HRESULT WINAPI CompositeMonikerImpl_IsRunning(IMoniker *iface, IBindCtx *pbc,
+        IMoniker *toleft, IMoniker *newly_running)
 {
-    IRunningObjectTable* rot;
-    HRESULT res;
-    IMoniker *tempMk,*antiMk,*rightMostMk;
-    IEnumMoniker *enumMoniker;
-
-    TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
-
-    /* If pmkToLeft is non-NULL, this method composes pmkToLeft with this moniker and calls IsRunning on the result.*/
-    if (pmkToLeft!=NULL){
+    CompositeMonikerImpl *moniker = impl_from_IMoniker(iface);
+    IMoniker *c, *left, *rightmost;
+    IRunningObjectTable *rot;
+    HRESULT hr;
 
-        CreateGenericComposite(pmkToLeft,iface,&tempMk);
+    TRACE("%p, %p, %p, %p.\n", iface, pbc, toleft, newly_running);
 
-        res = IMoniker_IsRunning(tempMk,pbc,NULL,pmkNewlyRunning);
+    if (!pbc)
+        return E_INVALIDARG;
 
-        IMoniker_Release(tempMk);
+    if (toleft)
+    {
+        if (SUCCEEDED(hr = CreateGenericComposite(toleft, iface, &c)))
+        {
+            hr = IMoniker_IsRunning(c, pbc, NULL, newly_running);
+            IMoniker_Release(c);
+        }
 
-        return res;
+        return hr;
     }
-    else
-        /* If pmkToLeft is NULL, this method returns S_OK if pmkNewlyRunning is non-NULL and is equal */
-        /* to this moniker */
 
-        if (pmkNewlyRunning!=NULL)
+    if (newly_running)
+        return IMoniker_IsEqual(iface, newly_running);
 
-            if (IMoniker_IsEqual(iface,pmkNewlyRunning)==S_OK)
-                return S_OK;
-
-            else
-                return S_FALSE;
-
-        else{
-
-            if (pbc==NULL)
-                return E_INVALIDARG;
-
-            /* If pmkToLeft and pmkNewlyRunning are both NULL, this method checks the ROT to see whether */
-            /* the moniker is running. If so, the method returns S_OK; otherwise, it recursively calls   */
-            /* IMoniker::IsRunning on the rightmost component of the composite, passing the remainder of */
-            /* the composite as the pmkToLeft parameter for that call.                                   */
-
-             res=IBindCtx_GetRunningObjectTable(pbc,&rot);
-
-            if (FAILED(res))
-                return res;
-
-            res = IRunningObjectTable_IsRunning(rot,iface);
-            IRunningObjectTable_Release(rot);
-
-            if(res==S_OK)
-                return S_OK;
-
-            else{
+    if (FAILED(hr = IBindCtx_GetRunningObjectTable(pbc, &rot)))
+        return hr;
 
-                IMoniker_Enum(iface,FALSE,&enumMoniker);
-                IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
-                IEnumMoniker_Release(enumMoniker);
+    hr = IRunningObjectTable_IsRunning(rot, iface);
+    IRunningObjectTable_Release(rot);
+    if (hr == S_OK) return S_OK;
 
-                res=CreateAntiMoniker(&antiMk);
-                res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
-                IMoniker_Release(antiMk);
+    if (FAILED(hr = composite_get_rightmost(moniker, &left, &rightmost)))
+        return hr;
 
-                res=IMoniker_IsRunning(rightMostMk,pbc,tempMk,pmkNewlyRunning);
+    hr = IMoniker_IsRunning(rightmost, pbc, left, NULL);
 
-                IMoniker_Release(tempMk);
-                IMoniker_Release(rightMostMk);
+    IMoniker_Release(left);
+    IMoniker_Release(rightmost);
 
-                return res;
-            }
-        }
+    return hr;
 }
 
 static HRESULT WINAPI CompositeMonikerImpl_GetTimeOfLastChange(IMoniker *iface, IBindCtx *pbc,
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 2d7f0789924..ea58c09356e 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -3273,6 +3273,15 @@ todo_wine
     hr = IMoniker_IsRunning(moniker, bindctx, NULL, NULL);
     ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
 
+    hr = IMoniker_IsRunning(moniker, bindctx, NULL, moniker);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMoniker_IsRunning(moniker, bindctx, moniker1, moniker);
+    ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
+
+    hr = IMoniker_IsRunning(moniker, NULL, moniker1, moniker);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
     hr = IMoniker_GetTimeOfLastChange(moniker, bindctx, NULL, &filetime);
     ok(hr == MK_E_NOTBINDABLE, "IMoniker_GetTimeOfLastChange should return MK_E_NOTBINDABLE, not 0x%08x\n", hr);
 




More information about the wine-cvs mailing list