Module: wine Branch: master Commit: 80d28abdc8cadb6dc5e35c36c2d9f71eddff50f7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=80d28abdc8cadb6dc5e35c36c2...
Author: Nikolay Sivov nsivov@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(); } }