xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/DirItem.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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