shlfolder: SFGAO_FILESYSANCESTOR fix

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Apr 11 06:18:23 CDT 2005


        Huw Davies <huw at codeweavers.com>
        Directory items should have the SFGOA_FILESYSANCESTOR
        attribute.
        Add a test for this and cleanup the shlfolder test a bit.
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/shell32/shlfolder.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shlfolder.c,v
retrieving revision 1.97
diff -u -p -r1.97 shlfolder.c
--- dlls/shell32/shlfolder.c	23 Mar 2005 13:15:19 -0000	1.97
+++ dlls/shell32/shlfolder.c	11 Apr 2005 11:12:23 -0000
@@ -396,7 +396,9 @@ HRESULT SHELL32_GetItemAttributes (IShel
 	}
     } else if (_ILGetDataPointer (pidl)) {
 	dwAttributes = _ILGetFileAttributes (pidl, NULL, 0);
-	*pdwAttributes &= ~SFGAO_FILESYSANCESTOR;
+
+        if ((SFGAO_FILESYSANCESTOR & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
+            *pdwAttributes &= ~SFGAO_FILESYSANCESTOR;
 
 	if ((SFGAO_FOLDER & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
 	    *pdwAttributes &= ~(SFGAO_FOLDER | SFGAO_HASSUBFOLDER);
Index: dlls/shell32/tests/shlfolder.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/tests/shlfolder.c,v
retrieving revision 1.4
diff -u -p -r1.4 shlfolder.c
--- dlls/shell32/tests/shlfolder.c	25 Oct 2004 21:45:36 -0000	1.4
+++ dlls/shell32/tests/shlfolder.c	11 Apr 2005 11:12:23 -0000
@@ -65,6 +65,7 @@ void CreateFilesFolders(void)
     CreateTestFile  (".\\testdir\\test2.txt ");
     CreateTestFile  (".\\testdir\\test3.txt ");
     CreateDirectoryA(".\\testdir\\testdir2 ", NULL);
+    CreateDirectoryA(".\\testdir\\testdir2\\subdir", NULL);
 }
 
 /* cleans after tests */
@@ -74,6 +75,7 @@ void Cleanup(void)
     DeleteFileA(".\\testdir\\test2.txt");
     DeleteFileA(".\\testdir\\test3.txt");
     RemoveDirectoryA(".\\testdir\\test.txt");
+    RemoveDirectoryA(".\\testdir\\testdir2\\subdir");
     RemoveDirectoryA(".\\testdir\\testdir2");
     RemoveDirectoryA(".\\testdir");
 }
@@ -86,7 +88,7 @@ void test_EnumObjects(IShellFolder *iFol
     ITEMIDLIST *newPIDL, *(idlArr [5]);
     ULONG NumPIDLs;
     int i=0, j;
-    HRESULT nResult;
+    HRESULT hr;
 
     static const WORD iResults [5][5] =
     {
@@ -97,67 +99,91 @@ void test_EnumObjects(IShellFolder *iFol
 	{ 1, 1, 1, 1, 0}
     };
 
-    if SUCCEEDED(IShellFolder_EnumObjects(iFolder, NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &iEnumList))
+    /* Just test SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR for now */
+    static const ULONG attrs[5] =
     {
-	while (IEnumIDList_Next(iEnumList, 1, &newPIDL, &NumPIDLs) == S_OK)
-	{
-	    idlArr[i++] = newPIDL;
-	}
-	/* This fails on windows */
-	/* IEnumIDList_Release(iEnumList); */
+        SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR,
+        SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR,
+        SFGAO_FILESYSTEM,
+        SFGAO_FILESYSTEM,
+        SFGAO_FILESYSTEM,
+    };
+
+    hr = IShellFolder_EnumObjects(iFolder, NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &iEnumList);
+    ok(hr == S_OK, "EnumObjects failed %08lx\n", hr);
+
+    while (IEnumIDList_Next(iEnumList, 1, &newPIDL, &NumPIDLs) == S_OK)
+    {
+        idlArr[i++] = newPIDL;
+    }
+
+    hr = IEnumIDList_Release(iEnumList);
+    ok(hr == S_OK, "IEnumIDList_Release failed %08lx\n", hr);
     
-	/* Sort them first in case of wrong order from system */
-	for (i=0;i<5;i++) for (j=0;j<5;j++)
-	    if ((SHORT)IShellFolder_CompareIDs(iFolder, 0, idlArr[i], idlArr[j]) < 0)
-	    {
-		newPIDL = idlArr[i];
-		idlArr[i] = idlArr[j];
-		idlArr[j] = newPIDL;
-	    }
-	    
-	for (i=0;i<5;i++) for (j=0;j<5;j++)
+    /* Sort them first in case of wrong order from system */
+    for (i=0;i<5;i++) for (j=0;j<5;j++)
+        if ((SHORT)IShellFolder_CompareIDs(iFolder, 0, idlArr[i], idlArr[j]) < 0)
 	{
-	    nResult = IShellFolder_CompareIDs(iFolder, 0, idlArr[i], idlArr[j]);
-	    ok(nResult == iResults[i][j], "Got %lx expected [%d]-[%d]=%x\n", nResult, i, j, iResults[i][j]);
-	}
+            newPIDL = idlArr[i];
+            idlArr[i] = idlArr[j];
+            idlArr[j] = newPIDL;
+        }
+	    
+    for (i=0;i<5;i++) for (j=0;j<5;j++)
+    {
+        hr = IShellFolder_CompareIDs(iFolder, 0, idlArr[i], idlArr[j]);
+        ok(hr == iResults[i][j], "Got %lx expected [%d]-[%d]=%x\n", hr, i, j, iResults[i][j]);
+    }
+
 
-	for (i=0;i<5;i++)
-	    IMalloc_Free(ppM, idlArr[i]);
+    for (i = 0; i < 5; i++)
+    {
+        SFGAOF flags;
+        flags = SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR;
+        hr = IShellFolder_GetAttributesOf(iFolder, 1, (LPCITEMIDLIST*)(idlArr + i), &flags);
+        flags &= SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR;
+        ok(hr == S_OK, "GetAttributesOf returns %08lx\n", hr);
+        ok(flags == attrs[i], "GetAttributesOf gets attrs %08lx, expects %08lx\n", flags, attrs[i]);
     }
+
+    for (i=0;i<5;i++)
+        IMalloc_Free(ppM, idlArr[i]);
 }
 
+    
 START_TEST(shlfolder)
 {
     ITEMIDLIST *newPIDL;
     IShellFolder *IDesktopFolder, *testIShellFolder;
     WCHAR cCurrDirW [MAX_PATH];
     static const WCHAR cTestDirW[] = {'\\','t','e','s','t','d','i','r',0};
-
+    HRESULT hr;
     
     GetCurrentDirectoryW(MAX_PATH, cCurrDirW);
     strcatW(cCurrDirW, cTestDirW);
 
-    
-    if(!SUCCEEDED(SHGetMalloc(&ppM)))
-	return;
+    OleInitialize(NULL);
+
+    hr = SHGetMalloc(&ppM);
+    ok(hr == S_OK, "SHGetMalloc failed %08lx\n", hr);
 
     CreateFilesFolders();
     
-    if(!SUCCEEDED(SHGetDesktopFolder(&IDesktopFolder)))
-        return;
+    hr = SHGetDesktopFolder(&IDesktopFolder);
+    ok(hr == S_OK, "SHGetDesktopfolder failed %08lx\n", hr);
 
-    if (SUCCEEDED(IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cCurrDirW, NULL, &newPIDL, 0)))
-    {
-	if (SUCCEEDED(IShellFolder_BindToObject(IDesktopFolder, newPIDL, NULL, (REFIID)&IID_IShellFolder, (LPVOID *)&testIShellFolder)))
-	{
-	    test_EnumObjects(testIShellFolder);
-	    
-	    /* This fails on windows */
-	    /* IShellFolder_Release(newIShellFolder); */
+    hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cCurrDirW, NULL, &newPIDL, 0);
+    ok(hr == S_OK, "ParseDisplayName failed %08lx\n", hr);
 
-	    IMalloc_Free(ppM, newPIDL);
-	}
-    }
+    hr = IShellFolder_BindToObject(IDesktopFolder, newPIDL, NULL, (REFIID)&IID_IShellFolder, (LPVOID *)&testIShellFolder);
+    ok(hr == S_OK, "BindToObject failed %08lx\n", hr);
+        
+    test_EnumObjects(testIShellFolder);
+
+    hr = IShellFolder_Release(testIShellFolder);
+    ok(hr == S_OK, "IShellFolder_Release failed %08lx\n", hr);
+
+    IMalloc_Free(ppM, newPIDL);
 
     Cleanup();
 }



More information about the wine-patches mailing list