ole32: Simplify IsEqual() for file monikers.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-09-13 10:01:26 +03:00 committed by Alexandre Julliard
parent 7c518c3bd1
commit fb31e6f3f3
2 changed files with 35 additions and 30 deletions

View File

@ -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;
FileMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
TRACE("(%p,%p)\n",iface,pmkOtherMoniker);
TRACE("%p, %p.\n", iface, other);
if (pmkOtherMoniker==NULL)
if (!other)
return E_INVALIDARG;
other_moniker = unsafe_impl_from_IMoniker(other);
if (!other_moniker)
return S_FALSE;
IMoniker_GetClassID(pmkOtherMoniker,&clsid);
if (!IsEqualCLSID(&clsid,&CLSID_FileMoniker))
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;
}
/******************************************************************************

View File

@ -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)