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