Nikolay Sivov : ole32: Fix CommonPrefixWith() for antimoniker, when other is also antimoniker.
Alexandre Julliard
julliard at winehq.org
Fri Jan 24 16:14:10 CST 2020
Module: wine
Branch: master
Commit: cdf51b39228f5c2da0ab8663d72101cf66622a79
URL: https://source.winehq.org/git/wine.git/?a=commit;h=cdf51b39228f5c2da0ab8663d72101cf66622a79
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Jan 24 12:21:31 2020 +0300
ole32: Fix CommonPrefixWith() for antimoniker, when other is also antimoniker.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole32/antimoniker.c | 37 +++++++++++++++-----------
dlls/ole32/tests/moniker.c | 66 ++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 86 insertions(+), 17 deletions(-)
diff --git a/dlls/ole32/antimoniker.c b/dlls/ole32/antimoniker.c
index ff2e287070..5bce4fc5da 100644
--- a/dlls/ole32/antimoniker.c
+++ b/dlls/ole32/antimoniker.c
@@ -400,25 +400,32 @@ AntiMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
/******************************************************************************
* AntiMoniker_CommonPrefixWith
******************************************************************************/
-static HRESULT WINAPI
-AntiMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** ppmkPrefix)
+static HRESULT WINAPI AntiMonikerImpl_CommonPrefixWith(IMoniker *iface, IMoniker *other, IMoniker **prefix)
{
- DWORD mkSys;
-
- IMoniker_IsSystemMoniker(pmkOther,&mkSys);
-
- if(mkSys==MKSYS_ANTIMONIKER){
-
- IMoniker_AddRef(iface);
-
- *ppmkPrefix=iface;
+ AntiMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
+ HRESULT hr;
- IMoniker_AddRef(iface);
+ TRACE("%p, %p, %p.\n", iface, other, prefix);
- return MK_S_US;
+ other_moniker = unsafe_impl_from_IMoniker(other);
+ if (other_moniker)
+ {
+ if (moniker->count <= other_moniker->count)
+ {
+ *prefix = iface;
+ hr = moniker->count == other_moniker->count ? MK_S_US : MK_S_ME;
+ }
+ else
+ {
+ *prefix = other;
+ hr = MK_S_HIM;
+ }
+
+ IMoniker_AddRef(*prefix);
+ return hr;
}
- else
- return MonikerCommonPrefixWith(iface,pmkOther,ppmkPrefix);
+
+ return MonikerCommonPrefixWith(iface, other, prefix);
}
/******************************************************************************
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 5fff7041ef..8c533d1ff7 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -2430,8 +2430,6 @@ todo_wine
hr = IMoniker_IsEqual(moniker, NULL);
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
- IStream_Release(stream);
-
/* Reduce() */
hr = IMoniker_Reduce(moniker, NULL, MKRREDUCE_ALL, NULL, &reduced);
ok(hr == MK_S_REDUCED_TO_SELF, "Unexpected hr %#x.\n", hr);
@@ -2453,6 +2451,70 @@ todo_wine
todo_wine
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ /* CommonPrefixWith() */
+ stream_write_dword(stream, 0);
+
+ hr = IMoniker_Load(moniker, stream);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, moniker2, &moniker3);
+ ok(hr == MK_S_ME, "Unexpected hr %#x.\n", hr);
+ ok(moniker3 == moniker, "Unexpected prefix moniker.\n");
+ IMoniker_Release(moniker3);
+
+ hr = IMoniker_CommonPrefixWith(moniker2, moniker, &moniker3);
+ ok(hr == MK_S_HIM, "Unexpected hr %#x.\n", hr);
+ ok(moniker3 == moniker, "Unexpected prefix moniker.\n");
+ IMoniker_Release(moniker3);
+
+ stream_write_dword(stream, 10);
+
+ hr = IMoniker_Load(moniker, stream);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ stream_write_dword(stream, 5);
+
+ hr = IMoniker_Load(moniker2, stream);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, moniker2, &moniker3);
+ ok(hr == MK_S_HIM, "Unexpected hr %#x.\n", hr);
+ ok(moniker3 == moniker2, "Unexpected prefix moniker.\n");
+ IMoniker_Release(moniker3);
+
+ hr = IMoniker_CommonPrefixWith(moniker2, moniker, &moniker3);
+ ok(hr == MK_S_ME, "Unexpected hr %#x.\n", hr);
+ ok(moniker3 == moniker2, "Unexpected prefix moniker.\n");
+ IMoniker_Release(moniker3);
+
+ /* Now same length, 0 or 2 */
+ stream_write_dword(stream, 0);
+ hr = IMoniker_Load(moniker, stream);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ stream_write_dword(stream, 0);
+ hr = IMoniker_Load(moniker2, stream);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, moniker2, &moniker3);
+ ok(hr == MK_S_US, "Unexpected hr %#x.\n", hr);
+ ok(moniker3 == moniker, "Unexpected prefix moniker.\n");
+ IMoniker_Release(moniker3);
+
+ stream_write_dword(stream, 2);
+ hr = IMoniker_Load(moniker, stream);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ stream_write_dword(stream, 2);
+ hr = IMoniker_Load(moniker2, stream);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, moniker2, &moniker3);
+ ok(hr == MK_S_US, "Unexpected hr %#x.\n", hr);
+ ok(moniker3 == moniker, "Unexpected prefix moniker.\n");
+ IMoniker_Release(moniker3);
+
+ IStream_Release(stream);
IBindCtx_Release(bindctx);
IMoniker_Release(moniker);
IMoniker_Release(moniker2);
More information about the wine-cvs
mailing list