shell32: Implement IKnownFolderManager::GetFolderByName.

Hans Leidekker hans at codeweavers.com
Tue Nov 22 09:27:07 CST 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 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 2072814..aa2742d 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 2125092..fa391c2 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<sizeof(known_folder_found)/sizeof(known_folder_found[0]); ++i)
             known_folder_found[i] = FALSE;
 
-- 
2.1.4




More information about the wine-patches mailing list