shell32: Implement FolderItem::Name() property getter.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2017-09-28 11:25:44 +03:00 committed by Alexandre Julliard
parent 682c1b9532
commit 2ef383c01a
2 changed files with 55 additions and 7 deletions

View File

@ -748,12 +748,40 @@ static HRESULT WINAPI FolderItemImpl_get_Parent(FolderItem2 *iface, IDispatch **
return S_OK;
}
static HRESULT WINAPI FolderItemImpl_get_Name(FolderItem2 *iface, BSTR *pbs)
static HRESULT WINAPI FolderItemImpl_get_Name(FolderItem2 *iface, BSTR *name)
{
FIXME("(%p,%p)\n", iface, pbs);
FolderItemImpl *This = impl_from_FolderItem(iface);
LPCITEMIDLIST last_part;
IShellFolder2 *parent;
HRESULT hr = S_OK;
LPITEMIDLIST pidl;
STRRET strret;
*pbs = NULL;
return E_NOTIMPL;
TRACE("(%p,%p)\n", iface, name);
*name = NULL;
if (This->path)
hr = SHParseDisplayName(This->path, NULL, &pidl, 0, NULL);
else
pidl = This->folder->pidl;
if (FAILED(hr))
return S_FALSE;
hr = SHBindToParent(pidl, &IID_IShellFolder2, (void **)&parent, &last_part);
if (hr == S_OK)
hr = IShellFolder2_GetDisplayNameOf(parent, last_part, SHGDN_INFOLDER, &strret);
IShellFolder2_Release(parent);
if (hr == S_OK)
hr = StrRetToBSTR(&strret, last_part, name);
if (This->path)
ILFree(pidl);
return hr;
}
static HRESULT WINAPI FolderItemImpl_put_Name(FolderItem2 *iface, BSTR bs)

View File

@ -49,12 +49,22 @@ static HRESULT (WINAPI *pSHGetNameFromIDList)(PCIDLIST_ABSOLUTE,SIGDN,PWSTR*);
/* Updated Windows 7 has a new IShellDispatch6 in its typelib */
DEFINE_GUID(IID_IWin7ShellDispatch6, 0x34936ba1, 0x67ad, 0x4c41, 0x99,0xb8, 0x8c,0x12,0xdf,0xf1,0xe9,0x74);
static BSTR a2bstr(const char *str)
{
BSTR ret;
int len;
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
ret = SysAllocStringLen(NULL, len);
MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
return ret;
}
static void variant_set_string(VARIANT *v, const char *s)
{
WCHAR wstr[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, s, -1, wstr, MAX_PATH);
V_VT(v) = VT_BSTR;
V_BSTR(v) = SysAllocString(wstr);
V_BSTR(v) = a2bstr(s);
}
static void init_function_pointers(void)
@ -595,6 +605,7 @@ static void test_items(void)
for (i = 0; i < sizeof(file_defs)/sizeof(file_defs[0]); i++)
{
VARIANT_BOOL b;
BSTR name;
V_I4(&int_index) = i;
variant_set_string(&str_index, file_defs[i].name);
@ -618,6 +629,15 @@ static void test_items(void)
"file_defs[%d]: expected %s, got %s\n", i, wine_dbgstr_w(path), wine_dbgstr_w(bstr));
SysFreeString(bstr);
bstr = a2bstr(file_defs[i].name);
r = FolderItem_get_Name(item, &name);
ok(r == S_OK, "Failed to get item name, hr %#x.\n", r);
/* Returned display name does not have to strictly match file name, e.g. extension could be omitted. */
ok(lstrlenW(name) <= lstrlenW(bstr), "file_defs[%d]: unexpected name length.\n", i);
ok(!memcmp(bstr, name, lstrlenW(name) * sizeof(WCHAR)), "file_defs[%d]: unexpected name %s.\n", i, wine_dbgstr_w(name));
SysFreeString(name);
SysFreeString(bstr);
item = NULL;
r = FolderItems_Item(items, str_index, &item);
ok(r == S_OK, "file_defs[%d]: FolderItems::Item failed: %08x\n", i, r);