xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Tar/TarItem.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // TarItem.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_TAR_ITEM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_TAR_ITEM_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyLinux.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/UTFConvert.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "TarHeader.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
12*f6dc9357SAndroid Build Coastguard Worker namespace NTar {
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker struct CSparseBlock
15*f6dc9357SAndroid Build Coastguard Worker {
16*f6dc9357SAndroid Build Coastguard Worker   UInt64 Offset;
17*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
18*f6dc9357SAndroid Build Coastguard Worker };
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker enum EPaxTimeRemoveZeroMode
22*f6dc9357SAndroid Build Coastguard Worker {
23*f6dc9357SAndroid Build Coastguard Worker   k_PaxTimeMode_DontRemoveZero,
24*f6dc9357SAndroid Build Coastguard Worker   k_PaxTimeMode_RemoveZero_if_PureSecondOnly,
25*f6dc9357SAndroid Build Coastguard Worker   k_PaxTimeMode_RemoveZero_Always
26*f6dc9357SAndroid Build Coastguard Worker };
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker struct CTimeOptions
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker   EPaxTimeRemoveZeroMode RemoveZeroMode;
31*f6dc9357SAndroid Build Coastguard Worker   unsigned NumDigitsMax;
32*f6dc9357SAndroid Build Coastguard Worker 
InitCTimeOptions33*f6dc9357SAndroid Build Coastguard Worker   void Init()
34*f6dc9357SAndroid Build Coastguard Worker   {
35*f6dc9357SAndroid Build Coastguard Worker     RemoveZeroMode = k_PaxTimeMode_RemoveZero_if_PureSecondOnly;
36*f6dc9357SAndroid Build Coastguard Worker     NumDigitsMax = 0;
37*f6dc9357SAndroid Build Coastguard Worker   }
CTimeOptionsCTimeOptions38*f6dc9357SAndroid Build Coastguard Worker   CTimeOptions() { Init(); }
39*f6dc9357SAndroid Build Coastguard Worker };
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker struct CPaxTime
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker   Int32 NumDigits; // -1 means undefined
45*f6dc9357SAndroid Build Coastguard Worker   UInt32 Ns;  // it's smaller than 1G. Even if (Sec < 0), larger (Ns) value means newer files.
46*f6dc9357SAndroid Build Coastguard Worker   Int64 Sec;  // can be negative
47*f6dc9357SAndroid Build Coastguard Worker 
GetSecCPaxTime48*f6dc9357SAndroid Build Coastguard Worker   Int64 GetSec() const { return NumDigits != -1 ? Sec : 0; }
49*f6dc9357SAndroid Build Coastguard Worker 
IsDefinedCPaxTime50*f6dc9357SAndroid Build Coastguard Worker   bool IsDefined() const { return NumDigits != -1; }
51*f6dc9357SAndroid Build Coastguard Worker   // bool IsDefined_And_nonZero() const { return NumDigits != -1 && (Sec != 0 || Ns != 0); }
52*f6dc9357SAndroid Build Coastguard Worker 
ClearCPaxTime53*f6dc9357SAndroid Build Coastguard Worker   void Clear()
54*f6dc9357SAndroid Build Coastguard Worker   {
55*f6dc9357SAndroid Build Coastguard Worker     NumDigits = -1;
56*f6dc9357SAndroid Build Coastguard Worker     Ns = 0;
57*f6dc9357SAndroid Build Coastguard Worker     Sec = 0;
58*f6dc9357SAndroid Build Coastguard Worker   }
CPaxTimeCPaxTime59*f6dc9357SAndroid Build Coastguard Worker   CPaxTime() { Clear(); }
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker   /*
62*f6dc9357SAndroid Build Coastguard Worker   void ReducePrecison(int numDigits)
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     // we don't use this->NumDigits here
65*f6dc9357SAndroid Build Coastguard Worker     if (numDigits > 0)
66*f6dc9357SAndroid Build Coastguard Worker     {
67*f6dc9357SAndroid Build Coastguard Worker       if (numDigits >= 9)
68*f6dc9357SAndroid Build Coastguard Worker         return;
69*f6dc9357SAndroid Build Coastguard Worker       UInt32 r = 1;
70*f6dc9357SAndroid Build Coastguard Worker       for (unsigned i = numDigits; i < 9; i++)
71*f6dc9357SAndroid Build Coastguard Worker         r *= 10;
72*f6dc9357SAndroid Build Coastguard Worker       Ns /= r;
73*f6dc9357SAndroid Build Coastguard Worker       Ns *= r;
74*f6dc9357SAndroid Build Coastguard Worker       return;
75*f6dc9357SAndroid Build Coastguard Worker     }
76*f6dc9357SAndroid Build Coastguard Worker     Ns = 0;
77*f6dc9357SAndroid Build Coastguard Worker     if (numDigits == 0)
78*f6dc9357SAndroid Build Coastguard Worker       return;
79*f6dc9357SAndroid Build Coastguard Worker     UInt32 r;
80*f6dc9357SAndroid Build Coastguard Worker          if (numDigits == -1) r = 60;
81*f6dc9357SAndroid Build Coastguard Worker     else if (numDigits == -2) r = 60 * 60;
82*f6dc9357SAndroid Build Coastguard Worker     else if (numDigits == -3) r = 60 * 60 * 24;
83*f6dc9357SAndroid Build Coastguard Worker     else return;
84*f6dc9357SAndroid Build Coastguard Worker     Sec /= r;
85*f6dc9357SAndroid Build Coastguard Worker     Sec *= r;
86*f6dc9357SAndroid Build Coastguard Worker   }
87*f6dc9357SAndroid Build Coastguard Worker   */
88*f6dc9357SAndroid Build Coastguard Worker };
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker struct CPaxTimes
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker   CPaxTime MTime;
94*f6dc9357SAndroid Build Coastguard Worker   CPaxTime ATime;
95*f6dc9357SAndroid Build Coastguard Worker   CPaxTime CTime;
96*f6dc9357SAndroid Build Coastguard Worker 
ClearCPaxTimes97*f6dc9357SAndroid Build Coastguard Worker   void Clear()
98*f6dc9357SAndroid Build Coastguard Worker   {
99*f6dc9357SAndroid Build Coastguard Worker     MTime.Clear();
100*f6dc9357SAndroid Build Coastguard Worker     ATime.Clear();
101*f6dc9357SAndroid Build Coastguard Worker     CTime.Clear();
102*f6dc9357SAndroid Build Coastguard Worker   }
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker   /*
105*f6dc9357SAndroid Build Coastguard Worker   void ReducePrecison(int numDigits)
106*f6dc9357SAndroid Build Coastguard Worker   {
107*f6dc9357SAndroid Build Coastguard Worker     MTime.ReducePrecison(numDigits);
108*f6dc9357SAndroid Build Coastguard Worker     CTime.ReducePrecison(numDigits);
109*f6dc9357SAndroid Build Coastguard Worker     ATime.ReducePrecison(numDigits);
110*f6dc9357SAndroid Build Coastguard Worker   }
111*f6dc9357SAndroid Build Coastguard Worker   */
112*f6dc9357SAndroid Build Coastguard Worker };
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker struct CItem
116*f6dc9357SAndroid Build Coastguard Worker {
117*f6dc9357SAndroid Build Coastguard Worker   UInt64 PackSize;
118*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
119*f6dc9357SAndroid Build Coastguard Worker   Int64 MTime;
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker   char LinkFlag;
122*f6dc9357SAndroid Build Coastguard Worker   bool DeviceMajor_Defined;
123*f6dc9357SAndroid Build Coastguard Worker   bool DeviceMinor_Defined;
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker   UInt32 Mode;
126*f6dc9357SAndroid Build Coastguard Worker   UInt32 UID;
127*f6dc9357SAndroid Build Coastguard Worker   UInt32 GID;
128*f6dc9357SAndroid Build Coastguard Worker   UInt32 DeviceMajor;
129*f6dc9357SAndroid Build Coastguard Worker   UInt32 DeviceMinor;
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker   AString Name;
132*f6dc9357SAndroid Build Coastguard Worker   AString LinkName;
133*f6dc9357SAndroid Build Coastguard Worker   AString User;
134*f6dc9357SAndroid Build Coastguard Worker   AString Group;
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker   char Magic[8];
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker   CPaxTimes PaxTimes;
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CSparseBlock> SparseBlocks;
141*f6dc9357SAndroid Build Coastguard Worker 
SetMagic_PosixCItem142*f6dc9357SAndroid Build Coastguard Worker   void SetMagic_Posix(bool posixMode)
143*f6dc9357SAndroid Build Coastguard Worker   {
144*f6dc9357SAndroid Build Coastguard Worker     memcpy(Magic, posixMode ?
145*f6dc9357SAndroid Build Coastguard Worker         NFileHeader::NMagic::k_Posix_ustar_00 :
146*f6dc9357SAndroid Build Coastguard Worker         NFileHeader::NMagic::k_GNU_ustar,
147*f6dc9357SAndroid Build Coastguard Worker         8);
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker 
Is_SymLinkCItem150*f6dc9357SAndroid Build Coastguard Worker   bool Is_SymLink()  const { return LinkFlag == NFileHeader::NLinkFlag::kSymLink && (Size == 0); }
Is_HardLinkCItem151*f6dc9357SAndroid Build Coastguard Worker   bool Is_HardLink() const { return LinkFlag == NFileHeader::NLinkFlag::kHardLink; }
Is_SparseCItem152*f6dc9357SAndroid Build Coastguard Worker   bool Is_Sparse()   const { return LinkFlag == NFileHeader::NLinkFlag::kSparse; }
153*f6dc9357SAndroid Build Coastguard Worker 
Get_UnpackSizeCItem154*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_UnpackSize() const { return Is_SymLink() ? LinkName.Len() : Size; }
155*f6dc9357SAndroid Build Coastguard Worker 
Is_PaxExtendedHeaderCItem156*f6dc9357SAndroid Build Coastguard Worker   bool Is_PaxExtendedHeader() const
157*f6dc9357SAndroid Build Coastguard Worker   {
158*f6dc9357SAndroid Build Coastguard Worker     switch (LinkFlag)
159*f6dc9357SAndroid Build Coastguard Worker     {
160*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kPax:
161*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kPax_2:
162*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kGlobal:
163*f6dc9357SAndroid Build Coastguard Worker         return true;
164*f6dc9357SAndroid Build Coastguard Worker       default: break;
165*f6dc9357SAndroid Build Coastguard Worker     }
166*f6dc9357SAndroid Build Coastguard Worker     return false;
167*f6dc9357SAndroid Build Coastguard Worker   }
168*f6dc9357SAndroid Build Coastguard Worker 
Get_Combined_ModeCItem169*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_Combined_Mode() const
170*f6dc9357SAndroid Build Coastguard Worker   {
171*f6dc9357SAndroid Build Coastguard Worker     return (Mode & ~(UInt32)MY_LIN_S_IFMT) | Get_FileTypeMode_from_LinkFlag();
172*f6dc9357SAndroid Build Coastguard Worker   }
173*f6dc9357SAndroid Build Coastguard Worker 
Set_LinkFlag_for_FileCItem174*f6dc9357SAndroid Build Coastguard Worker   void Set_LinkFlag_for_File(UInt32 mode)
175*f6dc9357SAndroid Build Coastguard Worker   {
176*f6dc9357SAndroid Build Coastguard Worker     char                            lf = NFileHeader::NLinkFlag::kNormal;
177*f6dc9357SAndroid Build Coastguard Worker          if (MY_LIN_S_ISCHR(mode))  lf = NFileHeader::NLinkFlag::kCharacter;
178*f6dc9357SAndroid Build Coastguard Worker     else if (MY_LIN_S_ISBLK(mode))  lf = NFileHeader::NLinkFlag::kBlock;
179*f6dc9357SAndroid Build Coastguard Worker     else if (MY_LIN_S_ISFIFO(mode)) lf = NFileHeader::NLinkFlag::kFIFO;
180*f6dc9357SAndroid Build Coastguard Worker     // else if (MY_LIN_S_ISDIR(mode))  lf = NFileHeader::NLinkFlag::kDirectory;
181*f6dc9357SAndroid Build Coastguard Worker     // else if (MY_LIN_S_ISLNK(mode))  lf = NFileHeader::NLinkFlag::kSymLink;
182*f6dc9357SAndroid Build Coastguard Worker     LinkFlag = lf;
183*f6dc9357SAndroid Build Coastguard Worker   }
184*f6dc9357SAndroid Build Coastguard Worker 
Get_FileTypeMode_from_LinkFlagCItem185*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_FileTypeMode_from_LinkFlag() const
186*f6dc9357SAndroid Build Coastguard Worker   {
187*f6dc9357SAndroid Build Coastguard Worker     switch (LinkFlag)
188*f6dc9357SAndroid Build Coastguard Worker     {
189*f6dc9357SAndroid Build Coastguard Worker       /*
190*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kDirectory:
191*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kDumpDir:
192*f6dc9357SAndroid Build Coastguard Worker         return MY_LIN_S_IFDIR;
193*f6dc9357SAndroid Build Coastguard Worker       */
194*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kSymLink:    return MY_LIN_S_IFLNK;
195*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kBlock:      return MY_LIN_S_IFBLK;
196*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kCharacter:  return MY_LIN_S_IFCHR;
197*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kFIFO:       return MY_LIN_S_IFIFO;
198*f6dc9357SAndroid Build Coastguard Worker       // case return MY_LIN_S_IFSOCK;
199*f6dc9357SAndroid Build Coastguard Worker       default: break;
200*f6dc9357SAndroid Build Coastguard Worker     }
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker     if (IsDir())
203*f6dc9357SAndroid Build Coastguard Worker       return MY_LIN_S_IFDIR;
204*f6dc9357SAndroid Build Coastguard Worker     return MY_LIN_S_IFREG;
205*f6dc9357SAndroid Build Coastguard Worker   }
206*f6dc9357SAndroid Build Coastguard Worker 
IsDirCItem207*f6dc9357SAndroid Build Coastguard Worker   bool IsDir() const
208*f6dc9357SAndroid Build Coastguard Worker   {
209*f6dc9357SAndroid Build Coastguard Worker     switch (LinkFlag)
210*f6dc9357SAndroid Build Coastguard Worker     {
211*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kDirectory:
212*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kDumpDir:
213*f6dc9357SAndroid Build Coastguard Worker         return true;
214*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kOldNormal:
215*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kNormal:
216*f6dc9357SAndroid Build Coastguard Worker       case NFileHeader::NLinkFlag::kSymLink:
217*f6dc9357SAndroid Build Coastguard Worker         if (Name.IsEmpty())
218*f6dc9357SAndroid Build Coastguard Worker           return false;
219*f6dc9357SAndroid Build Coastguard Worker         // GNU TAR uses last character as directory marker
220*f6dc9357SAndroid Build Coastguard Worker         // we also do it
221*f6dc9357SAndroid Build Coastguard Worker         return Name.Back() == '/';
222*f6dc9357SAndroid Build Coastguard Worker         // return NItemName::HasTailSlash(Name, CP_OEMCP);
223*f6dc9357SAndroid Build Coastguard Worker       default: break;
224*f6dc9357SAndroid Build Coastguard Worker     }
225*f6dc9357SAndroid Build Coastguard Worker     return false;
226*f6dc9357SAndroid Build Coastguard Worker   }
227*f6dc9357SAndroid Build Coastguard Worker 
IsMagic_ustar_5charsCItem228*f6dc9357SAndroid Build Coastguard Worker   bool IsMagic_ustar_5chars() const
229*f6dc9357SAndroid Build Coastguard Worker   {
230*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < 5; i++)
231*f6dc9357SAndroid Build Coastguard Worker       if (Magic[i] != NFileHeader::NMagic::k_GNU_ustar[i])
232*f6dc9357SAndroid Build Coastguard Worker         return false;
233*f6dc9357SAndroid Build Coastguard Worker     return true;
234*f6dc9357SAndroid Build Coastguard Worker   }
235*f6dc9357SAndroid Build Coastguard Worker 
IsMagic_Posix_ustar_00CItem236*f6dc9357SAndroid Build Coastguard Worker   bool IsMagic_Posix_ustar_00() const
237*f6dc9357SAndroid Build Coastguard Worker   {
238*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < 8; i++)
239*f6dc9357SAndroid Build Coastguard Worker       if (Magic[i] != NFileHeader::NMagic::k_Posix_ustar_00[i])
240*f6dc9357SAndroid Build Coastguard Worker         return false;
241*f6dc9357SAndroid Build Coastguard Worker     return true;
242*f6dc9357SAndroid Build Coastguard Worker   }
243*f6dc9357SAndroid Build Coastguard Worker 
IsMagic_GNUCItem244*f6dc9357SAndroid Build Coastguard Worker   bool IsMagic_GNU() const
245*f6dc9357SAndroid Build Coastguard Worker   {
246*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < 8; i++)
247*f6dc9357SAndroid Build Coastguard Worker       if (Magic[i] != NFileHeader::NMagic::k_GNU_ustar[i])
248*f6dc9357SAndroid Build Coastguard Worker         return false;
249*f6dc9357SAndroid Build Coastguard Worker     return true;
250*f6dc9357SAndroid Build Coastguard Worker   }
251*f6dc9357SAndroid Build Coastguard Worker 
Get_PackSize_AlignedCItem252*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_PackSize_Aligned() const { return (PackSize + 0x1FF) & (~((UInt64)0x1FF)); }
253*f6dc9357SAndroid Build Coastguard Worker 
IsThereWarningCItem254*f6dc9357SAndroid Build Coastguard Worker   bool IsThereWarning() const
255*f6dc9357SAndroid Build Coastguard Worker   {
256*f6dc9357SAndroid Build Coastguard Worker     // that Header Warning is possible if (Size != 0) for dir item
257*f6dc9357SAndroid Build Coastguard Worker     return (PackSize < Size) && (LinkFlag == NFileHeader::NLinkFlag::kDirectory);
258*f6dc9357SAndroid Build Coastguard Worker   }
259*f6dc9357SAndroid Build Coastguard Worker };
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker 
262*f6dc9357SAndroid Build Coastguard Worker 
263*f6dc9357SAndroid Build Coastguard Worker struct CEncodingCharacts
264*f6dc9357SAndroid Build Coastguard Worker {
265*f6dc9357SAndroid Build Coastguard Worker   bool IsAscii;
266*f6dc9357SAndroid Build Coastguard Worker   // bool Oem_Checked;
267*f6dc9357SAndroid Build Coastguard Worker   // bool Oem_Ok;
268*f6dc9357SAndroid Build Coastguard Worker   // bool Utf_Checked;
269*f6dc9357SAndroid Build Coastguard Worker   CUtf8Check UtfCheck;
270*f6dc9357SAndroid Build Coastguard Worker 
ClearCEncodingCharacts271*f6dc9357SAndroid Build Coastguard Worker   void Clear()
272*f6dc9357SAndroid Build Coastguard Worker   {
273*f6dc9357SAndroid Build Coastguard Worker     IsAscii = true;
274*f6dc9357SAndroid Build Coastguard Worker     // Oem_Checked = false;
275*f6dc9357SAndroid Build Coastguard Worker     // Oem_Ok = false;
276*f6dc9357SAndroid Build Coastguard Worker     // Utf_Checked = false;
277*f6dc9357SAndroid Build Coastguard Worker     UtfCheck.Clear();
278*f6dc9357SAndroid Build Coastguard Worker   }
279*f6dc9357SAndroid Build Coastguard Worker 
UpdateCEncodingCharacts280*f6dc9357SAndroid Build Coastguard Worker   void Update(const CEncodingCharacts &ec)
281*f6dc9357SAndroid Build Coastguard Worker   {
282*f6dc9357SAndroid Build Coastguard Worker     if (!ec.IsAscii)
283*f6dc9357SAndroid Build Coastguard Worker       IsAscii = false;
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker     // if (ec.Utf_Checked)
286*f6dc9357SAndroid Build Coastguard Worker     {
287*f6dc9357SAndroid Build Coastguard Worker       UtfCheck.Update(ec.UtfCheck);
288*f6dc9357SAndroid Build Coastguard Worker       // Utf_Checked = true;
289*f6dc9357SAndroid Build Coastguard Worker     }
290*f6dc9357SAndroid Build Coastguard Worker   }
291*f6dc9357SAndroid Build Coastguard Worker 
CEncodingCharactsCEncodingCharacts292*f6dc9357SAndroid Build Coastguard Worker   CEncodingCharacts() { Clear(); }
293*f6dc9357SAndroid Build Coastguard Worker   void Check(const AString &s);
294*f6dc9357SAndroid Build Coastguard Worker   AString GetCharactsString() const;
295*f6dc9357SAndroid Build Coastguard Worker };
296*f6dc9357SAndroid Build Coastguard Worker 
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker struct CPaxExtra
299*f6dc9357SAndroid Build Coastguard Worker {
300*f6dc9357SAndroid Build Coastguard Worker   AString RecordPath;
301*f6dc9357SAndroid Build Coastguard Worker   AString RawLines;
302*f6dc9357SAndroid Build Coastguard Worker 
ClearCPaxExtra303*f6dc9357SAndroid Build Coastguard Worker   void Clear()
304*f6dc9357SAndroid Build Coastguard Worker   {
305*f6dc9357SAndroid Build Coastguard Worker     RecordPath.Empty();
306*f6dc9357SAndroid Build Coastguard Worker     RawLines.Empty();
307*f6dc9357SAndroid Build Coastguard Worker   }
308*f6dc9357SAndroid Build Coastguard Worker 
Print_To_StringCPaxExtra309*f6dc9357SAndroid Build Coastguard Worker   void Print_To_String(AString &s) const
310*f6dc9357SAndroid Build Coastguard Worker   {
311*f6dc9357SAndroid Build Coastguard Worker     if (!RecordPath.IsEmpty())
312*f6dc9357SAndroid Build Coastguard Worker     {
313*f6dc9357SAndroid Build Coastguard Worker       s += RecordPath;
314*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
315*f6dc9357SAndroid Build Coastguard Worker     }
316*f6dc9357SAndroid Build Coastguard Worker     if (!RawLines.IsEmpty())
317*f6dc9357SAndroid Build Coastguard Worker       s += RawLines;
318*f6dc9357SAndroid Build Coastguard Worker   }
319*f6dc9357SAndroid Build Coastguard Worker };
320*f6dc9357SAndroid Build Coastguard Worker 
321*f6dc9357SAndroid Build Coastguard Worker 
322*f6dc9357SAndroid Build Coastguard Worker struct CItemEx: public CItem
323*f6dc9357SAndroid Build Coastguard Worker {
324*f6dc9357SAndroid Build Coastguard Worker   bool HeaderError;
325*f6dc9357SAndroid Build Coastguard Worker 
326*f6dc9357SAndroid Build Coastguard Worker   bool IsSignedChecksum;
327*f6dc9357SAndroid Build Coastguard Worker   bool Prefix_WasUsed;
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker   bool Pax_Error;
330*f6dc9357SAndroid Build Coastguard Worker   bool Pax_Overflow;
331*f6dc9357SAndroid Build Coastguard Worker   bool pax_path_WasUsed;
332*f6dc9357SAndroid Build Coastguard Worker   bool pax_link_WasUsed;
333*f6dc9357SAndroid Build Coastguard Worker   bool pax_size_WasUsed;
334*f6dc9357SAndroid Build Coastguard Worker 
335*f6dc9357SAndroid Build Coastguard Worker   bool MTime_IsBin;
336*f6dc9357SAndroid Build Coastguard Worker   bool PackSize_IsBin;
337*f6dc9357SAndroid Build Coastguard Worker   bool Size_IsBin;
338*f6dc9357SAndroid Build Coastguard Worker 
339*f6dc9357SAndroid Build Coastguard Worker   bool LongName_WasUsed;
340*f6dc9357SAndroid Build Coastguard Worker   bool LongName_WasUsed_2;
341*f6dc9357SAndroid Build Coastguard Worker 
342*f6dc9357SAndroid Build Coastguard Worker   bool LongLink_WasUsed;
343*f6dc9357SAndroid Build Coastguard Worker   bool LongLink_WasUsed_2;
344*f6dc9357SAndroid Build Coastguard Worker 
345*f6dc9357SAndroid Build Coastguard Worker   // bool Name_CouldBeReduced;
346*f6dc9357SAndroid Build Coastguard Worker   // bool LinkName_CouldBeReduced;
347*f6dc9357SAndroid Build Coastguard Worker 
348*f6dc9357SAndroid Build Coastguard Worker   UInt64 HeaderPos;
349*f6dc9357SAndroid Build Coastguard Worker   UInt64 HeaderSize;
350*f6dc9357SAndroid Build Coastguard Worker 
351*f6dc9357SAndroid Build Coastguard Worker   UInt64 Num_Pax_Records;
352*f6dc9357SAndroid Build Coastguard Worker   CPaxExtra PaxExtra;
353*f6dc9357SAndroid Build Coastguard Worker   AString SCHILY_fflags;
354*f6dc9357SAndroid Build Coastguard Worker 
355*f6dc9357SAndroid Build Coastguard Worker   CEncodingCharacts EncodingCharacts;
356*f6dc9357SAndroid Build Coastguard Worker 
Get_DataPosCItemEx357*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_DataPos() const { return HeaderPos + HeaderSize; }
358*f6dc9357SAndroid Build Coastguard Worker   // UInt64 GetFullSize() const { return HeaderSize + PackSize; }
Get_FullSize_AlignedCItemEx359*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_FullSize_Aligned() const { return HeaderSize + Get_PackSize_Aligned(); }
360*f6dc9357SAndroid Build Coastguard Worker };
361*f6dc9357SAndroid Build Coastguard Worker 
362*f6dc9357SAndroid Build Coastguard Worker }}
363*f6dc9357SAndroid Build Coastguard Worker 
364*f6dc9357SAndroid Build Coastguard Worker #endif
365