From c343d309f2d83ddac50dbda763522bd6559a287a Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sat, 15 Jul 2017 09:18:06 +0000 Subject: [PATCH] [SHELL32] - CDesktopFolder: Create the enumerators of the internal fs folders and add their items in its own list instead of calling CreateFolderEnumList which enumerates ... files. - Remove CEnumIDListBase::CreateFolderEnumList and move its code to CFileSysEnum::Initialize. svn path=/trunk/; revision=75350 --- reactos/dll/win32/shell32/CEnumIDListBase.cpp | 67 ------------------- reactos/dll/win32/shell32/CEnumIDListBase.h | 1 - .../win32/shell32/folders/CDesktopFolder.cpp | 41 +++++++++--- .../dll/win32/shell32/folders/CFSFolder.cpp | 60 ++++++++++++++++- 4 files changed, 88 insertions(+), 81 deletions(-) diff --git a/reactos/dll/win32/shell32/CEnumIDListBase.cpp b/reactos/dll/win32/shell32/CEnumIDListBase.cpp index bbf5435903b..c0ae7f1ec49 100644 --- a/reactos/dll/win32/shell32/CEnumIDListBase.cpp +++ b/reactos/dll/win32/shell32/CEnumIDListBase.cpp @@ -123,73 +123,6 @@ BOOL CEnumIDListBase::HasItemWithCLSID(LPITEMIDLIST pidl) return FALSE; } - -/************************************************************************** - * CreateFolderEnumList() - */ -BOOL CEnumIDListBase::CreateFolderEnumList( - LPCWSTR lpszPath, - DWORD dwFlags) -{ - WIN32_FIND_DATAW stffile; - HANDLE hFile; - WCHAR szPath[MAX_PATH]; - BOOL succeeded = TRUE; - static const WCHAR stars[] = { '*','.','*',0 }; - static const WCHAR dot[] = { '.',0 }; - static const WCHAR dotdot[] = { '.','.',0 }; - - TRACE("(%p)->(path=%s flags=0x%08x)\n", this, debugstr_w(lpszPath), dwFlags); - - if(!lpszPath || !lpszPath[0]) return FALSE; - - wcscpy(szPath, lpszPath); - PathAddBackslashW(szPath); - wcscat(szPath,stars); - - hFile = FindFirstFileW(szPath,&stffile); - if ( hFile != INVALID_HANDLE_VALUE ) - { - BOOL findFinished = FALSE; - - do - { - if ( !(stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) - || (dwFlags & SHCONTF_INCLUDEHIDDEN) ) - { - LPITEMIDLIST pidl = NULL; - - if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && - dwFlags & SHCONTF_FOLDERS && - strcmpW(stffile.cFileName, dot) && strcmpW(stffile.cFileName, dotdot)) - { - pidl = _ILCreateFromFindDataW(&stffile); - succeeded = succeeded && AddToEnumList(pidl); - } - else if (!(stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - && dwFlags & SHCONTF_NONFOLDERS) - { - pidl = _ILCreateFromFindDataW(&stffile); - succeeded = succeeded && AddToEnumList(pidl); - } - } - if (succeeded) - { - if (!FindNextFileW(hFile, &stffile)) - { - if (GetLastError() == ERROR_NO_MORE_FILES) - findFinished = TRUE; - else - succeeded = FALSE; - } - } - } while (succeeded && !findFinished); - FindClose(hFile); - } - - return succeeded; -} - /************************************************************************** * IEnumIDList_fnNext */ diff --git a/reactos/dll/win32/shell32/CEnumIDListBase.h b/reactos/dll/win32/shell32/CEnumIDListBase.h index 5a8a366abbe..80d9a012d55 100644 --- a/reactos/dll/win32/shell32/CEnumIDListBase.h +++ b/reactos/dll/win32/shell32/CEnumIDListBase.h @@ -37,7 +37,6 @@ public: BOOL AddToEnumList(LPITEMIDLIST pidl); BOOL DeleteList(); BOOL HasItemWithCLSID(LPITEMIDLIST pidl); - BOOL CreateFolderEnumList(LPCWSTR lpszPath, DWORD dwFlags); // *** IEnumIDList methods *** virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched); diff --git a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp index cead72f311a..b104e13e3f0 100644 --- a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp @@ -53,7 +53,7 @@ class CDesktopFolderEnum : public: CDesktopFolderEnum(); ~CDesktopFolderEnum(); - HRESULT WINAPI Initialize(CDesktopFolder *desktopFolder, HWND hwndOwner, DWORD dwFlags); + HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags, IEnumIDList *pDesktopEnumerator, IEnumIDList *pCommonDesktopEnumerator); BEGIN_COM_MAP(CDesktopFolderEnum) COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList) @@ -119,10 +119,10 @@ IsNamespaceExtensionHidden(const WCHAR *iid) * CreateDesktopEnumList() */ -HRESULT WINAPI CDesktopFolderEnum::Initialize(CDesktopFolder *desktopFolder, HWND hwndOwner, DWORD dwFlags) +HRESULT WINAPI CDesktopFolderEnum::Initialize(HWND hwndOwner, DWORD dwFlags, IEnumIDList *pDesktopEnumerator, IEnumIDList *pCommonDesktopEnumerator) { BOOL ret = TRUE; - WCHAR szPath[MAX_PATH]; + LPITEMIDLIST pidl; static const WCHAR MyDocumentsClassString[] = L"{450D8FBA-AD25-11D0-98A8-0800361B1103}"; static const WCHAR Desktop_NameSpaceW[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\Namespace"; @@ -153,7 +153,6 @@ HRESULT WINAPI CDesktopFolderEnum::Initialize(CDesktopFolder *desktopFolder, HWN if (dwResult == ERROR_SUCCESS) { WCHAR iid[50]; - LPITEMIDLIST pidl; int i = 0; while (ret) @@ -213,7 +212,7 @@ HRESULT WINAPI CDesktopFolderEnum::Initialize(CDesktopFolder *desktopFolder, HWN { if (Val == 0 && dwType == REG_DWORD) { - LPITEMIDLIST pidl = _ILCreateGuidFromStrW(iid); + pidl = _ILCreateGuidFromStrW(iid); if (pidl != NULL) { if (!HasItemWithCLSID(pidl)) @@ -238,12 +237,20 @@ HRESULT WINAPI CDesktopFolderEnum::Initialize(CDesktopFolder *desktopFolder, HWN } } - /* enumerate the elements in %windir%\desktop */ - ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); - ret = ret && CreateFolderEnumList(szPath, dwFlags); + DWORD dwFetched; - ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE); - ret = ret && CreateFolderEnumList(szPath, dwFlags); + /* Enumerate the items in the two fs folders */ + if (pDesktopEnumerator) + { + while((S_OK == pDesktopEnumerator->Next(1, &pidl, &dwFetched)) && dwFetched) + AddToEnumList(pidl); + } + + if (pCommonDesktopEnumerator) + { + while((S_OK == pCommonDesktopEnumerator->Next(1, &pidl, &dwFetched)) && dwFetched) + AddToEnumList(pidl); + } return ret ? S_OK : E_FAIL; } @@ -439,7 +446,19 @@ HRESULT WINAPI CDesktopFolder::ParseDisplayName( */ HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - return ShellObjectCreatorInit(this, hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); + CComPtr pDesktopEnumerator; + CComPtr pCommonDesktopEnumerator; + HRESULT hr; + + hr = m_DesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pDesktopEnumerator); + if (FAILED(hr)) + ERR("EnumObjects for desktop fs folder failed\n"); + + hr = m_SharedDesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pCommonDesktopEnumerator); + if (FAILED(hr)) + ERR("EnumObjects for shared desktop fs folder failed\n"); + + return ShellObjectCreatorInit(hwndOwner, dwFlags, pDesktopEnumerator, pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CFSFolder.cpp b/reactos/dll/win32/shell32/folders/CFSFolder.cpp index 0c986270ee6..54c06b492f6 100644 --- a/reactos/dll/win32/shell32/folders/CFSFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CFSFolder.cpp @@ -57,9 +57,65 @@ CFileSysEnum::~CFileSysEnum() { } -HRESULT WINAPI CFileSysEnum::Initialize(LPWSTR sPathTarget, DWORD dwFlags) +HRESULT WINAPI CFileSysEnum::Initialize(LPWSTR lpszPath, DWORD dwFlags) { - return CreateFolderEnumList(sPathTarget, dwFlags); + WIN32_FIND_DATAW stffile; + HANDLE hFile; + WCHAR szPath[MAX_PATH]; + BOOL succeeded = TRUE; + static const WCHAR stars[] = { '*','.','*',0 }; + static const WCHAR dot[] = { '.',0 }; + static const WCHAR dotdot[] = { '.','.',0 }; + + TRACE("(%p)->(path=%s flags=0x%08x)\n", this, debugstr_w(lpszPath), dwFlags); + + if(!lpszPath || !lpszPath[0]) return FALSE; + + wcscpy(szPath, lpszPath); + PathAddBackslashW(szPath); + wcscat(szPath,stars); + + hFile = FindFirstFileW(szPath,&stffile); + if ( hFile != INVALID_HANDLE_VALUE ) + { + BOOL findFinished = FALSE; + + do + { + if ( !(stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) + || (dwFlags & SHCONTF_INCLUDEHIDDEN) ) + { + LPITEMIDLIST pidl = NULL; + + if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + dwFlags & SHCONTF_FOLDERS && + strcmpW(stffile.cFileName, dot) && strcmpW(stffile.cFileName, dotdot)) + { + pidl = _ILCreateFromFindDataW(&stffile); + succeeded = succeeded && AddToEnumList(pidl); + } + else if (!(stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + && dwFlags & SHCONTF_NONFOLDERS) + { + pidl = _ILCreateFromFindDataW(&stffile); + succeeded = succeeded && AddToEnumList(pidl); + } + } + if (succeeded) + { + if (!FindNextFileW(hFile, &stffile)) + { + if (GetLastError() == ERROR_NO_MORE_FILES) + findFinished = TRUE; + else + succeeded = FALSE; + } + } + } while (succeeded && !findFinished); + FindClose(hFile); + } + + return succeeded; } CFSFolder::CFSFolder()