Nikolay Sivov : shell32: Implement SHParseDisplayName with basic tests.
Alexandre Julliard
julliard at winehq.org
Wed Mar 3 11:15:46 CST 2010
Module: wine
Branch: master
Commit: 500c78505382955e307b525a9750a1e0a87adb8f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=500c78505382955e307b525a9750a1e0a87adb8f
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Mar 3 04:56:20 2010 +0300
shell32: Implement SHParseDisplayName with basic tests.
---
dlls/shell32/pidl.c | 21 +++++++++--
dlls/shell32/shfldr_desktop.c | 6 ++--
dlls/shell32/tests/shlfolder.c | 78 +++++++++++++++++++++++++++++++++++++++-
3 files changed, 98 insertions(+), 7 deletions(-)
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index 3e61144..0774fde 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1326,9 +1326,24 @@ HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCI
HRESULT WINAPI SHParseDisplayName(LPCWSTR name, IBindCtx *bindctx, LPITEMIDLIST *pidlist,
SFGAOF attr_in, SFGAOF *attr_out)
{
- FIXME("%s %p %p %d %p stub!\n", debugstr_w(name), bindctx, pidlist, attr_in, attr_out);
- if(pidlist) *pidlist = NULL;
- return E_NOTIMPL;
+ IShellFolder *desktop;
+ HRESULT hr;
+
+ TRACE("%s %p %p %d %p\n", debugstr_w(name), bindctx, pidlist, attr_in, attr_out);
+
+ *pidlist = NULL;
+
+ if (!name) return E_OUTOFMEMORY;
+
+ hr = SHGetDesktopFolder(&desktop);
+ if (hr != S_OK) return hr;
+
+ hr = IShellFolder_ParseDisplayName(desktop, NULL, bindctx, (LPWSTR)name, NULL, pidlist, &attr_in);
+ if (attr_out) *attr_out = attr_in;
+
+ IShellFolder_Release(desktop);
+
+ return hr;
}
/**************************************************************************
diff --git a/dlls/shell32/shfldr_desktop.c b/dlls/shell32/shfldr_desktop.c
index a08bb41..d6ccb72 100644
--- a/dlls/shell32/shfldr_desktop.c
+++ b/dlls/shell32/shfldr_desktop.c
@@ -151,11 +151,11 @@ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface,
This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
pchEaten, ppidl, pdwAttributes);
- if (!lpszDisplayName || !ppidl)
- return E_INVALIDARG;
-
+ if (!ppidl) return E_INVALIDARG;
*ppidl = 0;
+ if (!lpszDisplayName) return E_INVALIDARG;
+
if (pchEaten)
*pchEaten = 0; /* strange but like the original */
diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c
index 27c6ee8..9b19471 100644
--- a/dlls/shell32/tests/shlfolder.c
+++ b/dlls/shell32/tests/shlfolder.c
@@ -54,7 +54,7 @@ static void (WINAPI *pILFree)(LPITEMIDLIST);
static BOOL (WINAPI *pILIsEqual)(LPCITEMIDLIST, LPCITEMIDLIST);
static HRESULT (WINAPI *pSHCreateShellItem)(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**);
static LPITEMIDLIST (WINAPI *pILCombine)(LPCITEMIDLIST,LPCITEMIDLIST);
-
+static HRESULT (WINAPI *pSHParseDisplayName)(LPCWSTR,IBindCtx*,LPITEMIDLIST*,SFGAOF,SFGAOF*);
static void init_function_pointers(void)
{
@@ -71,6 +71,7 @@ static void init_function_pointers(void)
MAKEFUNC(SHGetPathFromIDListW);
MAKEFUNC(SHGetSpecialFolderPathA);
MAKEFUNC(SHGetSpecialFolderPathW);
+ MAKEFUNC(SHParseDisplayName);
#undef MAKEFUNC
#define MAKEFUNC_ORD(f, ord) (p##f = (void*)GetProcAddress(hmod, (LPSTR)(ord)))
@@ -103,6 +104,18 @@ static void test_ParseDisplayName(void)
hr = SHGetDesktopFolder(&IDesktopFolder);
if(hr != S_OK) return;
+ /* null name and pidl */
+ hr = IShellFolder_ParseDisplayName(IDesktopFolder,
+ NULL, NULL, NULL, NULL, NULL, 0);
+ ok(hr == E_INVALIDARG, "returned %08x, expected E_INVALIDARG\n", hr);
+
+ /* null name */
+ newPIDL = (ITEMIDLIST*)0xdeadbeef;
+ hr = IShellFolder_ParseDisplayName(IDesktopFolder,
+ NULL, NULL, NULL, NULL, &newPIDL, 0);
+ ok(newPIDL == 0, "expected null, got %p\n", newPIDL);
+ ok(hr == E_INVALIDARG, "returned %08x, expected E_INVALIDARG\n", hr);
+
MultiByteToWideChar(CP_ACP, 0, cInetTestA, -1, cTestDirW, MAX_PATH);
hr = IShellFolder_ParseDisplayName(IDesktopFolder,
NULL, NULL, cTestDirW, NULL, &newPIDL, 0);
@@ -1962,6 +1975,68 @@ static void test_SHCreateShellItem(void)
IShellFolder_Release(desktopfolder);
}
+static void test_SHParseDisplayName(void)
+{
+ static const WCHAR prefixW[] = {'w','t',0};
+ LPITEMIDLIST pidl1, pidl2;
+ IShellFolder *desktop;
+ WCHAR dirW[MAX_PATH];
+ WCHAR nameW[10];
+ HRESULT hr;
+ BOOL ret;
+
+ if (!pSHParseDisplayName)
+ {
+ win_skip("SHParseDisplayName isn't available\n");
+ return;
+ }
+
+if (0)
+{
+ /* crashes on native */
+ hr = pSHParseDisplayName(NULL, NULL, NULL, 0, NULL);
+ nameW[0] = 0;
+ hr = pSHParseDisplayName(nameW, NULL, NULL, 0, NULL);
+}
+
+ pidl1 = (LPITEMIDLIST)0xdeadbeef;
+ hr = pSHParseDisplayName(NULL, NULL, &pidl1, 0, NULL);
+ ok(hr == E_OUTOFMEMORY, "failed %08x\n", hr);
+ ok(pidl1 == 0, "expected null ptr, got %p\n", pidl1);
+
+ /* dummy name */
+ nameW[0] = 0;
+ hr = pSHParseDisplayName(nameW, NULL, &pidl1, 0, NULL);
+ ok(hr == S_OK, "failed %08x\n", hr);
+ hr = SHGetDesktopFolder(&desktop);
+ ok(hr == S_OK, "failed %08x\n", hr);
+ hr = IShellFolder_ParseDisplayName(desktop, NULL, NULL, nameW, NULL, &pidl2, NULL);
+ ok(hr == S_OK, "failed %08x\n", hr);
+ ret = pILIsEqual(pidl1, pidl2);
+ ok(ret == TRUE, "expected equal idls\n");
+ pILFree(pidl1);
+ pILFree(pidl2);
+
+ /* with path */
+ GetTempPathW(sizeof(dirW)/sizeof(WCHAR), dirW);
+ GetTempFileNameW(dirW, prefixW, 0, dirW);
+ CreateFileW(dirW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
+
+ hr = pSHParseDisplayName(dirW, NULL, &pidl1, 0, NULL);
+ ok(hr == S_OK, "failed %08x\n", hr);
+ hr = IShellFolder_ParseDisplayName(desktop, NULL, NULL, dirW, NULL, &pidl2, NULL);
+ ok(hr == S_OK, "failed %08x\n", hr);
+
+ ret = pILIsEqual(pidl1, pidl2);
+ ok(ret == TRUE, "expected equal idls\n");
+ pILFree(pidl1);
+ pILFree(pidl2);
+
+ DeleteFileW(dirW);
+
+ IShellFolder_Release(desktop);
+}
+
START_TEST(shlfolder)
{
init_function_pointers();
@@ -1970,6 +2045,7 @@ START_TEST(shlfolder)
OleInitialize(NULL);
test_ParseDisplayName();
+ test_SHParseDisplayName();
test_BindToObject();
test_EnumObjects_and_CompareIDs();
test_GetDisplayName();
More information about the wine-cvs
mailing list