1*f6dc9357SAndroid Build Coastguard Worker // 7zIn.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_7Z_IN_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_7Z_IN_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../../IPassword.h" 11*f6dc9357SAndroid Build Coastguard Worker #include "../../IStream.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h" 14*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/InBuffer.h" 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker #include "7zItem.h" 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 19*f6dc9357SAndroid Build Coastguard Worker namespace N7z { 20*f6dc9357SAndroid Build Coastguard Worker 21*f6dc9357SAndroid Build Coastguard Worker /* 22*f6dc9357SAndroid Build Coastguard Worker We don't need to init isEncrypted and passwordIsDefined 23*f6dc9357SAndroid Build Coastguard Worker We must upgrade them only */ 24*f6dc9357SAndroid Build Coastguard Worker 25*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_NO_CRYPTO 26*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS_DECL 27*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS 28*f6dc9357SAndroid Build Coastguard Worker #else 29*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS_DECL , ICryptoGetTextPassword *getTextPassword, bool &isEncrypted, bool &passwordIsDefined, UString &password 30*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS , getTextPassword, isEncrypted, passwordIsDefined, password 31*f6dc9357SAndroid Build Coastguard Worker #endif 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker struct CParsedMethods 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker Byte Lzma2Prop; 36*f6dc9357SAndroid Build Coastguard Worker UInt32 LzmaDic; 37*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> IDs; 38*f6dc9357SAndroid Build Coastguard Worker CParsedMethodsCParsedMethods39*f6dc9357SAndroid Build Coastguard Worker CParsedMethods(): Lzma2Prop(0), LzmaDic(0) {} 40*f6dc9357SAndroid Build Coastguard Worker }; 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker struct CFolderEx: public CFolder 43*f6dc9357SAndroid Build Coastguard Worker { 44*f6dc9357SAndroid Build Coastguard Worker unsigned UnpackCoder; 45*f6dc9357SAndroid Build Coastguard Worker }; 46*f6dc9357SAndroid Build Coastguard Worker 47*f6dc9357SAndroid Build Coastguard Worker struct CFolders 48*f6dc9357SAndroid Build Coastguard Worker { 49*f6dc9357SAndroid Build Coastguard Worker CNum NumPackStreams; 50*f6dc9357SAndroid Build Coastguard Worker CNum NumFolders; 51*f6dc9357SAndroid Build Coastguard Worker 52*f6dc9357SAndroid Build Coastguard Worker CObjArray<UInt64> PackPositions; // NumPackStreams + 1 53*f6dc9357SAndroid Build Coastguard Worker // CUInt32DefVector PackCRCs; // we don't use PackCRCs now 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker CUInt32DefVector FolderCRCs; // NumFolders 56*f6dc9357SAndroid Build Coastguard Worker CObjArray<CNum> NumUnpackStreamsVector; // NumFolders 57*f6dc9357SAndroid Build Coastguard Worker 58*f6dc9357SAndroid Build Coastguard Worker CObjArray<UInt64> CoderUnpackSizes; // including unpack sizes of bond coders 59*f6dc9357SAndroid Build Coastguard Worker CObjArray<CNum> FoToCoderUnpackSizes; // NumFolders + 1 60*f6dc9357SAndroid Build Coastguard Worker CObjArray<CNum> FoStartPackStreamIndex; // NumFolders + 1 61*f6dc9357SAndroid Build Coastguard Worker CObjArray<Byte> FoToMainUnpackSizeIndex; // NumFolders 62*f6dc9357SAndroid Build Coastguard Worker 63*f6dc9357SAndroid Build Coastguard Worker CObjArray<size_t> FoCodersDataOffset; // NumFolders + 1 64*f6dc9357SAndroid Build Coastguard Worker CByteBuffer CodersData; 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker CParsedMethods ParsedMethods; 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker void ParseFolderInfo(unsigned folderIndex, CFolder &folder) const; ParseFolderExCFolders69*f6dc9357SAndroid Build Coastguard Worker void ParseFolderEx(unsigned folderIndex, CFolderEx &folder) const 70*f6dc9357SAndroid Build Coastguard Worker { 71*f6dc9357SAndroid Build Coastguard Worker ParseFolderInfo(folderIndex, folder); 72*f6dc9357SAndroid Build Coastguard Worker folder.UnpackCoder = FoToMainUnpackSizeIndex[folderIndex]; 73*f6dc9357SAndroid Build Coastguard Worker } 74*f6dc9357SAndroid Build Coastguard Worker GetNumFolderUnpackSizesCFolders75*f6dc9357SAndroid Build Coastguard Worker unsigned GetNumFolderUnpackSizes(unsigned folderIndex) const 76*f6dc9357SAndroid Build Coastguard Worker { 77*f6dc9357SAndroid Build Coastguard Worker return (unsigned)(FoToCoderUnpackSizes[folderIndex + 1] - FoToCoderUnpackSizes[folderIndex]); 78*f6dc9357SAndroid Build Coastguard Worker } 79*f6dc9357SAndroid Build Coastguard Worker GetFolderUnpackSizeCFolders80*f6dc9357SAndroid Build Coastguard Worker UInt64 GetFolderUnpackSize(unsigned folderIndex) const 81*f6dc9357SAndroid Build Coastguard Worker { 82*f6dc9357SAndroid Build Coastguard Worker return CoderUnpackSizes[FoToCoderUnpackSizes[folderIndex] + FoToMainUnpackSizeIndex[folderIndex]]; 83*f6dc9357SAndroid Build Coastguard Worker } 84*f6dc9357SAndroid Build Coastguard Worker GetStreamPackSizeCFolders85*f6dc9357SAndroid Build Coastguard Worker UInt64 GetStreamPackSize(unsigned index) const 86*f6dc9357SAndroid Build Coastguard Worker { 87*f6dc9357SAndroid Build Coastguard Worker return PackPositions[index + 1] - PackPositions[index]; 88*f6dc9357SAndroid Build Coastguard Worker } 89*f6dc9357SAndroid Build Coastguard Worker CFoldersCFolders90*f6dc9357SAndroid Build Coastguard Worker CFolders(): NumPackStreams(0), NumFolders(0) {} 91*f6dc9357SAndroid Build Coastguard Worker ClearCFolders92*f6dc9357SAndroid Build Coastguard Worker void Clear() 93*f6dc9357SAndroid Build Coastguard Worker { 94*f6dc9357SAndroid Build Coastguard Worker NumPackStreams = 0; 95*f6dc9357SAndroid Build Coastguard Worker PackPositions.Free(); 96*f6dc9357SAndroid Build Coastguard Worker // PackCRCs.Clear(); 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker NumFolders = 0; 99*f6dc9357SAndroid Build Coastguard Worker FolderCRCs.Clear(); 100*f6dc9357SAndroid Build Coastguard Worker NumUnpackStreamsVector.Free(); 101*f6dc9357SAndroid Build Coastguard Worker CoderUnpackSizes.Free(); 102*f6dc9357SAndroid Build Coastguard Worker FoToCoderUnpackSizes.Free(); 103*f6dc9357SAndroid Build Coastguard Worker FoStartPackStreamIndex.Free(); 104*f6dc9357SAndroid Build Coastguard Worker FoToMainUnpackSizeIndex.Free(); 105*f6dc9357SAndroid Build Coastguard Worker FoCodersDataOffset.Free(); 106*f6dc9357SAndroid Build Coastguard Worker CodersData.Free(); 107*f6dc9357SAndroid Build Coastguard Worker } 108*f6dc9357SAndroid Build Coastguard Worker }; 109*f6dc9357SAndroid Build Coastguard Worker 110*f6dc9357SAndroid Build Coastguard Worker struct CDatabase: public CFolders 111*f6dc9357SAndroid Build Coastguard Worker { 112*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CFileItem> Files; 113*f6dc9357SAndroid Build Coastguard Worker 114*f6dc9357SAndroid Build Coastguard Worker CUInt64DefVector CTime; 115*f6dc9357SAndroid Build Coastguard Worker CUInt64DefVector ATime; 116*f6dc9357SAndroid Build Coastguard Worker CUInt64DefVector MTime; 117*f6dc9357SAndroid Build Coastguard Worker CUInt64DefVector StartPos; 118*f6dc9357SAndroid Build Coastguard Worker CUInt32DefVector Attrib; 119*f6dc9357SAndroid Build Coastguard Worker CBoolVector IsAnti; 120*f6dc9357SAndroid Build Coastguard Worker /* 121*f6dc9357SAndroid Build Coastguard Worker CBoolVector IsAux; 122*f6dc9357SAndroid Build Coastguard Worker CByteBuffer SecureBuf; 123*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> SecureIDs; 124*f6dc9357SAndroid Build Coastguard Worker */ 125*f6dc9357SAndroid Build Coastguard Worker 126*f6dc9357SAndroid Build Coastguard Worker CByteBuffer NamesBuf; 127*f6dc9357SAndroid Build Coastguard Worker CObjArray<size_t> NameOffsets; // numFiles + 1, offsets of utf-16 symbols 128*f6dc9357SAndroid Build Coastguard Worker 129*f6dc9357SAndroid Build Coastguard Worker /* 130*f6dc9357SAndroid Build Coastguard Worker void ClearSecure() 131*f6dc9357SAndroid Build Coastguard Worker { 132*f6dc9357SAndroid Build Coastguard Worker SecureBuf.Free(); 133*f6dc9357SAndroid Build Coastguard Worker SecureIDs.Clear(); 134*f6dc9357SAndroid Build Coastguard Worker } 135*f6dc9357SAndroid Build Coastguard Worker */ 136*f6dc9357SAndroid Build Coastguard Worker ClearCDatabase137*f6dc9357SAndroid Build Coastguard Worker void Clear() 138*f6dc9357SAndroid Build Coastguard Worker { 139*f6dc9357SAndroid Build Coastguard Worker CFolders::Clear(); 140*f6dc9357SAndroid Build Coastguard Worker // ClearSecure(); 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker NamesBuf.Free(); 143*f6dc9357SAndroid Build Coastguard Worker NameOffsets.Free(); 144*f6dc9357SAndroid Build Coastguard Worker 145*f6dc9357SAndroid Build Coastguard Worker Files.Clear(); 146*f6dc9357SAndroid Build Coastguard Worker CTime.Clear(); 147*f6dc9357SAndroid Build Coastguard Worker ATime.Clear(); 148*f6dc9357SAndroid Build Coastguard Worker MTime.Clear(); 149*f6dc9357SAndroid Build Coastguard Worker StartPos.Clear(); 150*f6dc9357SAndroid Build Coastguard Worker Attrib.Clear(); 151*f6dc9357SAndroid Build Coastguard Worker IsAnti.Clear(); 152*f6dc9357SAndroid Build Coastguard Worker // IsAux.Clear(); 153*f6dc9357SAndroid Build Coastguard Worker } 154*f6dc9357SAndroid Build Coastguard Worker IsSolidCDatabase155*f6dc9357SAndroid Build Coastguard Worker bool IsSolid() const 156*f6dc9357SAndroid Build Coastguard Worker { 157*f6dc9357SAndroid Build Coastguard Worker for (CNum i = 0; i < NumFolders; i++) 158*f6dc9357SAndroid Build Coastguard Worker if (NumUnpackStreamsVector[i] > 1) 159*f6dc9357SAndroid Build Coastguard Worker return true; 160*f6dc9357SAndroid Build Coastguard Worker return false; 161*f6dc9357SAndroid Build Coastguard Worker } IsItemAntiCDatabase162*f6dc9357SAndroid Build Coastguard Worker bool IsItemAnti(unsigned index) const { return (index < IsAnti.Size() && IsAnti[index]); } 163*f6dc9357SAndroid Build Coastguard Worker // bool IsItemAux(unsigned index) const { return (index < IsAux.Size() && IsAux[index]); } 164*f6dc9357SAndroid Build Coastguard Worker 165*f6dc9357SAndroid Build Coastguard Worker /* 166*f6dc9357SAndroid Build Coastguard Worker const void* GetName(unsigned index) const 167*f6dc9357SAndroid Build Coastguard Worker { 168*f6dc9357SAndroid Build Coastguard Worker if (!NameOffsets || !NamesBuf) 169*f6dc9357SAndroid Build Coastguard Worker return NULL; 170*f6dc9357SAndroid Build Coastguard Worker return (void *)((const Byte *)NamesBuf + NameOffsets[index] * 2); 171*f6dc9357SAndroid Build Coastguard Worker }; 172*f6dc9357SAndroid Build Coastguard Worker */ 173*f6dc9357SAndroid Build Coastguard Worker void GetPath(unsigned index, UString &path) const; 174*f6dc9357SAndroid Build Coastguard Worker HRESULT GetPath_Prop(unsigned index, PROPVARIANT *path) const throw(); 175*f6dc9357SAndroid Build Coastguard Worker }; 176*f6dc9357SAndroid Build Coastguard Worker 177*f6dc9357SAndroid Build Coastguard Worker 178*f6dc9357SAndroid Build Coastguard Worker struct CInArchiveInfo 179*f6dc9357SAndroid Build Coastguard Worker { 180*f6dc9357SAndroid Build Coastguard Worker CArchiveVersion Version; 181*f6dc9357SAndroid Build Coastguard Worker UInt64 StartPosition; // in stream 182*f6dc9357SAndroid Build Coastguard Worker UInt64 StartPositionAfterHeader; // in stream 183*f6dc9357SAndroid Build Coastguard Worker UInt64 DataStartPosition; // in stream 184*f6dc9357SAndroid Build Coastguard Worker UInt64 DataStartPosition2; // in stream. it's for headers 185*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> FileInfoPopIDs; 186*f6dc9357SAndroid Build Coastguard Worker ClearCInArchiveInfo187*f6dc9357SAndroid Build Coastguard Worker void Clear() 188*f6dc9357SAndroid Build Coastguard Worker { 189*f6dc9357SAndroid Build Coastguard Worker StartPosition = 0; 190*f6dc9357SAndroid Build Coastguard Worker StartPositionAfterHeader = 0; 191*f6dc9357SAndroid Build Coastguard Worker DataStartPosition = 0; 192*f6dc9357SAndroid Build Coastguard Worker DataStartPosition2 = 0; 193*f6dc9357SAndroid Build Coastguard Worker FileInfoPopIDs.Clear(); 194*f6dc9357SAndroid Build Coastguard Worker } 195*f6dc9357SAndroid Build Coastguard Worker }; 196*f6dc9357SAndroid Build Coastguard Worker 197*f6dc9357SAndroid Build Coastguard Worker 198*f6dc9357SAndroid Build Coastguard Worker struct CDbEx: public CDatabase 199*f6dc9357SAndroid Build Coastguard Worker { 200*f6dc9357SAndroid Build Coastguard Worker CInArchiveInfo ArcInfo; 201*f6dc9357SAndroid Build Coastguard Worker 202*f6dc9357SAndroid Build Coastguard Worker CObjArray<CNum> FolderStartFileIndex; 203*f6dc9357SAndroid Build Coastguard Worker CObjArray<CNum> FileIndexToFolderIndexMap; 204*f6dc9357SAndroid Build Coastguard Worker 205*f6dc9357SAndroid Build Coastguard Worker UInt64 HeadersSize; 206*f6dc9357SAndroid Build Coastguard Worker UInt64 PhySize; 207*f6dc9357SAndroid Build Coastguard Worker // UInt64 EndHeaderOffset; // relative to position after StartHeader (32 bytes) 208*f6dc9357SAndroid Build Coastguard Worker 209*f6dc9357SAndroid Build Coastguard Worker /* 210*f6dc9357SAndroid Build Coastguard Worker CRecordVector<size_t> SecureOffsets; 211*f6dc9357SAndroid Build Coastguard Worker bool IsTree; 212*f6dc9357SAndroid Build Coastguard Worker bool ThereAreAltStreams; 213*f6dc9357SAndroid Build Coastguard Worker */ 214*f6dc9357SAndroid Build Coastguard Worker 215*f6dc9357SAndroid Build Coastguard Worker bool IsArc; 216*f6dc9357SAndroid Build Coastguard Worker bool PhySizeWasConfirmed; 217*f6dc9357SAndroid Build Coastguard Worker 218*f6dc9357SAndroid Build Coastguard Worker bool ThereIsHeaderError; 219*f6dc9357SAndroid Build Coastguard Worker bool UnexpectedEnd; 220*f6dc9357SAndroid Build Coastguard Worker // bool UnsupportedVersion; 221*f6dc9357SAndroid Build Coastguard Worker 222*f6dc9357SAndroid Build Coastguard Worker bool StartHeaderWasRecovered; 223*f6dc9357SAndroid Build Coastguard Worker bool UnsupportedFeatureWarning; 224*f6dc9357SAndroid Build Coastguard Worker bool UnsupportedFeatureError; 225*f6dc9357SAndroid Build Coastguard Worker 226*f6dc9357SAndroid Build Coastguard Worker /* 227*f6dc9357SAndroid Build Coastguard Worker void ClearSecureEx() 228*f6dc9357SAndroid Build Coastguard Worker { 229*f6dc9357SAndroid Build Coastguard Worker ClearSecure(); 230*f6dc9357SAndroid Build Coastguard Worker SecureOffsets.Clear(); 231*f6dc9357SAndroid Build Coastguard Worker } 232*f6dc9357SAndroid Build Coastguard Worker */ 233*f6dc9357SAndroid Build Coastguard Worker ClearCDbEx234*f6dc9357SAndroid Build Coastguard Worker void Clear() 235*f6dc9357SAndroid Build Coastguard Worker { 236*f6dc9357SAndroid Build Coastguard Worker IsArc = false; 237*f6dc9357SAndroid Build Coastguard Worker PhySizeWasConfirmed = false; 238*f6dc9357SAndroid Build Coastguard Worker 239*f6dc9357SAndroid Build Coastguard Worker ThereIsHeaderError = false; 240*f6dc9357SAndroid Build Coastguard Worker UnexpectedEnd = false; 241*f6dc9357SAndroid Build Coastguard Worker // UnsupportedVersion = false; 242*f6dc9357SAndroid Build Coastguard Worker 243*f6dc9357SAndroid Build Coastguard Worker StartHeaderWasRecovered = false; 244*f6dc9357SAndroid Build Coastguard Worker UnsupportedFeatureError = false; 245*f6dc9357SAndroid Build Coastguard Worker UnsupportedFeatureWarning = false; 246*f6dc9357SAndroid Build Coastguard Worker 247*f6dc9357SAndroid Build Coastguard Worker /* 248*f6dc9357SAndroid Build Coastguard Worker IsTree = false; 249*f6dc9357SAndroid Build Coastguard Worker ThereAreAltStreams = false; 250*f6dc9357SAndroid Build Coastguard Worker */ 251*f6dc9357SAndroid Build Coastguard Worker 252*f6dc9357SAndroid Build Coastguard Worker CDatabase::Clear(); 253*f6dc9357SAndroid Build Coastguard Worker 254*f6dc9357SAndroid Build Coastguard Worker // SecureOffsets.Clear(); 255*f6dc9357SAndroid Build Coastguard Worker ArcInfo.Clear(); 256*f6dc9357SAndroid Build Coastguard Worker FolderStartFileIndex.Free(); 257*f6dc9357SAndroid Build Coastguard Worker FileIndexToFolderIndexMap.Free(); 258*f6dc9357SAndroid Build Coastguard Worker 259*f6dc9357SAndroid Build Coastguard Worker HeadersSize = 0; 260*f6dc9357SAndroid Build Coastguard Worker PhySize = 0; 261*f6dc9357SAndroid Build Coastguard Worker // EndHeaderOffset = 0; 262*f6dc9357SAndroid Build Coastguard Worker } 263*f6dc9357SAndroid Build Coastguard Worker CanUpdateCDbEx264*f6dc9357SAndroid Build Coastguard Worker bool CanUpdate() const 265*f6dc9357SAndroid Build Coastguard Worker { 266*f6dc9357SAndroid Build Coastguard Worker if (ThereIsHeaderError 267*f6dc9357SAndroid Build Coastguard Worker || UnexpectedEnd 268*f6dc9357SAndroid Build Coastguard Worker || StartHeaderWasRecovered 269*f6dc9357SAndroid Build Coastguard Worker || UnsupportedFeatureError) 270*f6dc9357SAndroid Build Coastguard Worker return false; 271*f6dc9357SAndroid Build Coastguard Worker return true; 272*f6dc9357SAndroid Build Coastguard Worker } 273*f6dc9357SAndroid Build Coastguard Worker 274*f6dc9357SAndroid Build Coastguard Worker void FillLinks(); 275*f6dc9357SAndroid Build Coastguard Worker GetFolderStreamPosCDbEx276*f6dc9357SAndroid Build Coastguard Worker UInt64 GetFolderStreamPos(size_t folderIndex, size_t indexInFolder) const 277*f6dc9357SAndroid Build Coastguard Worker { 278*f6dc9357SAndroid Build Coastguard Worker return ArcInfo.DataStartPosition + PackPositions.ConstData() 279*f6dc9357SAndroid Build Coastguard Worker [FoStartPackStreamIndex.ConstData()[folderIndex] + indexInFolder]; 280*f6dc9357SAndroid Build Coastguard Worker } 281*f6dc9357SAndroid Build Coastguard Worker GetFolderFullPackSizeCDbEx282*f6dc9357SAndroid Build Coastguard Worker UInt64 GetFolderFullPackSize(size_t folderIndex) const 283*f6dc9357SAndroid Build Coastguard Worker { 284*f6dc9357SAndroid Build Coastguard Worker return 285*f6dc9357SAndroid Build Coastguard Worker PackPositions[FoStartPackStreamIndex.ConstData()[folderIndex + 1]] - 286*f6dc9357SAndroid Build Coastguard Worker PackPositions[FoStartPackStreamIndex.ConstData()[folderIndex]]; 287*f6dc9357SAndroid Build Coastguard Worker } 288*f6dc9357SAndroid Build Coastguard Worker GetFolderPackStreamSizeCDbEx289*f6dc9357SAndroid Build Coastguard Worker UInt64 GetFolderPackStreamSize(size_t folderIndex, size_t streamIndex) const 290*f6dc9357SAndroid Build Coastguard Worker { 291*f6dc9357SAndroid Build Coastguard Worker const size_t i = FoStartPackStreamIndex.ConstData()[folderIndex] + streamIndex; 292*f6dc9357SAndroid Build Coastguard Worker return PackPositions.ConstData()[i + 1] - 293*f6dc9357SAndroid Build Coastguard Worker PackPositions.ConstData()[i]; 294*f6dc9357SAndroid Build Coastguard Worker } 295*f6dc9357SAndroid Build Coastguard Worker 296*f6dc9357SAndroid Build Coastguard Worker /* 297*f6dc9357SAndroid Build Coastguard Worker UInt64 GetFilePackSize(size_t fileIndex) const 298*f6dc9357SAndroid Build Coastguard Worker { 299*f6dc9357SAndroid Build Coastguard Worker const CNum folderIndex = FileIndexToFolderIndexMap[fileIndex]; 300*f6dc9357SAndroid Build Coastguard Worker if (folderIndex != kNumNoIndex) 301*f6dc9357SAndroid Build Coastguard Worker if (FolderStartFileIndex[folderIndex] == fileIndex) 302*f6dc9357SAndroid Build Coastguard Worker return GetFolderFullPackSize(folderIndex); 303*f6dc9357SAndroid Build Coastguard Worker return 0; 304*f6dc9357SAndroid Build Coastguard Worker } 305*f6dc9357SAndroid Build Coastguard Worker */ 306*f6dc9357SAndroid Build Coastguard Worker }; 307*f6dc9357SAndroid Build Coastguard Worker 308*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumBufLevelsMax = 4; 309*f6dc9357SAndroid Build Coastguard Worker 310*f6dc9357SAndroid Build Coastguard Worker struct CInByte2 311*f6dc9357SAndroid Build Coastguard Worker { 312*f6dc9357SAndroid Build Coastguard Worker const Byte *_buffer; 313*f6dc9357SAndroid Build Coastguard Worker public: 314*f6dc9357SAndroid Build Coastguard Worker size_t _size; 315*f6dc9357SAndroid Build Coastguard Worker size_t _pos; 316*f6dc9357SAndroid Build Coastguard Worker GetRemCInByte2317*f6dc9357SAndroid Build Coastguard Worker size_t GetRem() const { return _size - _pos; } GetPtrCInByte2318*f6dc9357SAndroid Build Coastguard Worker const Byte *GetPtr() const { return _buffer + _pos; } InitCInByte2319*f6dc9357SAndroid Build Coastguard Worker void Init(const Byte *buffer, size_t size) 320*f6dc9357SAndroid Build Coastguard Worker { 321*f6dc9357SAndroid Build Coastguard Worker _buffer = buffer; 322*f6dc9357SAndroid Build Coastguard Worker _size = size; 323*f6dc9357SAndroid Build Coastguard Worker _pos = 0; 324*f6dc9357SAndroid Build Coastguard Worker } 325*f6dc9357SAndroid Build Coastguard Worker Byte ReadByte(); 326*f6dc9357SAndroid Build Coastguard Worker void ReadBytes(Byte *data, size_t size); SkipDataNoCheckCInByte2327*f6dc9357SAndroid Build Coastguard Worker void SkipDataNoCheck(UInt64 size) { _pos += (size_t)size; } 328*f6dc9357SAndroid Build Coastguard Worker void SkipData(UInt64 size); 329*f6dc9357SAndroid Build Coastguard Worker 330*f6dc9357SAndroid Build Coastguard Worker void SkipData(); SkipRemCInByte2331*f6dc9357SAndroid Build Coastguard Worker void SkipRem() { _pos = _size; } 332*f6dc9357SAndroid Build Coastguard Worker UInt64 ReadNumber(); 333*f6dc9357SAndroid Build Coastguard Worker CNum ReadNum(); 334*f6dc9357SAndroid Build Coastguard Worker UInt32 ReadUInt32(); 335*f6dc9357SAndroid Build Coastguard Worker UInt64 ReadUInt64(); 336*f6dc9357SAndroid Build Coastguard Worker 337*f6dc9357SAndroid Build Coastguard Worker void ParseFolder(CFolder &folder); 338*f6dc9357SAndroid Build Coastguard Worker }; 339*f6dc9357SAndroid Build Coastguard Worker 340*f6dc9357SAndroid Build Coastguard Worker class CStreamSwitch; 341*f6dc9357SAndroid Build Coastguard Worker 342*f6dc9357SAndroid Build Coastguard Worker const UInt32 kHeaderSize = 32; 343*f6dc9357SAndroid Build Coastguard Worker 344*f6dc9357SAndroid Build Coastguard Worker class CInArchive 345*f6dc9357SAndroid Build Coastguard Worker { 346*f6dc9357SAndroid Build Coastguard Worker friend class CStreamSwitch; 347*f6dc9357SAndroid Build Coastguard Worker 348*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> _stream; 349*f6dc9357SAndroid Build Coastguard Worker 350*f6dc9357SAndroid Build Coastguard Worker unsigned _numInByteBufs; 351*f6dc9357SAndroid Build Coastguard Worker CInByte2 _inByteVector[kNumBufLevelsMax]; 352*f6dc9357SAndroid Build Coastguard Worker 353*f6dc9357SAndroid Build Coastguard Worker CInByte2 *_inByteBack; 354*f6dc9357SAndroid Build Coastguard Worker bool ThereIsHeaderError; 355*f6dc9357SAndroid Build Coastguard Worker 356*f6dc9357SAndroid Build Coastguard Worker UInt64 _arhiveBeginStreamPosition; 357*f6dc9357SAndroid Build Coastguard Worker UInt64 _fileEndPosition; 358*f6dc9357SAndroid Build Coastguard Worker 359*f6dc9357SAndroid Build Coastguard Worker UInt64 _rangeLimit; // relative to position after StartHeader (32 bytes) 360*f6dc9357SAndroid Build Coastguard Worker 361*f6dc9357SAndroid Build Coastguard Worker Byte _header[kHeaderSize]; 362*f6dc9357SAndroid Build Coastguard Worker 363*f6dc9357SAndroid Build Coastguard Worker UInt64 HeadersSize; 364*f6dc9357SAndroid Build Coastguard Worker 365*f6dc9357SAndroid Build Coastguard Worker bool _useMixerMT; 366*f6dc9357SAndroid Build Coastguard Worker 367*f6dc9357SAndroid Build Coastguard Worker void AddByteStream(const Byte *buffer, size_t size); 368*f6dc9357SAndroid Build Coastguard Worker DeleteByteStream(bool needUpdatePos)369*f6dc9357SAndroid Build Coastguard Worker void DeleteByteStream(bool needUpdatePos) 370*f6dc9357SAndroid Build Coastguard Worker { 371*f6dc9357SAndroid Build Coastguard Worker _numInByteBufs--; 372*f6dc9357SAndroid Build Coastguard Worker if (_numInByteBufs > 0) 373*f6dc9357SAndroid Build Coastguard Worker { 374*f6dc9357SAndroid Build Coastguard Worker _inByteBack = &_inByteVector[_numInByteBufs - 1]; 375*f6dc9357SAndroid Build Coastguard Worker if (needUpdatePos) 376*f6dc9357SAndroid Build Coastguard Worker _inByteBack->_pos += _inByteVector[_numInByteBufs]._pos; 377*f6dc9357SAndroid Build Coastguard Worker } 378*f6dc9357SAndroid Build Coastguard Worker } 379*f6dc9357SAndroid Build Coastguard Worker 380*f6dc9357SAndroid Build Coastguard Worker HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit); 381*f6dc9357SAndroid Build Coastguard Worker ReadBytes(Byte * data,size_t size)382*f6dc9357SAndroid Build Coastguard Worker void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); } ReadByte()383*f6dc9357SAndroid Build Coastguard Worker Byte ReadByte() { return _inByteBack->ReadByte(); } ReadNumber()384*f6dc9357SAndroid Build Coastguard Worker UInt64 ReadNumber() { return _inByteBack->ReadNumber(); } ReadNum()385*f6dc9357SAndroid Build Coastguard Worker CNum ReadNum() { return _inByteBack->ReadNum(); } ReadID()386*f6dc9357SAndroid Build Coastguard Worker UInt64 ReadID() { return _inByteBack->ReadNumber(); } ReadUInt32()387*f6dc9357SAndroid Build Coastguard Worker UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); } ReadUInt64()388*f6dc9357SAndroid Build Coastguard Worker UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); } SkipData(UInt64 size)389*f6dc9357SAndroid Build Coastguard Worker void SkipData(UInt64 size) { _inByteBack->SkipData(size); } SkipData()390*f6dc9357SAndroid Build Coastguard Worker void SkipData() { _inByteBack->SkipData(); } 391*f6dc9357SAndroid Build Coastguard Worker void WaitId(UInt64 id); 392*f6dc9357SAndroid Build Coastguard Worker 393*f6dc9357SAndroid Build Coastguard Worker void Read_UInt32_Vector(CUInt32DefVector &v); 394*f6dc9357SAndroid Build Coastguard Worker 395*f6dc9357SAndroid Build Coastguard Worker void ReadArchiveProperties(CInArchiveInfo &archiveInfo); 396*f6dc9357SAndroid Build Coastguard Worker void ReadHashDigests(unsigned numItems, CUInt32DefVector &crcs); 397*f6dc9357SAndroid Build Coastguard Worker 398*f6dc9357SAndroid Build Coastguard Worker void ReadPackInfo(CFolders &f); 399*f6dc9357SAndroid Build Coastguard Worker 400*f6dc9357SAndroid Build Coastguard Worker void ReadUnpackInfo( 401*f6dc9357SAndroid Build Coastguard Worker const CObjectVector<CByteBuffer> *dataVector, 402*f6dc9357SAndroid Build Coastguard Worker CFolders &folders); 403*f6dc9357SAndroid Build Coastguard Worker 404*f6dc9357SAndroid Build Coastguard Worker void ReadSubStreamsInfo( 405*f6dc9357SAndroid Build Coastguard Worker CFolders &folders, 406*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> &unpackSizes, 407*f6dc9357SAndroid Build Coastguard Worker CUInt32DefVector &digests); 408*f6dc9357SAndroid Build Coastguard Worker 409*f6dc9357SAndroid Build Coastguard Worker void ReadStreamsInfo( 410*f6dc9357SAndroid Build Coastguard Worker const CObjectVector<CByteBuffer> *dataVector, 411*f6dc9357SAndroid Build Coastguard Worker UInt64 &dataOffset, 412*f6dc9357SAndroid Build Coastguard Worker CFolders &folders, 413*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> &unpackSizes, 414*f6dc9357SAndroid Build Coastguard Worker CUInt32DefVector &digests); 415*f6dc9357SAndroid Build Coastguard Worker 416*f6dc9357SAndroid Build Coastguard Worker void ReadBoolVector(unsigned numItems, CBoolVector &v); 417*f6dc9357SAndroid Build Coastguard Worker void ReadBoolVector2(unsigned numItems, CBoolVector &v); 418*f6dc9357SAndroid Build Coastguard Worker void ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector, 419*f6dc9357SAndroid Build Coastguard Worker CUInt64DefVector &v, unsigned numItems); 420*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadAndDecodePackedStreams( 421*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 422*f6dc9357SAndroid Build Coastguard Worker UInt64 baseOffset, UInt64 &dataOffset, 423*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CByteBuffer> &dataVector 424*f6dc9357SAndroid Build Coastguard Worker Z7_7Z_DECODER_CRYPRO_VARS_DECL 425*f6dc9357SAndroid Build Coastguard Worker ); 426*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadHeader( 427*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 428*f6dc9357SAndroid Build Coastguard Worker CDbEx &db 429*f6dc9357SAndroid Build Coastguard Worker Z7_7Z_DECODER_CRYPRO_VARS_DECL 430*f6dc9357SAndroid Build Coastguard Worker ); 431*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadDatabase2( 432*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 433*f6dc9357SAndroid Build Coastguard Worker CDbEx &db 434*f6dc9357SAndroid Build Coastguard Worker Z7_7Z_DECODER_CRYPRO_VARS_DECL 435*f6dc9357SAndroid Build Coastguard Worker ); 436*f6dc9357SAndroid Build Coastguard Worker public: CInArchive(bool useMixerMT)437*f6dc9357SAndroid Build Coastguard Worker CInArchive(bool useMixerMT): 438*f6dc9357SAndroid Build Coastguard Worker _numInByteBufs(0), 439*f6dc9357SAndroid Build Coastguard Worker _useMixerMT(useMixerMT) 440*f6dc9357SAndroid Build Coastguard Worker {} 441*f6dc9357SAndroid Build Coastguard Worker 442*f6dc9357SAndroid Build Coastguard Worker HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive 443*f6dc9357SAndroid Build Coastguard Worker void Close(); 444*f6dc9357SAndroid Build Coastguard Worker 445*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadDatabase( 446*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 447*f6dc9357SAndroid Build Coastguard Worker CDbEx &db 448*f6dc9357SAndroid Build Coastguard Worker Z7_7Z_DECODER_CRYPRO_VARS_DECL 449*f6dc9357SAndroid Build Coastguard Worker ); 450*f6dc9357SAndroid Build Coastguard Worker }; 451*f6dc9357SAndroid Build Coastguard Worker 452*f6dc9357SAndroid Build Coastguard Worker }} 453*f6dc9357SAndroid Build Coastguard Worker 454*f6dc9357SAndroid Build Coastguard Worker #endif 455