1*f6dc9357SAndroid Build Coastguard Worker // DirItem.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_DIR_ITEM_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_DIR_ITEM_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyLinux.h" 8*f6dc9357SAndroid Build Coastguard Worker #endif 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h" 13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h" 14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/TimeUtils.h" 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/UniqBlocks.h" 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h" 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker struct CDirItemsStat 21*f6dc9357SAndroid Build Coastguard Worker { 22*f6dc9357SAndroid Build Coastguard Worker UInt64 NumDirs; 23*f6dc9357SAndroid Build Coastguard Worker UInt64 NumFiles; 24*f6dc9357SAndroid Build Coastguard Worker UInt64 NumAltStreams; 25*f6dc9357SAndroid Build Coastguard Worker UInt64 FilesSize; 26*f6dc9357SAndroid Build Coastguard Worker UInt64 AltStreamsSize; 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker UInt64 NumErrors; 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker // UInt64 Get_NumItems() const { return NumDirs + NumFiles + NumAltStreams; } Get_NumDataItemsCDirItemsStat31*f6dc9357SAndroid Build Coastguard Worker UInt64 Get_NumDataItems() const { return NumFiles + NumAltStreams; } GetTotalBytesCDirItemsStat32*f6dc9357SAndroid Build Coastguard Worker UInt64 GetTotalBytes() const { return FilesSize + AltStreamsSize; } 33*f6dc9357SAndroid Build Coastguard Worker IsEmptyCDirItemsStat34*f6dc9357SAndroid Build Coastguard Worker bool IsEmpty() const { return 35*f6dc9357SAndroid Build Coastguard Worker 0 == NumDirs 36*f6dc9357SAndroid Build Coastguard Worker && 0 == NumFiles 37*f6dc9357SAndroid Build Coastguard Worker && 0 == NumAltStreams 38*f6dc9357SAndroid Build Coastguard Worker && 0 == FilesSize 39*f6dc9357SAndroid Build Coastguard Worker && 0 == AltStreamsSize 40*f6dc9357SAndroid Build Coastguard Worker && 0 == NumErrors; } 41*f6dc9357SAndroid Build Coastguard Worker CDirItemsStatCDirItemsStat42*f6dc9357SAndroid Build Coastguard Worker CDirItemsStat(): 43*f6dc9357SAndroid Build Coastguard Worker NumDirs(0), 44*f6dc9357SAndroid Build Coastguard Worker NumFiles(0), 45*f6dc9357SAndroid Build Coastguard Worker NumAltStreams(0), 46*f6dc9357SAndroid Build Coastguard Worker FilesSize(0), 47*f6dc9357SAndroid Build Coastguard Worker AltStreamsSize(0), 48*f6dc9357SAndroid Build Coastguard Worker NumErrors(0) 49*f6dc9357SAndroid Build Coastguard Worker {} 50*f6dc9357SAndroid Build Coastguard Worker }; 51*f6dc9357SAndroid Build Coastguard Worker 52*f6dc9357SAndroid Build Coastguard Worker 53*f6dc9357SAndroid Build Coastguard Worker struct CDirItemsStat2: public CDirItemsStat 54*f6dc9357SAndroid Build Coastguard Worker { 55*f6dc9357SAndroid Build Coastguard Worker UInt64 Anti_NumDirs; 56*f6dc9357SAndroid Build Coastguard Worker UInt64 Anti_NumFiles; 57*f6dc9357SAndroid Build Coastguard Worker UInt64 Anti_NumAltStreams; 58*f6dc9357SAndroid Build Coastguard Worker 59*f6dc9357SAndroid Build Coastguard Worker // UInt64 Get_NumItems() const { return Anti_NumDirs + Anti_NumFiles + Anti_NumAltStreams + CDirItemsStat::Get_NumItems(); } Get_NumDataItems2CDirItemsStat260*f6dc9357SAndroid Build Coastguard Worker UInt64 Get_NumDataItems2() const { return Anti_NumFiles + Anti_NumAltStreams + CDirItemsStat::Get_NumDataItems(); } 61*f6dc9357SAndroid Build Coastguard Worker IsEmptyCDirItemsStat262*f6dc9357SAndroid Build Coastguard Worker bool IsEmpty() const { return CDirItemsStat::IsEmpty() 63*f6dc9357SAndroid Build Coastguard Worker && 0 == Anti_NumDirs 64*f6dc9357SAndroid Build Coastguard Worker && 0 == Anti_NumFiles 65*f6dc9357SAndroid Build Coastguard Worker && 0 == Anti_NumAltStreams; } 66*f6dc9357SAndroid Build Coastguard Worker CDirItemsStat2CDirItemsStat267*f6dc9357SAndroid Build Coastguard Worker CDirItemsStat2(): 68*f6dc9357SAndroid Build Coastguard Worker Anti_NumDirs(0), 69*f6dc9357SAndroid Build Coastguard Worker Anti_NumFiles(0), 70*f6dc9357SAndroid Build Coastguard Worker Anti_NumAltStreams(0) 71*f6dc9357SAndroid Build Coastguard Worker {} 72*f6dc9357SAndroid Build Coastguard Worker }; 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN 76*f6dc9357SAndroid Build Coastguard Worker 77*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEN_IDirItemsCallback(x) \ 78*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT ScanError(const FString &path, DWORD systemError) x \ 79*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT ScanProgress(const CDirItemsStat &st, const FString &path, bool isDir) x \ 80*f6dc9357SAndroid Build Coastguard Worker 81*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_DECL_PURE(IDirItemsCallback) 82*f6dc9357SAndroid Build Coastguard Worker 83*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker 86*f6dc9357SAndroid Build Coastguard Worker struct CArcTime 87*f6dc9357SAndroid Build Coastguard Worker { 88*f6dc9357SAndroid Build Coastguard Worker FILETIME FT; 89*f6dc9357SAndroid Build Coastguard Worker UInt16 Prec; 90*f6dc9357SAndroid Build Coastguard Worker Byte Ns100; 91*f6dc9357SAndroid Build Coastguard Worker bool Def; 92*f6dc9357SAndroid Build Coastguard Worker CArcTimeCArcTime93*f6dc9357SAndroid Build Coastguard Worker CArcTime() 94*f6dc9357SAndroid Build Coastguard Worker { 95*f6dc9357SAndroid Build Coastguard Worker Clear(); 96*f6dc9357SAndroid Build Coastguard Worker } 97*f6dc9357SAndroid Build Coastguard Worker ClearCArcTime98*f6dc9357SAndroid Build Coastguard Worker void Clear() 99*f6dc9357SAndroid Build Coastguard Worker { 100*f6dc9357SAndroid Build Coastguard Worker FT.dwHighDateTime = FT.dwLowDateTime = 0; 101*f6dc9357SAndroid Build Coastguard Worker Prec = 0; 102*f6dc9357SAndroid Build Coastguard Worker Ns100 = 0; 103*f6dc9357SAndroid Build Coastguard Worker Def = false; 104*f6dc9357SAndroid Build Coastguard Worker } 105*f6dc9357SAndroid Build Coastguard Worker IsZeroCArcTime106*f6dc9357SAndroid Build Coastguard Worker bool IsZero() const 107*f6dc9357SAndroid Build Coastguard Worker { 108*f6dc9357SAndroid Build Coastguard Worker return FT.dwLowDateTime == 0 && FT.dwHighDateTime == 0 && Ns100 == 0; 109*f6dc9357SAndroid Build Coastguard Worker } 110*f6dc9357SAndroid Build Coastguard Worker CompareWithCArcTime111*f6dc9357SAndroid Build Coastguard Worker int CompareWith(const CArcTime &a) const 112*f6dc9357SAndroid Build Coastguard Worker { 113*f6dc9357SAndroid Build Coastguard Worker const int res = CompareFileTime(&FT, &a.FT); 114*f6dc9357SAndroid Build Coastguard Worker if (res != 0) 115*f6dc9357SAndroid Build Coastguard Worker return res; 116*f6dc9357SAndroid Build Coastguard Worker if (Ns100 < a.Ns100) return -1; 117*f6dc9357SAndroid Build Coastguard Worker if (Ns100 > a.Ns100) return 1; 118*f6dc9357SAndroid Build Coastguard Worker return 0; 119*f6dc9357SAndroid Build Coastguard Worker } 120*f6dc9357SAndroid Build Coastguard Worker Get_FILETIME_as_UInt64CArcTime121*f6dc9357SAndroid Build Coastguard Worker UInt64 Get_FILETIME_as_UInt64() const 122*f6dc9357SAndroid Build Coastguard Worker { 123*f6dc9357SAndroid Build Coastguard Worker return (((UInt64)FT.dwHighDateTime) << 32) + FT.dwLowDateTime; 124*f6dc9357SAndroid Build Coastguard Worker } 125*f6dc9357SAndroid Build Coastguard Worker Get_DosTimeCArcTime126*f6dc9357SAndroid Build Coastguard Worker UInt32 Get_DosTime() const 127*f6dc9357SAndroid Build Coastguard Worker { 128*f6dc9357SAndroid Build Coastguard Worker FILETIME ft2 = FT; 129*f6dc9357SAndroid Build Coastguard Worker if ((Prec == k_PropVar_TimePrec_Base + 8 || 130*f6dc9357SAndroid Build Coastguard Worker Prec == k_PropVar_TimePrec_Base + 9) 131*f6dc9357SAndroid Build Coastguard Worker && Ns100 != 0) 132*f6dc9357SAndroid Build Coastguard Worker { 133*f6dc9357SAndroid Build Coastguard Worker UInt64 u64 = Get_FILETIME_as_UInt64(); 134*f6dc9357SAndroid Build Coastguard Worker // we round up even small (ns < 100ns) as FileTimeToDosTime() 135*f6dc9357SAndroid Build Coastguard Worker if (u64 % 20000000 == 0) 136*f6dc9357SAndroid Build Coastguard Worker { 137*f6dc9357SAndroid Build Coastguard Worker u64++; 138*f6dc9357SAndroid Build Coastguard Worker ft2.dwHighDateTime = (DWORD)(u64 >> 32); 139*f6dc9357SAndroid Build Coastguard Worker ft2.dwHighDateTime = (DWORD)u64; 140*f6dc9357SAndroid Build Coastguard Worker } 141*f6dc9357SAndroid Build Coastguard Worker } 142*f6dc9357SAndroid Build Coastguard Worker // FileTimeToDosTime() is expected to round up in Windows 143*f6dc9357SAndroid Build Coastguard Worker UInt32 dosTime; 144*f6dc9357SAndroid Build Coastguard Worker // we use simplified code with utctime->dos. 145*f6dc9357SAndroid Build Coastguard Worker // do we need local time instead here? 146*f6dc9357SAndroid Build Coastguard Worker NWindows::NTime::FileTime_To_DosTime(ft2, dosTime); 147*f6dc9357SAndroid Build Coastguard Worker return dosTime; 148*f6dc9357SAndroid Build Coastguard Worker } 149*f6dc9357SAndroid Build Coastguard Worker GetNumDigitsCArcTime150*f6dc9357SAndroid Build Coastguard Worker int GetNumDigits() const 151*f6dc9357SAndroid Build Coastguard Worker { 152*f6dc9357SAndroid Build Coastguard Worker if (Prec == k_PropVar_TimePrec_Unix || 153*f6dc9357SAndroid Build Coastguard Worker Prec == k_PropVar_TimePrec_DOS) 154*f6dc9357SAndroid Build Coastguard Worker return 0; 155*f6dc9357SAndroid Build Coastguard Worker if (Prec == k_PropVar_TimePrec_HighPrec) 156*f6dc9357SAndroid Build Coastguard Worker return 9; 157*f6dc9357SAndroid Build Coastguard Worker if (Prec == k_PropVar_TimePrec_0) 158*f6dc9357SAndroid Build Coastguard Worker return 7; 159*f6dc9357SAndroid Build Coastguard Worker int digits = (int)Prec - (int)k_PropVar_TimePrec_Base; 160*f6dc9357SAndroid Build Coastguard Worker if (digits < 0) 161*f6dc9357SAndroid Build Coastguard Worker digits = 0; 162*f6dc9357SAndroid Build Coastguard Worker return digits; 163*f6dc9357SAndroid Build Coastguard Worker } 164*f6dc9357SAndroid Build Coastguard Worker Write_To_FiTimeCArcTime165*f6dc9357SAndroid Build Coastguard Worker void Write_To_FiTime(CFiTime &dest) const 166*f6dc9357SAndroid Build Coastguard Worker { 167*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 168*f6dc9357SAndroid Build Coastguard Worker dest = FT; 169*f6dc9357SAndroid Build Coastguard Worker #else 170*f6dc9357SAndroid Build Coastguard Worker if (FILETIME_To_timespec(FT, dest)) 171*f6dc9357SAndroid Build Coastguard Worker if ((Prec == k_PropVar_TimePrec_Base + 8 || 172*f6dc9357SAndroid Build Coastguard Worker Prec == k_PropVar_TimePrec_Base + 9) 173*f6dc9357SAndroid Build Coastguard Worker && Ns100 != 0) 174*f6dc9357SAndroid Build Coastguard Worker { 175*f6dc9357SAndroid Build Coastguard Worker dest.tv_nsec += Ns100; 176*f6dc9357SAndroid Build Coastguard Worker } 177*f6dc9357SAndroid Build Coastguard Worker #endif 178*f6dc9357SAndroid Build Coastguard Worker } 179*f6dc9357SAndroid Build Coastguard Worker 180*f6dc9357SAndroid Build Coastguard Worker // (Def) is not set Set_From_FILETIMECArcTime181*f6dc9357SAndroid Build Coastguard Worker void Set_From_FILETIME(const FILETIME &ft) 182*f6dc9357SAndroid Build Coastguard Worker { 183*f6dc9357SAndroid Build Coastguard Worker FT = ft; 184*f6dc9357SAndroid Build Coastguard Worker // Prec = k_PropVar_TimePrec_CompatNTFS; 185*f6dc9357SAndroid Build Coastguard Worker Prec = k_PropVar_TimePrec_Base + 7; 186*f6dc9357SAndroid Build Coastguard Worker Ns100 = 0; 187*f6dc9357SAndroid Build Coastguard Worker } 188*f6dc9357SAndroid Build Coastguard Worker 189*f6dc9357SAndroid Build Coastguard Worker // (Def) is not set 190*f6dc9357SAndroid Build Coastguard Worker // it set full form precision: k_PropVar_TimePrec_Base + numDigits Set_From_FiTimeCArcTime191*f6dc9357SAndroid Build Coastguard Worker void Set_From_FiTime(const CFiTime &ts) 192*f6dc9357SAndroid Build Coastguard Worker { 193*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 194*f6dc9357SAndroid Build Coastguard Worker FT = ts; 195*f6dc9357SAndroid Build Coastguard Worker Prec = k_PropVar_TimePrec_Base + 7; 196*f6dc9357SAndroid Build Coastguard Worker // Prec = k_PropVar_TimePrec_Base; // for debug 197*f6dc9357SAndroid Build Coastguard Worker // Prec = 0; // for debug 198*f6dc9357SAndroid Build Coastguard Worker Ns100 = 0; 199*f6dc9357SAndroid Build Coastguard Worker #else 200*f6dc9357SAndroid Build Coastguard Worker unsigned ns100; 201*f6dc9357SAndroid Build Coastguard Worker FiTime_To_FILETIME_ns100(ts, FT, ns100); 202*f6dc9357SAndroid Build Coastguard Worker Ns100 = (Byte)ns100; 203*f6dc9357SAndroid Build Coastguard Worker Prec = k_PropVar_TimePrec_Base + 9; 204*f6dc9357SAndroid Build Coastguard Worker #endif 205*f6dc9357SAndroid Build Coastguard Worker } 206*f6dc9357SAndroid Build Coastguard Worker Set_From_PropCArcTime207*f6dc9357SAndroid Build Coastguard Worker void Set_From_Prop(const PROPVARIANT &prop) 208*f6dc9357SAndroid Build Coastguard Worker { 209*f6dc9357SAndroid Build Coastguard Worker FT = prop.filetime; 210*f6dc9357SAndroid Build Coastguard Worker unsigned prec = 0; 211*f6dc9357SAndroid Build Coastguard Worker unsigned ns100 = 0; 212*f6dc9357SAndroid Build Coastguard Worker const unsigned prec_Temp = prop.wReserved1; 213*f6dc9357SAndroid Build Coastguard Worker if (prec_Temp != 0 214*f6dc9357SAndroid Build Coastguard Worker && prec_Temp <= k_PropVar_TimePrec_1ns 215*f6dc9357SAndroid Build Coastguard Worker && prop.wReserved3 == 0) 216*f6dc9357SAndroid Build Coastguard Worker { 217*f6dc9357SAndroid Build Coastguard Worker const unsigned ns100_Temp = prop.wReserved2; 218*f6dc9357SAndroid Build Coastguard Worker if (ns100_Temp < 100) 219*f6dc9357SAndroid Build Coastguard Worker { 220*f6dc9357SAndroid Build Coastguard Worker ns100 = ns100_Temp; 221*f6dc9357SAndroid Build Coastguard Worker prec = prec_Temp; 222*f6dc9357SAndroid Build Coastguard Worker } 223*f6dc9357SAndroid Build Coastguard Worker } 224*f6dc9357SAndroid Build Coastguard Worker Prec = (UInt16)prec; 225*f6dc9357SAndroid Build Coastguard Worker Ns100 = (Byte)ns100; 226*f6dc9357SAndroid Build Coastguard Worker Def = true; 227*f6dc9357SAndroid Build Coastguard Worker } 228*f6dc9357SAndroid Build Coastguard Worker }; 229*f6dc9357SAndroid Build Coastguard Worker 230*f6dc9357SAndroid Build Coastguard Worker 231*f6dc9357SAndroid Build Coastguard Worker struct CDirItem: public NWindows::NFile::NFind::CFileInfoBase 232*f6dc9357SAndroid Build Coastguard Worker { 233*f6dc9357SAndroid Build Coastguard Worker UString Name; 234*f6dc9357SAndroid Build Coastguard Worker 235*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE 236*f6dc9357SAndroid Build Coastguard Worker CByteBuffer ReparseData; 237*f6dc9357SAndroid Build Coastguard Worker 238*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 239*f6dc9357SAndroid Build Coastguard Worker // UString ShortName; 240*f6dc9357SAndroid Build Coastguard Worker CByteBuffer ReparseData2; // fixed (reduced) absolute links for WIM format AreReparseDataCDirItem241*f6dc9357SAndroid Build Coastguard Worker bool AreReparseData() const { return ReparseData.Size() != 0 || ReparseData2.Size() != 0; } 242*f6dc9357SAndroid Build Coastguard Worker #else AreReparseDataCDirItem243*f6dc9357SAndroid Build Coastguard Worker bool AreReparseData() const { return ReparseData.Size() != 0; } 244*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32 245*f6dc9357SAndroid Build Coastguard Worker 246*f6dc9357SAndroid Build Coastguard Worker #endif // !UNDER_CE 247*f6dc9357SAndroid Build Coastguard Worker Copy_From_FileInfoBaseCDirItem248*f6dc9357SAndroid Build Coastguard Worker void Copy_From_FileInfoBase(const NWindows::NFile::NFind::CFileInfoBase &fi) 249*f6dc9357SAndroid Build Coastguard Worker { 250*f6dc9357SAndroid Build Coastguard Worker (NWindows::NFile::NFind::CFileInfoBase &)*this = fi; 251*f6dc9357SAndroid Build Coastguard Worker } 252*f6dc9357SAndroid Build Coastguard Worker 253*f6dc9357SAndroid Build Coastguard Worker int PhyParent; 254*f6dc9357SAndroid Build Coastguard Worker int LogParent; 255*f6dc9357SAndroid Build Coastguard Worker int SecureIndex; 256*f6dc9357SAndroid Build Coastguard Worker 257*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 258*f6dc9357SAndroid Build Coastguard Worker #else 259*f6dc9357SAndroid Build Coastguard Worker int OwnerNameIndex; 260*f6dc9357SAndroid Build Coastguard Worker int OwnerGroupIndex; 261*f6dc9357SAndroid Build Coastguard Worker #endif 262*f6dc9357SAndroid Build Coastguard Worker 263*f6dc9357SAndroid Build Coastguard Worker // bool Attrib_IsDefined; 264*f6dc9357SAndroid Build Coastguard Worker CDirItemCDirItem265*f6dc9357SAndroid Build Coastguard Worker CDirItem(): 266*f6dc9357SAndroid Build Coastguard Worker PhyParent(-1) 267*f6dc9357SAndroid Build Coastguard Worker , LogParent(-1) 268*f6dc9357SAndroid Build Coastguard Worker , SecureIndex(-1) 269*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 270*f6dc9357SAndroid Build Coastguard Worker #else 271*f6dc9357SAndroid Build Coastguard Worker , OwnerNameIndex(-1) 272*f6dc9357SAndroid Build Coastguard Worker , OwnerGroupIndex(-1) 273*f6dc9357SAndroid Build Coastguard Worker #endif 274*f6dc9357SAndroid Build Coastguard Worker // , Attrib_IsDefined(true) 275*f6dc9357SAndroid Build Coastguard Worker { 276*f6dc9357SAndroid Build Coastguard Worker } 277*f6dc9357SAndroid Build Coastguard Worker 278*f6dc9357SAndroid Build Coastguard Worker CDirItemCDirItem279*f6dc9357SAndroid Build Coastguard Worker CDirItem(const NWindows::NFile::NFind::CFileInfo &fi, 280*f6dc9357SAndroid Build Coastguard Worker int phyParent, int logParent, int secureIndex): 281*f6dc9357SAndroid Build Coastguard Worker CFileInfoBase(fi) 282*f6dc9357SAndroid Build Coastguard Worker , Name(fs2us(fi.Name)) 283*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) 284*f6dc9357SAndroid Build Coastguard Worker // , ShortName(fs2us(fi.ShortName)) 285*f6dc9357SAndroid Build Coastguard Worker #endif 286*f6dc9357SAndroid Build Coastguard Worker , PhyParent(phyParent) 287*f6dc9357SAndroid Build Coastguard Worker , LogParent(logParent) 288*f6dc9357SAndroid Build Coastguard Worker , SecureIndex(secureIndex) 289*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 290*f6dc9357SAndroid Build Coastguard Worker #else 291*f6dc9357SAndroid Build Coastguard Worker , OwnerNameIndex(-1) 292*f6dc9357SAndroid Build Coastguard Worker , OwnerGroupIndex(-1) 293*f6dc9357SAndroid Build Coastguard Worker #endif 294*f6dc9357SAndroid Build Coastguard Worker {} 295*f6dc9357SAndroid Build Coastguard Worker }; 296*f6dc9357SAndroid Build Coastguard Worker 297*f6dc9357SAndroid Build Coastguard Worker 298*f6dc9357SAndroid Build Coastguard Worker 299*f6dc9357SAndroid Build Coastguard Worker class CDirItems 300*f6dc9357SAndroid Build Coastguard Worker { 301*f6dc9357SAndroid Build Coastguard Worker UStringVector Prefixes; 302*f6dc9357SAndroid Build Coastguard Worker CIntVector PhyParents; 303*f6dc9357SAndroid Build Coastguard Worker CIntVector LogParents; 304*f6dc9357SAndroid Build Coastguard Worker 305*f6dc9357SAndroid Build Coastguard Worker UString GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const; 306*f6dc9357SAndroid Build Coastguard Worker 307*f6dc9357SAndroid Build Coastguard Worker HRESULT EnumerateDir(int phyParent, int logParent, const FString &phyPrefix); 308*f6dc9357SAndroid Build Coastguard Worker 309*f6dc9357SAndroid Build Coastguard Worker public: 310*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CDirItem> Items; 311*f6dc9357SAndroid Build Coastguard Worker 312*f6dc9357SAndroid Build Coastguard Worker bool SymLinks; 313*f6dc9357SAndroid Build Coastguard Worker bool ScanAltStreams; 314*f6dc9357SAndroid Build Coastguard Worker bool ExcludeDirItems; 315*f6dc9357SAndroid Build Coastguard Worker bool ExcludeFileItems; 316*f6dc9357SAndroid Build Coastguard Worker bool ShareForWrite; 317*f6dc9357SAndroid Build Coastguard Worker 318*f6dc9357SAndroid Build Coastguard Worker /* it must be called after anotrher checks */ CanIncludeItem(bool isDir)319*f6dc9357SAndroid Build Coastguard Worker bool CanIncludeItem(bool isDir) const 320*f6dc9357SAndroid Build Coastguard Worker { 321*f6dc9357SAndroid Build Coastguard Worker return isDir ? !ExcludeDirItems : !ExcludeFileItems; 322*f6dc9357SAndroid Build Coastguard Worker } 323*f6dc9357SAndroid Build Coastguard Worker 324*f6dc9357SAndroid Build Coastguard Worker 325*f6dc9357SAndroid Build Coastguard Worker CDirItemsStat Stat; 326*f6dc9357SAndroid Build Coastguard Worker 327*f6dc9357SAndroid Build Coastguard Worker #if !defined(UNDER_CE) 328*f6dc9357SAndroid Build Coastguard Worker HRESULT SetLinkInfo(CDirItem &dirItem, const NWindows::NFile::NFind::CFileInfo &fi, 329*f6dc9357SAndroid Build Coastguard Worker const FString &phyPrefix); 330*f6dc9357SAndroid Build Coastguard Worker #endif 331*f6dc9357SAndroid Build Coastguard Worker 332*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) 333*f6dc9357SAndroid Build Coastguard Worker 334*f6dc9357SAndroid Build Coastguard Worker CUniqBlocks SecureBlocks; 335*f6dc9357SAndroid Build Coastguard Worker CByteBuffer TempSecureBuf; 336*f6dc9357SAndroid Build Coastguard Worker bool _saclEnabled; 337*f6dc9357SAndroid Build Coastguard Worker bool ReadSecure; 338*f6dc9357SAndroid Build Coastguard Worker 339*f6dc9357SAndroid Build Coastguard Worker HRESULT AddSecurityItem(const FString &path, int &secureIndex); 340*f6dc9357SAndroid Build Coastguard Worker HRESULT FillFixedReparse(); 341*f6dc9357SAndroid Build Coastguard Worker 342*f6dc9357SAndroid Build Coastguard Worker #endif 343*f6dc9357SAndroid Build Coastguard Worker 344*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32 345*f6dc9357SAndroid Build Coastguard Worker 346*f6dc9357SAndroid Build Coastguard Worker C_UInt32_UString_Map OwnerNameMap; 347*f6dc9357SAndroid Build Coastguard Worker C_UInt32_UString_Map OwnerGroupMap; 348*f6dc9357SAndroid Build Coastguard Worker bool StoreOwnerName; 349*f6dc9357SAndroid Build Coastguard Worker 350*f6dc9357SAndroid Build Coastguard Worker HRESULT FillDeviceSizes(); 351*f6dc9357SAndroid Build Coastguard Worker 352*f6dc9357SAndroid Build Coastguard Worker #endif 353*f6dc9357SAndroid Build Coastguard Worker 354*f6dc9357SAndroid Build Coastguard Worker IDirItemsCallback *Callback; 355*f6dc9357SAndroid Build Coastguard Worker 356*f6dc9357SAndroid Build Coastguard Worker CDirItems(); 357*f6dc9357SAndroid Build Coastguard Worker 358*f6dc9357SAndroid Build Coastguard Worker void AddDirFileInfo(int phyParent, int logParent, int secureIndex, 359*f6dc9357SAndroid Build Coastguard Worker const NWindows::NFile::NFind::CFileInfo &fi); 360*f6dc9357SAndroid Build Coastguard Worker 361*f6dc9357SAndroid Build Coastguard Worker HRESULT AddError(const FString &path, DWORD errorCode); 362*f6dc9357SAndroid Build Coastguard Worker HRESULT AddError(const FString &path); 363*f6dc9357SAndroid Build Coastguard Worker 364*f6dc9357SAndroid Build Coastguard Worker HRESULT ScanProgress(const FString &path); 365*f6dc9357SAndroid Build Coastguard Worker 366*f6dc9357SAndroid Build Coastguard Worker // unsigned GetNumFolders() const { return Prefixes.Size(); } 367*f6dc9357SAndroid Build Coastguard Worker FString GetPhyPath(unsigned index) const; 368*f6dc9357SAndroid Build Coastguard Worker UString GetLogPath(unsigned index) const; 369*f6dc9357SAndroid Build Coastguard Worker 370*f6dc9357SAndroid Build Coastguard Worker unsigned AddPrefix(int phyParent, int logParent, const UString &prefix); 371*f6dc9357SAndroid Build Coastguard Worker void DeleteLastPrefix(); 372*f6dc9357SAndroid Build Coastguard Worker 373*f6dc9357SAndroid Build Coastguard Worker // HRESULT EnumerateOneDir(const FString &phyPrefix, CObjectVector<NWindows::NFile::NFind::CDirEntry> &files); 374*f6dc9357SAndroid Build Coastguard Worker HRESULT EnumerateOneDir(const FString &phyPrefix, CObjectVector<NWindows::NFile::NFind::CFileInfo> &files); 375*f6dc9357SAndroid Build Coastguard Worker 376*f6dc9357SAndroid Build Coastguard Worker HRESULT EnumerateItems2( 377*f6dc9357SAndroid Build Coastguard Worker const FString &phyPrefix, 378*f6dc9357SAndroid Build Coastguard Worker const UString &logPrefix, 379*f6dc9357SAndroid Build Coastguard Worker const FStringVector &filePaths, 380*f6dc9357SAndroid Build Coastguard Worker FStringVector *requestedPaths); 381*f6dc9357SAndroid Build Coastguard Worker 382*f6dc9357SAndroid Build Coastguard Worker void ReserveDown(); 383*f6dc9357SAndroid Build Coastguard Worker }; 384*f6dc9357SAndroid Build Coastguard Worker 385*f6dc9357SAndroid Build Coastguard Worker 386*f6dc9357SAndroid Build Coastguard Worker 387*f6dc9357SAndroid Build Coastguard Worker 388*f6dc9357SAndroid Build Coastguard Worker struct CArcItem 389*f6dc9357SAndroid Build Coastguard Worker { 390*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; 391*f6dc9357SAndroid Build Coastguard Worker UString Name; 392*f6dc9357SAndroid Build Coastguard Worker CArcTime MTime; // it can be mtime of archive file, if MTime is not defined for item in archive 393*f6dc9357SAndroid Build Coastguard Worker bool IsDir; 394*f6dc9357SAndroid Build Coastguard Worker bool IsAltStream; 395*f6dc9357SAndroid Build Coastguard Worker bool Size_Defined; 396*f6dc9357SAndroid Build Coastguard Worker bool Censored; 397*f6dc9357SAndroid Build Coastguard Worker UInt32 IndexInServer; 398*f6dc9357SAndroid Build Coastguard Worker CArcItemCArcItem399*f6dc9357SAndroid Build Coastguard Worker CArcItem(): 400*f6dc9357SAndroid Build Coastguard Worker IsDir(false), 401*f6dc9357SAndroid Build Coastguard Worker IsAltStream(false), 402*f6dc9357SAndroid Build Coastguard Worker Size_Defined(false), 403*f6dc9357SAndroid Build Coastguard Worker Censored(false) 404*f6dc9357SAndroid Build Coastguard Worker {} 405*f6dc9357SAndroid Build Coastguard Worker }; 406*f6dc9357SAndroid Build Coastguard Worker 407*f6dc9357SAndroid Build Coastguard Worker #endif 408