Nikolay Sivov : ole32: Simplify IsEqual() for file monikers.

Alexandre Julliard julliard at winehq.org
Mon Sep 13 16:12:34 CDT 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Sep 13 10:01:26 2021 +0300

ole32: Simplify IsEqual() for file monikers.

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

---

 dlls/ole32/filemoniker.c   | 45 +++++++++++++++++----------------------------
 dlls/ole32/tests/moniker.c | 18 +++++++++++++++++-
 2 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c
index d3940a9365f..f52881108c7 100644
--- a/dlls/ole32/filemoniker.c
+++ b/dlls/ole32/filemoniker.c
@@ -57,6 +57,15 @@ static inline FileMonikerImpl *impl_from_IROTData(IROTData *iface)
     return CONTAINING_RECORD(iface, FileMonikerImpl, IROTData_iface);
 }
 
+static const IMonikerVtbl VT_FileMonikerImpl;
+
+static FileMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface)
+{
+    if (iface->lpVtbl != &VT_FileMonikerImpl)
+        return NULL;
+    return CONTAINING_RECORD(iface, FileMonikerImpl, IMoniker_iface);
+}
+
 /* Local function used by filemoniker implementation */
 static HRESULT FileMonikerImpl_Construct(FileMonikerImpl* iface, LPCOLESTR lpszPathName);
 
@@ -735,40 +744,20 @@ FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker
     return S_OK;
 }
 
-/******************************************************************************
- *        FileMoniker_IsEqual
- */
-static HRESULT WINAPI
-FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
+static HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other)
 {
-    FileMonikerImpl *This = impl_from_IMoniker(iface);
-    CLSID clsid;
-    LPOLESTR filePath;
-    IBindCtx* bind;
-    HRESULT res;
-
-    TRACE("(%p,%p)\n",iface,pmkOtherMoniker);
+    FileMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
 
-    if (pmkOtherMoniker==NULL)
-        return S_FALSE;
+    TRACE("%p, %p.\n", iface, other);
 
-    IMoniker_GetClassID(pmkOtherMoniker,&clsid);
+    if (!other)
+        return E_INVALIDARG;
 
-    if (!IsEqualCLSID(&clsid,&CLSID_FileMoniker))
+    other_moniker = unsafe_impl_from_IMoniker(other);
+    if (!other_moniker)
         return S_FALSE;
 
-    res = CreateBindCtx(0,&bind);
-    if (FAILED(res)) return res;
-
-    res = S_FALSE;
-    if (SUCCEEDED(IMoniker_GetDisplayName(pmkOtherMoniker,bind,NULL,&filePath))) {
-	if (!lstrcmpiW(filePath, This->filePathName))
-            res = S_OK;
-	CoTaskMemFree(filePath);
-    }
-
-    IBindCtx_Release(bind);
-    return res;
+    return !wcsicmp(moniker->filePathName, other_moniker->filePathName) ? S_OK : S_FALSE;
 }
 
 /******************************************************************************
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 8d9c0678436..d8d52295ff2 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -1981,8 +1981,8 @@ static void test_file_monikers(void)
         {0x20ac, 0x2020, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10a, 0x10b, 0x10c,  0},
         };
     WCHAR filename[MAX_PATH], path[MAX_PATH];
+    IMoniker *moniker, *moniker2;
     BIND_OPTS bind_opts;
-    IMoniker *moniker;
     IStorage *storage;
     IBindCtx *bindctx;
     STATSTG statstg;
@@ -2057,6 +2057,22 @@ static void test_file_monikers(void)
     IMoniker_Release(moniker);
 
     DeleteFileW(filename);
+
+    /* IsEqual() */
+    hr = CreateFileMoniker(L"test.bmp", &moniker);
+    ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
+
+    hr = CreateFileMoniker(L"TEST.bmp", &moniker2);
+    ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
+
+    hr = IMoniker_IsEqual(moniker, moniker2);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMoniker_IsEqual(moniker, NULL);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    IMoniker_Release(moniker2);
+    IMoniker_Release(moniker);
 }
 
 static void test_item_moniker(void)




More information about the wine-cvs mailing list