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