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