Nikolay Sivov : shell32: Partially implement SHGetKnownFolderIDList().
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 11 07:49:04 CDT 2015
Module: wine
Branch: master
Commit: 80d28abdc8cadb6dc5e35c36c2d9f71eddff50f7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=80d28abdc8cadb6dc5e35c36c2d9f71eddff50f7
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat May 9 21:46:56 2015 +0300
shell32: Partially implement SHGetKnownFolderIDList().
---
dlls/shell32/shellpath.c | 44 ++++++++++++++++++++++++++++++++++++++++--
dlls/shell32/tests/shellpath.c | 35 +++++++++++++++++++++++++++++++++
2 files changed, 77 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 331db1f..42f34a2 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -5727,8 +5727,48 @@ HRESULT WINAPI KnownFolderManager_Constructor( IUnknown *punk, REFIID riid, void
HRESULT WINAPI SHGetKnownFolderIDList(REFKNOWNFOLDERID rfid, DWORD flags, HANDLE token, PIDLIST_ABSOLUTE *pidl)
{
- FIXME("%s, 0x%08x, %p, %p\n", debugstr_guid(rfid), flags, token, pidl);
- return E_NOTIMPL;
+ TRACE("%s, 0x%08x, %p, %p\n", debugstr_guid(rfid), flags, token, pidl);
+
+ if (!pidl)
+ return E_INVALIDARG;
+
+ if (flags)
+ FIXME("unsupported flags: 0x%08x\n", flags);
+
+ if (token)
+ FIXME("user token is not used.\n");
+
+ *pidl = NULL;
+ if (IsEqualIID(rfid, &FOLDERID_Desktop))
+ *pidl = _ILCreateDesktop();
+ else if (IsEqualIID(rfid, &FOLDERID_RecycleBinFolder))
+ *pidl = _ILCreateBitBucket();
+ else if (IsEqualIID(rfid, &FOLDERID_ComputerFolder))
+ *pidl = _ILCreateMyComputer();
+ else if (IsEqualIID(rfid, &FOLDERID_PrintersFolder))
+ *pidl = _ILCreatePrinters();
+ else if (IsEqualIID(rfid, &FOLDERID_ControlPanelFolder))
+ *pidl = _ILCreateControlPanel();
+ else if (IsEqualIID(rfid, &FOLDERID_NetworkFolder))
+ *pidl = _ILCreateNetwork();
+ else if (IsEqualIID(rfid, &FOLDERID_Documents))
+ *pidl = _ILCreateMyDocuments();
+ else
+ {
+ DWORD attributes = 0;
+ WCHAR *pathW;
+ HRESULT hr;
+
+ hr = SHGetKnownFolderPath(rfid, flags, token, &pathW);
+ if (FAILED(hr))
+ return hr;
+
+ hr = SHILCreateFromPathW(pathW, pidl, &attributes);
+ CoTaskMemFree(pathW);
+ return hr;
+ }
+
+ return *pidl ? S_OK : E_FAIL;
}
HRESULT WINAPI SHGetKnownFolderItem(REFKNOWNFOLDERID rfid, KNOWN_FOLDER_FLAG flags, HANDLE hToken,
diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c
index ec21ce7..6b5ed76 100644
--- a/dlls/shell32/tests/shellpath.c
+++ b/dlls/shell32/tests/shellpath.c
@@ -102,6 +102,7 @@ static HRESULT (WINAPI *pSHGetKnownFolderPath)(REFKNOWNFOLDERID, DWORD, HANDLE,
static HRESULT (WINAPI *pSHSetKnownFolderPath)(REFKNOWNFOLDERID, DWORD, HANDLE, PWSTR);
static HRESULT (WINAPI *pSHGetFolderPathEx)(REFKNOWNFOLDERID, DWORD, HANDLE, LPWSTR, DWORD);
static BOOL (WINAPI *pPathYetAnotherMakeUniqueName)(PWSTR, PCWSTR, PCWSTR, PCWSTR);
+static HRESULT (WINAPI *pSHGetKnownFolderIDList)(REFKNOWNFOLDERID, DWORD, HANDLE, PIDLIST_ABSOLUTE*);
static DLLVERSIONINFO shellVersion = { 0 };
static LPMALLOC pMalloc;
@@ -209,6 +210,7 @@ static void loadShell32(void)
GET_PROC(SHFileOperationA)
GET_PROC(SHGetMalloc)
GET_PROC(PathYetAnotherMakeUniqueName)
+ GET_PROC(SHGetKnownFolderIDList)
ok(pSHGetMalloc != NULL, "shell32 is missing SHGetMalloc\n");
if (pSHGetMalloc)
@@ -2728,6 +2730,38 @@ if (0)
ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));
}
+static void test_SHGetKnownFolderIDList(void)
+{
+ PIDLIST_ABSOLUTE pidl;
+ HRESULT hr;
+
+ if (!pSHGetKnownFolderIDList)
+ {
+ win_skip("SHGetKnownFolderIDList is not available.\n");
+ return;
+ }
+
+ hr = pSHGetKnownFolderIDList(NULL, 0, NULL, NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+if (0) { /* crashes on native */
+ pidl = (void*)0xdeadbeef;
+ hr = pSHGetKnownFolderIDList(NULL, 0, NULL, &pidl);
+}
+ /* not a known folder */
+ pidl = (void*)0xdeadbeef;
+ hr = pSHGetKnownFolderIDList(&IID_IUnknown, 0, NULL, &pidl);
+ ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr);
+ ok(pidl == NULL, "got %p\n", pidl);
+
+ hr = pSHGetKnownFolderIDList(&FOLDERID_Desktop, 0, NULL, NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ hr = pSHGetKnownFolderIDList(&FOLDERID_Desktop, 0, NULL, &pidl);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ CoTaskMemFree(pidl);
+}
+
START_TEST(shellpath)
{
if (!init()) return;
@@ -2757,5 +2791,6 @@ START_TEST(shellpath)
test_knownFolders();
test_DoEnvironmentSubst();
test_PathYetAnotherMakeUniqueName();
+ test_SHGetKnownFolderIDList();
}
}
More information about the wine-cvs
mailing list