1 // DirItem.h 2 3 #ifndef __DIR_ITEM_H 4 #define __DIR_ITEM_H 5 6 #include "../../../Common/MyString.h" 7 8 #include "../../../Windows/FileFind.h" 9 10 #include "../../Common/UniqBlocks.h" 11 12 #include "../../Archive/IArchive.h" 13 14 struct CDirItem 15 { 16 UInt64 Size; 17 FILETIME CTime; 18 FILETIME ATime; 19 FILETIME MTime; 20 UString Name; 21 22 #if defined(_WIN32) && !defined(UNDER_CE) 23 // UString ShortName; 24 CByteBuffer ReparseData; 25 CByteBuffer ReparseData2; // fixed (reduced) absolute links 26 AreReparseDataCDirItem27 bool AreReparseData() const { return ReparseData.Size() != 0 || ReparseData2.Size() != 0; } 28 #endif 29 30 UInt32 Attrib; 31 int PhyParent; 32 int LogParent; 33 int SecureIndex; 34 35 bool IsAltStream; 36 CDirItemCDirItem37 CDirItem(): PhyParent(-1), LogParent(-1), SecureIndex(-1), IsAltStream(false) {} IsDirCDirItem38 bool IsDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; } 39 }; 40 41 class CDirItems 42 { 43 UStringVector Prefixes; 44 CIntVector PhyParents; 45 CIntVector LogParents; 46 47 UString GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const; 48 49 void EnumerateDir(int phyParent, int logParent, const FString &phyPrefix); 50 51 public: 52 CObjectVector<CDirItem> Items; 53 54 bool SymLinks; 55 56 bool ScanAltStreams; 57 FStringVector ErrorPaths; 58 CRecordVector<DWORD> ErrorCodes; 59 UInt64 TotalSize; 60 61 62 #ifndef UNDER_CE 63 void SetLinkInfo(CDirItem &dirItem, const NWindows::NFile::NFind::CFileInfo &fi, 64 const FString &phyPrefix); 65 #endif 66 AddError(const FString & path,DWORD errorCode)67 void AddError(const FString &path, DWORD errorCode) 68 { 69 ErrorCodes.Add(errorCode); 70 ErrorPaths.Add(path); 71 } 72 AddError(const FString & path)73 void AddError(const FString &path) 74 { 75 AddError(path, ::GetLastError()); 76 } 77 78 #if defined(_WIN32) && !defined(UNDER_CE) 79 80 CUniqBlocks SecureBlocks; 81 CByteBuffer TempSecureBuf; 82 bool _saclEnabled; 83 bool ReadSecure; 84 85 void AddSecurityItem(const FString &path, int &secureIndex); 86 87 #endif 88 89 CDirItems(); 90 GetNumFolders()91 int GetNumFolders() const { return Prefixes.Size(); } 92 UString GetPhyPath(unsigned index) const; 93 UString GetLogPath(unsigned index) const; 94 95 unsigned AddPrefix(int phyParent, int logParent, const UString &prefix); 96 void DeleteLastPrefix(); 97 void EnumerateItems2( 98 const FString &phyPrefix, 99 const UString &logPrefix, 100 const FStringVector &filePaths, 101 FStringVector *requestedPaths); 102 103 #if defined(_WIN32) && !defined(UNDER_CE) 104 void FillFixedReparse(); 105 #endif 106 107 void ReserveDown(); 108 }; 109 110 struct CArcItem 111 { 112 UInt64 Size; 113 FILETIME MTime; 114 UString Name; 115 bool IsDir; 116 bool IsAltStream; 117 bool SizeDefined; 118 bool MTimeDefined; 119 bool Censored; 120 UInt32 IndexInServer; 121 int TimeType; 122 CArcItemCArcItem123 CArcItem(): IsDir(false), IsAltStream(false), SizeDefined(false), MTimeDefined(false), Censored(false), TimeType(-1) {} 124 }; 125 126 #endif 127