ReactOS 0.4.16-dev-1025-gd3456f5
CFileSysEnum Class Reference
Inheritance diagram for CFileSysEnum:
Collaboration diagram for CFileSysEnum:

Public Member Functions

 CFileSysEnum ()
 
 ~CFileSysEnum ()
 
HRESULT WINAPI Initialize (LPWSTR sPathTarget, DWORD dwFlags)
 
- Public Member Functions inherited from CEnumIDListBase
 CEnumIDListBase ()
 
virtual ~CEnumIDListBase ()
 
BOOL AddToEnumList (LPITEMIDLIST pidl)
 
BOOL DeleteList ()
 
BOOL HasItemWithCLSID (LPITEMIDLIST pidl)
 
HRESULT AppendItemsFromEnumerator (IEnumIDList *pEnum)
 
template<class T >
BOOL HasItemWithCLSIDImpl (LPCITEMIDLIST pidl)
 
STDMETHOD() Next (ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched) override
 
STDMETHOD() Skip (ULONG celt) override
 
STDMETHOD() Reset () override
 
STDMETHOD() Clone (IEnumIDList **ppenum) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
- Public Member Functions inherited from IEnumIDList
HRESULT Next ([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] PITEMID_CHILD *rgelt, [out] ULONG *pceltFetched)
 
HRESULT Skip ([in] ULONG celt)
 
HRESULT Reset ()
 
HRESULT Clone ([out] IEnumIDList **ppenum)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 

Private Member Functions

HRESULT _AddFindResult (LPWSTR sParentDir, const WIN32_FIND_DATAW &FindData, DWORD dwFlags)
 

Additional Inherited Members

- Public Types inherited from IEnumIDList
typedef IEnumIDListLPENUMIDLIST
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 
- Protected Attributes inherited from CEnumIDListBase
ENUMLISTmpFirst
 
ENUMLISTmpLast
 
ENUMLISTmpCurrent
 

Detailed Description

Definition at line 400 of file CFSFolder.cpp.

Constructor & Destructor Documentation

◆ CFileSysEnum()

CFileSysEnum::CFileSysEnum ( )
inline

Definition at line 498 of file CFSFolder.cpp.

499 {
500
501 }

◆ ~CFileSysEnum()

CFileSysEnum::~CFileSysEnum ( )
inline

Definition at line 503 of file CFSFolder.cpp.

504 {
505 }

Member Function Documentation

◆ _AddFindResult()

HRESULT CFileSysEnum::_AddFindResult ( LPWSTR  sParentDir,
const WIN32_FIND_DATAW FindData,
DWORD  dwFlags 
)
inlineprivate

Definition at line 404 of file CFSFolder.cpp.

405 {
406#define SUPER_HIDDEN (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)
407
408 // Does it need special handling because it is hidden?
409 if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
410 {
411 DWORD dwHidden = FindData.dwFileAttributes & SUPER_HIDDEN;
412
413 // Is it hidden, but are we not asked to include hidden?
414 if (dwHidden == FILE_ATTRIBUTE_HIDDEN && !(dwFlags & SHCONTF_INCLUDEHIDDEN))
415 return S_OK;
416
417 // Is it a system file, but are we not asked to include those?
418 if (dwHidden == SUPER_HIDDEN && !(dwFlags & SHCONTF_INCLUDESUPERHIDDEN))
419 return S_OK;
420 }
421
422 BOOL bDirectory = (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
423
424 HRESULT hr;
425 if (bDirectory)
426 {
427 // Skip the current and parent directory nodes
428 if (!strcmpW(FindData.cFileName, L".") || !strcmpW(FindData.cFileName, L".."))
429 return S_OK;
430
431 // Does this directory need special handling?
432 if ((FindData.dwFileAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
433 {
434 WCHAR Tmp[MAX_PATH];
435 CLSID clsidFolder;
436
437 PathCombineW(Tmp, sParentDir, FindData.cFileName);
438
439 hr = SHELL32_GetCLSIDForDirectory(Tmp, L"CLSID", &clsidFolder);
440 if (SUCCEEDED(hr))
441 {
442 ERR("Got CLSID override for '%S'\n", Tmp);
443 }
444 }
445 }
446 else
447 {
448 CLSID clsidFile;
449 LPWSTR pExtension = PathFindExtensionW(FindData.cFileName);
450 if (pExtension)
451 {
452 // FIXME: Cache this?
453 hr = GetCLSIDForFileTypeFromExtension(pExtension, L"CLSID", &clsidFile);
454 if (hr == S_OK)
455 {
456 HKEY hkey;
457 hr = SHRegGetCLSIDKeyW(clsidFile, L"ShellFolder", FALSE, FALSE, &hkey);
458 if (SUCCEEDED(hr))
459 {
460 ::RegCloseKey(hkey);
461
462 // This should be presented as directory!
463 bDirectory = TRUE;
464 TRACE("Treating '%S' as directory!\n", FindData.cFileName);
465 }
466 }
467 }
468 }
469
470 LPITEMIDLIST pidl = NULL;
471 if (bDirectory)
472 {
473 if (dwFlags & SHCONTF_FOLDERS)
474 {
475 TRACE("(%p)-> (folder=%s)\n", this, debugstr_w(FindData.cFileName));
476 pidl = _ILCreateFromFindDataW(&FindData);
477 }
478 }
479 else
480 {
481 if (dwFlags & SHCONTF_NONFOLDERS)
482 {
483 TRACE("(%p)-> (file =%s)\n", this, debugstr_w(FindData.cFileName));
484 pidl = _ILCreateFromFindDataW(&FindData);
485 }
486 }
487
488 if (pidl && !AddToEnumList(pidl))
489 {
491 return E_FAIL;
492 }
493
494 return S_OK;
495 }
#define ERR(fmt,...)
Definition: precomp.h:57
#define RegCloseKey(hKey)
Definition: registry.h:49
BOOL AddToEnumList(LPITEMIDLIST pidl)
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
static HRESULT SHELL32_GetCLSIDForDirectory(LPCWSTR pwszDir, LPCWSTR KeyName, CLSID *pclsidFolder)
Definition: CFSFolder.cpp:614
#define SUPER_HIDDEN
static HRESULT GetCLSIDForFileTypeFromExtension(LPCWSTR pExtension, LPCWSTR KeyName, CLSID *pclsid)
Definition: CFSFolder.cpp:109
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
HRESULT WINAPI SHRegGetCLSIDKeyW(REFGUID, LPCWSTR, BOOL, BOOL, PHKEY)
Definition: reg.c:2422
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_w
Definition: kernel32.h:32
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define L(x)
Definition: ntvdm.h:50
#define PathCombineW
Definition: pathcch.h:317
LPITEMIDLIST _ILCreateFromFindDataW(const WIN32_FIND_DATAW *wfd)
Definition: pidl.c:1933
#define strcmpW(s1, s2)
Definition: unicode.h:44
HRESULT hr
Definition: shlfolder.c:183
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define TRACE(s)
Definition: solgame.cpp:4
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by Initialize().

◆ Initialize()

HRESULT WINAPI CFileSysEnum::Initialize ( LPWSTR  sPathTarget,
DWORD  dwFlags 
)
inline

Definition at line 507 of file CFSFolder.cpp.

508 {
509 TRACE("(%p)->(path=%s flags=0x%08x)\n", this, debugstr_w(sPathTarget), dwFlags);
510
511 if (!sPathTarget || !sPathTarget[0])
512 {
513 WARN("No path for CFileSysEnum, empty result!\n");
514 return S_FALSE;
515 }
516
517 WCHAR szFindPattern[MAX_PATH];
518 HRESULT hr = StringCchCopyW(szFindPattern, _countof(szFindPattern), sPathTarget);
520 return hr;
521
522 /* FIXME: UNSAFE CRAP */
523 PathAddBackslashW(szFindPattern);
524
525 hr = StringCchCatW(szFindPattern, _countof(szFindPattern), L"*.*");
527 return hr;
528
529
530 WIN32_FIND_DATAW FindData;
531 HANDLE hFind = FindFirstFileW(szFindPattern, &FindData);
532 if (hFind == INVALID_HANDLE_VALUE)
534
535 do
536 {
537 hr = _AddFindResult(sPathTarget, FindData, dwFlags);
538
540 break;
541
542 } while(FindNextFileW(hFind, &FindData));
543
544 if (SUCCEEDED(hr))
545 {
546 DWORD dwError = GetLastError();
547 if (dwError != ERROR_NO_MORE_FILES)
548 {
549 hr = HRESULT_FROM_WIN32(dwError);
551 }
552 }
553 TRACE("(%p)->(hr=0x%08x)\n", this, hr);
554 FindClose(hFind);
555 return hr;
556 }
#define WARN(fmt,...)
Definition: precomp.h:61
HRESULT _AddFindResult(LPWSTR sParentDir, const WIN32_FIND_DATAW &FindData, DWORD dwFlags)
Definition: CFSFolder.cpp:404
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
#define PathAddBackslashW
Definition: pathcch.h:301
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define S_FALSE
Definition: winerror.h:2357
#define ERROR_NO_MORE_FILES
Definition: winerror.h:121
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92

The documentation for this class was generated from the following file: