- move CreateMyCompEnumList and CreateDesktopEnumList to their
respective files
- rewrite CreateFolderEnumList to only FindFirstFile/FindNextFile once
diff --git a/dlls/shell32/enumidlist.c b/dlls/shell32/enumidlist.c
index 72416bfc..0712201 100644
--- a/dlls/shell32/enumidlist.c
+++ b/dlls/shell32/enumidlist.c
@@ -102,192 +102,63 @@
/**************************************************************************
* CreateFolderEnumList()
*/
-static BOOL CreateFolderEnumList(
- IEnumIDList * iface,
+BOOL CreateFolderEnumList(
+ IEnumIDList *list,
LPCSTR lpszPath,
DWORD dwFlags)
{
- ICOM_THIS(IEnumIDListImpl,iface);
+ LPITEMIDLIST pidl=NULL;
+ WIN32_FIND_DATAA stffile;
+ HANDLE hFile;
+ CHAR szPath[MAX_PATH];
+ BOOL succeeded = TRUE;
- LPITEMIDLIST pidl=NULL;
- WIN32_FIND_DATAA stffile;
- HANDLE hFile;
- CHAR szPath[MAX_PATH];
+ TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_a(lpszPath),dwFlags);
- TRACE("(%p)->(path=%s flags=0x%08lx) \n",This,debugstr_a(lpszPath),dwFlags);
+ if(!lpszPath || !lpszPath[0]) return FALSE;
- if(!lpszPath || !lpszPath[0]) return FALSE;
+ strcpy(szPath, lpszPath);
+ PathAddBackslashA(szPath);
+ strcat(szPath,"*.*");
- strcpy(szPath, lpszPath);
- PathAddBackslashA(szPath);
- strcat(szPath,"*.*");
+ hFile = FindFirstFileA(szPath,&stffile);
+ if ( hFile != INVALID_HANDLE_VALUE )
+ {
+ BOOL findFinished = FALSE;
- /*enumerate the folders*/
- if(dwFlags & SHCONTF_FOLDERS)
- {
- TRACE("-- (%p)-> enumerate SHCONTF_FOLDERS of %s\n",This,debugstr_a(szPath));
- hFile = FindFirstFileA(szPath,&stffile);
- if ( hFile != INVALID_HANDLE_VALUE )
- {
- do
- {
- if ( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue;
- if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, ".."))
- {
- pidl = _ILCreateFromFindDataA (&stffile);
- if(pidl && AddToEnumList((IEnumIDList*)This, pidl))
- {
- continue;
- }
- return FALSE;
- }
- } while( FindNextFileA(hFile,&stffile));
- FindClose (hFile);
- }
- }
-
- /*enumerate the non-folder items (values) */
- if(dwFlags & SHCONTF_NONFOLDERS)
- {
- TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",This,debugstr_a(szPath));
- hFile = FindFirstFileA(szPath,&stffile);
- if ( hFile != INVALID_HANDLE_VALUE )
- {
- do
- {
- if ( !(dwFlags & SHCONTF_INCLUDEHIDDEN) && (stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) continue;
- if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
- {
- pidl = _ILCreateFromFindDataA(&stffile);
- if(pidl && AddToEnumList((IEnumIDList*)This, pidl))
- {
- continue;
- }
- return FALSE;
- }
- } while( FindNextFileA(hFile,&stffile));
- FindClose (hFile);
- }
- }
- return TRUE;
-}
-
-/**************************************************************************
- * CreateDesktopEnumList()
- */
-static BOOL CreateDesktopEnumList(
- IEnumIDList * iface,
- DWORD dwFlags)
-{
- ICOM_THIS(IEnumIDListImpl,iface);
-
- LPITEMIDLIST pidl=NULL;
- HKEY hkey;
- char szPath[MAX_PATH];
-
- TRACE("(%p)->(flags=0x%08lx) \n",This,dwFlags);
-
- /*enumerate the root folders */
- if(dwFlags & SHCONTF_FOLDERS)
- {
- /*create the pidl for This item */
- pidl = _ILCreateMyComputer();
- if(pidl)
- {
- if(!AddToEnumList((IEnumIDList*)This, pidl))
- return FALSE;
- }
-
- if (! RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\desktop\\NameSpace", 0, KEY_READ, &hkey))
- {
- char iid[50];
- int i=0;
-
- while (1)
- {
- DWORD size = sizeof (iid);
-
- if (ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL))
- break;
-
- pidl = _ILCreateGuidFromStrA(iid);
-
- if(pidl)
- AddToEnumList((IEnumIDList*)This, pidl);
-
- i++;
- }
- RegCloseKey(hkey);
- }
- }
-
- /*enumerate the elements in %windir%\desktop */
- SHGetSpecialFolderPathA(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);
- CreateFolderEnumList( (IEnumIDList*)This, szPath, dwFlags);
-
- return TRUE;
-}
-
-/**************************************************************************
- * CreateMyCompEnumList()
- */
-static BOOL CreateMyCompEnumList(
- IEnumIDList * iface,
- DWORD dwFlags)
-{
- ICOM_THIS(IEnumIDListImpl,iface);
-
- LPITEMIDLIST pidl=NULL;
- DWORD dwDrivemap;
- CHAR szDriveName[4];
- HKEY hkey;
-
- TRACE("(%p)->(flags=0x%08lx) \n",This,dwFlags);
-
- /*enumerate the folders*/
- if(dwFlags & SHCONTF_FOLDERS)
- {
- dwDrivemap = GetLogicalDrives();
- strcpy (szDriveName,"A:\\");
- while (szDriveName[0]<='Z')
- {
- if(dwDrivemap & 0x00000001L)
- {
- pidl = _ILCreateDrive(szDriveName);
- if(pidl)
- {
- if(!AddToEnumList((IEnumIDList*)This, pidl))
- return FALSE;
- }
- }
- szDriveName[0]++;
- dwDrivemap = dwDrivemap >> 1;
- }
-
- TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n",This);
- if (! RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\mycomputer\\NameSpace", 0, KEY_READ, &hkey))
- {
- char iid[50];
- int i=0;
-
- while (1)
- {
- DWORD size = sizeof (iid);
-
- if (ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL))
- break;
-
- pidl = _ILCreateGuidFromStrA(iid);
-
- if(pidl)
- AddToEnumList((IEnumIDList*)This, pidl);
-
- i++;
- }
- RegCloseKey(hkey);
- }
- }
- return TRUE;
+ do
+ {
+ if ( !(stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+ || (dwFlags & SHCONTF_INCLUDEHIDDEN) )
+ {
+ if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
+ dwFlags & SHCONTF_FOLDERS &&
+ strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, ".."))
+ {
+ pidl = _ILCreateFromFindDataA(&stffile);
+ succeeded = succeeded && AddToEnumList(list, pidl);
+ }
+ else if (!(stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ && dwFlags & SHCONTF_NONFOLDERS)
+ {
+ pidl = _ILCreateFromFindDataA(&stffile);
+ succeeded = succeeded && AddToEnumList(list, pidl);
+ }
+ }
+ if (succeeded)
+ {
+ if (!FindNextFileA(hFile, &stffile))
+ {
+ if (GetLastError() == ERROR_NO_MORE_FILES)
+ findFinished = TRUE;
+ else
+ succeeded = FALSE;
+ }
+ }
+ } while (succeeded && !findFinished);
+ FindClose(hFile);
+ }
+ return succeeded;
}
/**************************************************************************
@@ -332,46 +203,6 @@
return (IEnumIDList*)lpeidl;
}
-IEnumIDList * IEnumIDList_BadConstructor(
- LPCSTR lpszPath,
- DWORD dwFlags,
- DWORD dwKind)
-{
- IEnumIDListImpl* lpeidl;
- BOOL ret = FALSE;
-
- TRACE("()->(%s flags=0x%08lx kind=0x%08lx)\n",debugstr_a(lpszPath),dwFlags, dwKind);
-
- lpeidl = (IEnumIDListImpl *)IEnumIDList_Constructor();
-
- if (lpeidl)
- {
- switch (dwKind)
- {
- case EIDL_DESK:
- ret = CreateDesktopEnumList((IEnumIDList*)lpeidl, dwFlags);
- break;
-
- case EIDL_MYCOMP:
- ret = CreateMyCompEnumList((IEnumIDList*)lpeidl, dwFlags);
- break;
-
- case EIDL_FILE:
- ret = CreateFolderEnumList((IEnumIDList*)lpeidl, lpszPath, dwFlags);
- break;
- }
-
- if(!ret) {
- HeapFree(GetProcessHeap(),0,lpeidl);
- lpeidl = NULL;
- }
- }
-
- TRACE("-- (%p)->()\n",lpeidl);
-
- return (IEnumIDList*)lpeidl;
-}
-
/**************************************************************************
* EnumIDList_QueryInterface
*/
diff --git a/dlls/shell32/enumidlist.h b/dlls/shell32/enumidlist.h
index 63c445f..53b8b5f 100644
--- a/dlls/shell32/enumidlist.h
+++ b/dlls/shell32/enumidlist.h
@@ -18,16 +18,13 @@
#include "shlobj.h"
+/* Creates an IEnumIDList; add LPITEMIDLISTs to it with AddToEnumList. */
LPENUMIDLIST IEnumIDList_Constructor(void);
-BOOL AddToEnumList(IEnumIDList * iface, LPITEMIDLIST pidl);
+BOOL AddToEnumList(IEnumIDList *list, LPITEMIDLIST pidl);
-/* old interface that's going away soon: */
-/* kind of enumidlist */
-#define EIDL_DESK 0
-#define EIDL_MYCOMP 1
-#define EIDL_FILE 2
-
-IEnumIDList * IEnumIDList_BadConstructor(LPCSTR lpszPath, DWORD dwFlags,
- DWORD dwKind);
+/* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and
+ * adds them to the already-created list.
+ */
+BOOL CreateFolderEnumList(IEnumIDList *list, LPCSTR lpszPath, DWORD dwFlags);
#endif /* ndef __ENUMIDLIST_H__ */
diff --git a/dlls/shell32/shfldr_desktop.c b/dlls/shell32/shfldr_desktop.c
index 51ad618..4559912 100644
--- a/dlls/shell32/shfldr_desktop.c
+++ b/dlls/shell32/shfldr_desktop.c
@@ -261,6 +261,59 @@
}
/**************************************************************************
+ * CreateDesktopEnumList()
+ */
+static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags)
+{
+ BOOL ret = TRUE;
+ char szPath[MAX_PATH];
+
+ TRACE("(%p)->(flags=0x%08lx) \n",list,dwFlags);
+
+ /*enumerate the root folders */
+ if(dwFlags & SHCONTF_FOLDERS)
+ {
+ HKEY hkey;
+
+ /*create the pidl for This item */
+ ret = AddToEnumList(list, _ILCreateMyComputer());
+
+ if (ret && !RegOpenKeyExA(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\desktop\\NameSpace",
+ 0, KEY_READ, &hkey))
+ {
+ char iid[50];
+ int i=0;
+ BOOL moreKeys = TRUE;
+
+ while (ret && moreKeys)
+ {
+ DWORD size = sizeof (iid);
+ LONG apiRet = RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL,
+ NULL);
+
+ if (ERROR_SUCCESS == apiRet)
+ {
+ ret = AddToEnumList(list, _ILCreateGuidFromStrA(iid));
+ i++;
+ }
+ else if (ERROR_NO_MORE_ITEMS == apiRet)
+ moreKeys = FALSE;
+ else
+ ret = FALSE;
+ }
+ RegCloseKey(hkey);
+ }
+ }
+
+ /*enumerate the elements in %windir%\desktop */
+ SHGetSpecialFolderPathA(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);
+ ret = ret && CreateFolderEnumList(list, szPath, dwFlags);
+
+ return ret;
+}
+
+/**************************************************************************
* ISF_Desktop_fnEnumObjects
*/
static HRESULT WINAPI ISF_Desktop_fnEnumObjects (IShellFolder2 * iface,
@@ -270,7 +323,9 @@
TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList);
- *ppEnumIDList = IEnumIDList_BadConstructor (NULL, dwFlags, EIDL_DESK);
+ *ppEnumIDList = IEnumIDList_Constructor();
+ if (*ppEnumIDList)
+ CreateDesktopEnumList(*ppEnumIDList, dwFlags);
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
diff --git a/dlls/shell32/shfldr_fs.c b/dlls/shell32/shfldr_fs.c
index 90b60af..451df21 100644
--- a/dlls/shell32/shfldr_fs.c
+++ b/dlls/shell32/shfldr_fs.c
@@ -392,7 +392,9 @@
TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList);
- *ppEnumIDList = IEnumIDList_BadConstructor (This->sPathTarget, dwFlags, EIDL_FILE);
+ *ppEnumIDList = IEnumIDList_Constructor();
+ if (*ppEnumIDList)
+ CreateFolderEnumList(*ppEnumIDList, This->sPathTarget, dwFlags);
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
diff --git a/dlls/shell32/shfldr_mycomp.c b/dlls/shell32/shfldr_mycomp.c
index 34963bd..bc6bf16 100644
--- a/dlls/shell32/shfldr_mycomp.c
+++ b/dlls/shell32/shfldr_mycomp.c
@@ -238,6 +238,62 @@
}
/**************************************************************************
+ * CreateMyCompEnumList()
+ */
+static BOOL CreateMyCompEnumList(IEnumIDList *list, DWORD dwFlags)
+{
+ BOOL ret = TRUE;
+
+ TRACE("(%p)->(flags=0x%08lx) \n",list,dwFlags);
+
+ /*enumerate the folders*/
+ if(dwFlags & SHCONTF_FOLDERS)
+ {
+ CHAR szDriveName[] = "A:\\";
+ DWORD dwDrivemap = GetLogicalDrives();
+ HKEY hkey;
+
+ while (ret && szDriveName[0]<='Z')
+ {
+ if(dwDrivemap & 0x00000001L)
+ ret = AddToEnumList(list, _ILCreateDrive(szDriveName));
+ szDriveName[0]++;
+ dwDrivemap = dwDrivemap >> 1;
+ }
+
+ TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n",list);
+ if (ret && !RegOpenKeyExA(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\mycomputer\\NameSpace",
+ 0, KEY_READ, &hkey))
+ {
+ char iid[50];
+ int i=0;
+
+ while (ret)
+ {
+ DWORD size = sizeof (iid);
+ LONG apiRet = RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL,
+ NULL);
+
+ if (ERROR_SUCCESS == apiRet)
+ {
+ /* FIXME: shell extensions, shouldn't the type be
+ * PT_SHELLEXT? */
+ ret = AddToEnumList(list, _ILCreateGuidFromStrA(iid));
+ i++;
+ }
+ else if (ERROR_NO_MORE_ITEMS == apiRet)
+ break;
+ else
+ ret = FALSE;
+ }
+ RegCloseKey(hkey);
+ }
+ }
+ return ret;
+}
+
+/**************************************************************************
* ISF_MyComputer_fnEnumObjects
*/
static HRESULT WINAPI
@@ -247,7 +303,9 @@
TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList);
- *ppEnumIDList = IEnumIDList_BadConstructor (NULL, dwFlags, EIDL_MYCOMP);
+ *ppEnumIDList = IEnumIDList_Constructor();
+ if (*ppEnumIDList)
+ CreateMyCompEnumList(*ppEnumIDList, dwFlags);
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);