mirror of
https://github.com/reactos/reactos.git
synced 2026-06-02 17:31:23 +08:00
[SHELL32] Optimize change notification (#3030)
- Keep the directory lists only. - Don't remember file sizes and normal file paths. CORE-13950
This commit is contained in:
committed by
GitHub
parent
1c40070561
commit
1f31905ecd
122
dll/win32/shell32/shelldesktop/CDirectoryList.cpp
Normal file
122
dll/win32/shell32/shelldesktop/CDirectoryList.cpp
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* PROJECT: shell32
|
||||
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
|
||||
* PURPOSE: Shell change notification
|
||||
* COPYRIGHT: Copyright 2020 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
|
||||
*/
|
||||
#include "shelldesktop.h"
|
||||
#include "CDirectoryList.h"
|
||||
#include <assert.h> // for assert
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(shcn);
|
||||
|
||||
BOOL CDirectoryList::ContainsPath(LPCWSTR pszPath) const
|
||||
{
|
||||
assert(!PathIsRelativeW(pszPath));
|
||||
|
||||
for (INT i = 0; i < m_items.GetSize(); ++i)
|
||||
{
|
||||
if (m_items[i].IsEmpty())
|
||||
continue;
|
||||
|
||||
if (m_items[i].EqualPath(pszPath))
|
||||
return TRUE; // matched
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL CDirectoryList::AddPath(LPCWSTR pszPath)
|
||||
{
|
||||
assert(!PathIsRelativeW(pszPath));
|
||||
return m_items.Add(pszPath);
|
||||
}
|
||||
|
||||
BOOL CDirectoryList::RenamePath(LPCWSTR pszPath1, LPCWSTR pszPath2)
|
||||
{
|
||||
assert(!PathIsRelativeW(pszPath1));
|
||||
assert(!PathIsRelativeW(pszPath2));
|
||||
|
||||
for (INT i = 0; i < m_items.GetSize(); ++i)
|
||||
{
|
||||
if (m_items[i].EqualPath(pszPath1))
|
||||
{
|
||||
// matched
|
||||
m_items[i].SetPath(pszPath2);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL CDirectoryList::DeletePath(LPCWSTR pszPath)
|
||||
{
|
||||
assert(!PathIsRelativeW(pszPath));
|
||||
|
||||
for (INT i = 0; i < m_items.GetSize(); ++i)
|
||||
{
|
||||
if (m_items[i].EqualPath(pszPath))
|
||||
{
|
||||
// matched
|
||||
m_items[i].SetPath(NULL);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL CDirectoryList::AddPathsFromDirectory(LPCWSTR pszDirectoryPath)
|
||||
{
|
||||
// get the full path
|
||||
WCHAR szPath[MAX_PATH];
|
||||
lstrcpynW(szPath, pszDirectoryPath, _countof(szPath));
|
||||
assert(!PathIsRelativeW(szPath));
|
||||
|
||||
// is it a directory?
|
||||
if (!PathIsDirectoryW(szPath))
|
||||
return FALSE;
|
||||
|
||||
// add the path
|
||||
if (!AddPath(szPath))
|
||||
return FALSE;
|
||||
|
||||
// enumerate the file items to remember
|
||||
PathAppendW(szPath, L"*");
|
||||
WIN32_FIND_DATAW find;
|
||||
HANDLE hFind = FindFirstFileW(szPath, &find);
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
ERR("FindFirstFileW failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
LPWSTR pch;
|
||||
do
|
||||
{
|
||||
// ignore "." and ".."
|
||||
pch = find.cFileName;
|
||||
if (pch[0] == L'.' && (pch[1] == 0 || (pch[1] == L'.' && pch[2] == 0)))
|
||||
continue;
|
||||
|
||||
// build a path
|
||||
PathRemoveFileSpecW(szPath);
|
||||
if (lstrlenW(szPath) + lstrlenW(find.cFileName) + 1 > MAX_PATH)
|
||||
{
|
||||
ERR("szPath is too long\n");
|
||||
continue;
|
||||
}
|
||||
PathAppendW(szPath, find.cFileName);
|
||||
|
||||
// add the path and do recurse
|
||||
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
if (m_fRecursive)
|
||||
AddPathsFromDirectory(szPath);
|
||||
else
|
||||
AddPath(szPath);
|
||||
}
|
||||
} while (FindNextFileW(hFind, &find));
|
||||
|
||||
FindClose(hFind);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
Reference in New Issue
Block a user