[PATCH 1/4] shell32: Implement FolderItem::Name() property getter
Nikolay Sivov
nsivov at codeweavers.com
Thu Sep 28 03:25:44 CDT 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/shell32/shelldispatch.c | 36 ++++++++++++++++++++++++++++++++----
dlls/shell32/tests/shelldispatch.c | 26 +++++++++++++++++++++++---
2 files changed, 55 insertions(+), 7 deletions(-)
diff --git a/dlls/shell32/shelldispatch.c b/dlls/shell32/shelldispatch.c
index 3ff9ff0950..43e243e921 100644
--- a/dlls/shell32/shelldispatch.c
+++ b/dlls/shell32/shelldispatch.c
@@ -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)
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index 462be18e5a..3735c9b47f 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -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);
--
2.14.2
More information about the wine-patches
mailing list