mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 04:13:34 +00:00
[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
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<CDesktopFolderEnum>(this, hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
CComPtr<IEnumIDList> pDesktopEnumerator;
|
||||
CComPtr<IEnumIDList> 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<CDesktopFolderEnum>(hwndOwner, dwFlags, pDesktopEnumerator, pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user