From 567b52cd933d4ce2646d58b7cb9943c08949e6ca Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 22 Nov 2016 16:27:07 +0100 Subject: [PATCH] shell32: Implement IKnownFolderManager::GetFolderByName. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/shell32/shellpath.c | 45 ++++++++++++++++++++++++++++++++++++++++-- dlls/shell32/tests/shellpath.c | 20 ++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index 2072814cc52..aa2742d54b9 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -5549,8 +5549,49 @@ static HRESULT WINAPI foldermanager_GetFolderByName( LPCWSTR pszCanonicalName, IKnownFolder **ppkf) { - FIXME("%s, %p\n", debugstr_w(pszCanonicalName), ppkf); - return E_NOTIMPL; + struct foldermanager *fm = impl_from_IKnownFolderManager( iface ); + struct knownfolder *kf; + BOOL found = FALSE; + HRESULT hr; + UINT i; + + TRACE( "%s, %p\n", debugstr_w(pszCanonicalName), ppkf ); + + for (i = 0; i < fm->num_ids; i++) + { + WCHAR *path, *name; + hr = get_known_folder_registry_path( &fm->ids[i], NULL, &path ); + if (FAILED( hr )) return hr; + + hr = get_known_folder_wstr( path, szName, &name ); + HeapFree( GetProcessHeap(), 0, path ); + if (FAILED( hr )) return hr; + + found = !strcmpiW( pszCanonicalName, name ); + CoTaskMemFree( name ); + if (found) break; + } + + if (found) + { + hr = knownfolder_create( &kf ); + if (FAILED( hr )) return hr; + + hr = knownfolder_set_id( kf, &fm->ids[i] ); + if (FAILED( hr )) + { + IKnownFolder_Release( &kf->IKnownFolder_iface ); + return hr; + } + *ppkf = &kf->IKnownFolder_iface; + } + else + { + hr = HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ); + *ppkf = NULL; + } + + return hr; } static HRESULT register_folder(const KNOWNFOLDERID *rfid, const KNOWNFOLDER_DEFINITION *pKFD) diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c index 2125092c6de..fa391c2db31 100644 --- a/dlls/shell32/tests/shellpath.c +++ b/dlls/shell32/tests/shellpath.c @@ -2033,9 +2033,11 @@ static void check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId static void test_knownFolders(void) { static const WCHAR sWindows[] = {'W','i','n','d','o','w','s',0}; + static const WCHAR sWindows2[] = {'w','i','n','d','o','w','s',0}; static const WCHAR sExample[] = {'E','x','a','m','p','l','e',0}; static const WCHAR sExample2[] = {'E','x','a','m','p','l','e','2',0}; static const WCHAR sSubFolder[] = {'S','u','b','F','o','l','d','e','r',0}; + static const WCHAR sNoSuch[] = {'N','o','S','u','c','h',0}; static const WCHAR sBackslash[] = {'\\',0}; static const KNOWNFOLDERID newFolderId = {0x01234567, 0x89AB, 0xCDEF, {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01} }; static const KNOWNFOLDERID subFolderId = {0xFEDCBA98, 0x7654, 0x3210, {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF} }; @@ -2137,7 +2139,6 @@ static void test_knownFolders(void) } hr = IKnownFolderManager_GetFolderByName(mgr, sWindows, &folder); - todo_wine ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr); if(SUCCEEDED(hr)) { @@ -2149,6 +2150,23 @@ static void test_knownFolders(void) ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr); } + hr = IKnownFolderManager_GetFolderByName(mgr, sWindows2, &folder); + ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + hr = IKnownFolder_GetId(folder, &folderId); + ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr); + ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n"); + + hr = IKnownFolder_Release(folder); + ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr); + } + + folder = (IKnownFolder *)0xdeadbeef; + hr = IKnownFolderManager_GetFolderByName(mgr, sNoSuch, &folder); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr); + ok(folder == NULL, "got %p\n", folder); + for(i=0; i