// DirItem.h #ifndef __DIR_ITEM_H #define __DIR_ITEM_H #include "../../../Common/MyString.h" #include "../../../Windows/FileFind.h" #include "../../Common/UniqBlocks.h" #include "../../Archive/IArchive.h" struct CDirItem { UInt64 Size; FILETIME CTime; FILETIME ATime; FILETIME MTime; UString Name; #if defined(_WIN32) && !defined(UNDER_CE) // UString ShortName; CByteBuffer ReparseData; CByteBuffer ReparseData2; // fixed (reduced) absolute links bool AreReparseData() const { return ReparseData.Size() != 0 || ReparseData2.Size() != 0; } #endif UInt32 Attrib; int PhyParent; int LogParent; int SecureIndex; bool IsAltStream; CDirItem(): PhyParent(-1), LogParent(-1), SecureIndex(-1), IsAltStream(false) {} bool IsDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; } }; class CDirItems { UStringVector Prefixes; CIntVector PhyParents; CIntVector LogParents; UString GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const; void EnumerateDir(int phyParent, int logParent, const FString &phyPrefix); public: CObjectVector Items; bool SymLinks; bool ScanAltStreams; FStringVector ErrorPaths; CRecordVector ErrorCodes; UInt64 TotalSize; #ifndef UNDER_CE void SetLinkInfo(CDirItem &dirItem, const NWindows::NFile::NFind::CFileInfo &fi, const FString &phyPrefix); #endif void AddError(const FString &path, DWORD errorCode) { ErrorCodes.Add(errorCode); ErrorPaths.Add(path); } void AddError(const FString &path) { AddError(path, ::GetLastError()); } #if defined(_WIN32) && !defined(UNDER_CE) CUniqBlocks SecureBlocks; CByteBuffer TempSecureBuf; bool _saclEnabled; bool ReadSecure; void AddSecurityItem(const FString &path, int &secureIndex); #endif CDirItems(); int GetNumFolders() const { return Prefixes.Size(); } UString GetPhyPath(unsigned index) const; UString GetLogPath(unsigned index) const; unsigned AddPrefix(int phyParent, int logParent, const UString &prefix); void DeleteLastPrefix(); void EnumerateItems2( const FString &phyPrefix, const UString &logPrefix, const FStringVector &filePaths, FStringVector *requestedPaths); #if defined(_WIN32) && !defined(UNDER_CE) void FillFixedReparse(); #endif void ReserveDown(); }; struct CArcItem { UInt64 Size; FILETIME MTime; UString Name; bool IsDir; bool IsAltStream; bool SizeDefined; bool MTimeDefined; bool Censored; UInt32 IndexInServer; int TimeType; CArcItem(): IsDir(false), IsAltStream(false), SizeDefined(false), MTimeDefined(false), Censored(false), TimeType(-1) {} }; #endif