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