Nikolay Sivov : ole32/composite: Fix IsEqual() comparison logic.
Alexandre Julliard
julliard at winehq.org
Mon Sep 27 15:21:45 CDT 2021
Module: wine
Branch: master
Commit: 068ddc5b1b0b00ccef78817cd716815c916ea359
URL: https://source.winehq.org/git/wine.git/?a=commit;h=068ddc5b1b0b00ccef78817cd716815c916ea359
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Sep 27 15:31:39 2021 +0300
ole32/composite: Fix IsEqual() comparison logic.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole32/compositemoniker.c | 65 +++++++++++++++++--------------------------
dlls/ole32/tests/moniker.c | 18 +++++++++---
2 files changed, 39 insertions(+), 44 deletions(-)
diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 4eb9b32fe5e..60d11b3ba90 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -558,56 +558,41 @@ static HRESULT WINAPI CompositeMonikerImpl_Enum(IMoniker *iface, BOOL forward, I
return hr;
}
-/******************************************************************************
- * CompositeMoniker_IsEqual
- ******************************************************************************/
-static HRESULT WINAPI
-CompositeMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
+static HRESULT WINAPI CompositeMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other)
{
- IEnumMoniker *enumMoniker1,*enumMoniker2;
- IMoniker *tempMk1,*tempMk2;
- HRESULT res1,res2,res;
- BOOL done;
-
- TRACE("(%p,%p)\n",iface,pmkOtherMoniker);
+ CompositeMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
+ IMoniker **components, **other_components;
+ unsigned int i;
+ HRESULT hr;
- if (pmkOtherMoniker==NULL)
- return S_FALSE;
+ TRACE("%p, %p.\n", iface, other);
- /* This method returns S_OK if the components of both monikers are equal when compared in the */
- /* left-to-right order.*/
- IMoniker_Enum(pmkOtherMoniker,TRUE,&enumMoniker1);
+ if (!other)
+ return E_INVALIDARG;
- if (enumMoniker1==NULL)
+ if (!(other_moniker = unsafe_impl_from_IMoniker(other)))
return S_FALSE;
- IMoniker_Enum(iface,TRUE,&enumMoniker2);
-
- do {
-
- res1=IEnumMoniker_Next(enumMoniker1,1,&tempMk1,NULL);
- res2=IEnumMoniker_Next(enumMoniker2,1,&tempMk2,NULL);
-
- if((res1==S_OK)&&(res2==S_OK)){
- done = (res = IMoniker_IsEqual(tempMk1,tempMk2)) == S_FALSE;
- }
- else
- {
- res = (res1==S_FALSE) && (res2==S_FALSE);
- done = TRUE;
- }
+ if (moniker->comp_count != other_moniker->comp_count)
+ return S_FALSE;
- if (res1==S_OK)
- IMoniker_Release(tempMk1);
+ if (FAILED(hr = composite_get_components_alloc(moniker, &components))) return hr;
+ if (FAILED(hr = composite_get_components_alloc(other_moniker, &other_components)))
+ {
+ heap_free(components);
+ return hr;
+ }
- if (res2==S_OK)
- IMoniker_Release(tempMk2);
- } while (!done);
+ for (i = 0; i < moniker->comp_count; ++i)
+ {
+ if ((hr = IMoniker_IsEqual(components[i], other_components[i]) != S_OK))
+ break;
+ }
- IEnumMoniker_Release(enumMoniker1);
- IEnumMoniker_Release(enumMoniker2);
+ heap_free(other_components);
+ heap_free(components);
- return res;
+ return hr;
}
static HRESULT WINAPI CompositeMonikerImpl_Hash(IMoniker *iface, DWORD *hash)
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 1e4c2e0211d..962ae6c269f 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -3303,20 +3303,16 @@ todo_wine
/* With itself */
hr = IMoniker_CommonPrefixWith(moniker, moniker, &moniker2);
-todo_wine
ok(hr == MK_S_US, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, moniker2);
-todo_wine
ok(hr == S_OK && moniker2 != moniker, "Unexpected hr %#x.\n", hr);
IMoniker_Release(moniker2);
/* Equal composites */
hr = IMoniker_CommonPrefixWith(moniker, moniker1, &moniker2);
-todo_wine
ok(hr == MK_S_US, "Unexpected hr %#x.\n", hr);
ok(moniker2 != moniker && moniker2 != moniker1, "Unexpected object.\n");
hr = IMoniker_IsEqual(moniker, moniker2);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
IMoniker_Release(moniker2);
@@ -3349,6 +3345,20 @@ todo_wine
IMoniker_Release(moniker);
IMoniker_Release(moniker1);
+ /* IsEqual() */
+ hr = create_moniker_from_desc("CI1I2", &moniker1);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = create_moniker_from_desc("CI1I2", &moniker2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IMoniker_IsEqual(moniker1, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ hr = IMoniker_IsEqual(moniker1, moniker2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IMoniker_IsEqual(moniker1, moniker1);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ IMoniker_Release(moniker2);
+ IMoniker_Release(moniker1);
+
IBindCtx_Release(bindctx);
}
More information about the wine-cvs
mailing list