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