xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/7z/7zOut.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // 7zOut.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_7Z_OUT_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_7Z_OUT_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "7zCompressionMode.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "7zEncode.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "7zHeader.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "7zItem.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/OutBuffer.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamUtils.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
15*f6dc9357SAndroid Build Coastguard Worker namespace N7z {
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker const unsigned k_StartHeadersRewriteSize = 32;
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker class CWriteBufferLoc
20*f6dc9357SAndroid Build Coastguard Worker {
21*f6dc9357SAndroid Build Coastguard Worker   Byte *_data;
22*f6dc9357SAndroid Build Coastguard Worker   Byte *_dataLim;
23*f6dc9357SAndroid Build Coastguard Worker   Byte *_dataBase;
24*f6dc9357SAndroid Build Coastguard Worker public:
25*f6dc9357SAndroid Build Coastguard Worker   // CWriteBufferLoc(): _data(NULL), _dataLim(NULL), _dataBase(NULL) {}
Init(Byte * data,size_t size)26*f6dc9357SAndroid Build Coastguard Worker   void Init(Byte *data, size_t size)
27*f6dc9357SAndroid Build Coastguard Worker   {
28*f6dc9357SAndroid Build Coastguard Worker     _data = data;
29*f6dc9357SAndroid Build Coastguard Worker     _dataBase = data;
30*f6dc9357SAndroid Build Coastguard Worker     _dataLim = data + size;
31*f6dc9357SAndroid Build Coastguard Worker   }
32*f6dc9357SAndroid Build Coastguard Worker 
GetDest_and_Update(size_t size)33*f6dc9357SAndroid Build Coastguard Worker   Byte *GetDest_and_Update(size_t size)
34*f6dc9357SAndroid Build Coastguard Worker   {
35*f6dc9357SAndroid Build Coastguard Worker     Byte *dest = _data;
36*f6dc9357SAndroid Build Coastguard Worker     if (size > (size_t)(_dataLim - dest))
37*f6dc9357SAndroid Build Coastguard Worker       throw 1;
38*f6dc9357SAndroid Build Coastguard Worker     _data = dest + size;
39*f6dc9357SAndroid Build Coastguard Worker     return dest;
40*f6dc9357SAndroid Build Coastguard Worker   }
WriteBytes(const void * data,size_t size)41*f6dc9357SAndroid Build Coastguard Worker   void WriteBytes(const void *data, size_t size)
42*f6dc9357SAndroid Build Coastguard Worker   {
43*f6dc9357SAndroid Build Coastguard Worker     if (size == 0)
44*f6dc9357SAndroid Build Coastguard Worker       return;
45*f6dc9357SAndroid Build Coastguard Worker     Byte *dest = GetDest_and_Update(size);
46*f6dc9357SAndroid Build Coastguard Worker     memcpy(dest, data, size);
47*f6dc9357SAndroid Build Coastguard Worker   }
WriteByte(Byte b)48*f6dc9357SAndroid Build Coastguard Worker   void WriteByte(Byte b)
49*f6dc9357SAndroid Build Coastguard Worker   {
50*f6dc9357SAndroid Build Coastguard Worker     Byte *dest = _data;
51*f6dc9357SAndroid Build Coastguard Worker     if (dest == _dataLim)
52*f6dc9357SAndroid Build Coastguard Worker       throw 1;
53*f6dc9357SAndroid Build Coastguard Worker     *dest++ = b;
54*f6dc9357SAndroid Build Coastguard Worker     _data = dest;
55*f6dc9357SAndroid Build Coastguard Worker   }
GetPos()56*f6dc9357SAndroid Build Coastguard Worker   size_t GetPos() const { return (size_t)(_data - _dataBase); }
57*f6dc9357SAndroid Build Coastguard Worker };
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker struct CHeaderOptions
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker   bool CompressMainHeader;
63*f6dc9357SAndroid Build Coastguard Worker   /*
64*f6dc9357SAndroid Build Coastguard Worker   bool WriteCTime;
65*f6dc9357SAndroid Build Coastguard Worker   bool WriteATime;
66*f6dc9357SAndroid Build Coastguard Worker   bool WriteMTime;
67*f6dc9357SAndroid Build Coastguard Worker   */
68*f6dc9357SAndroid Build Coastguard Worker 
CHeaderOptionsCHeaderOptions69*f6dc9357SAndroid Build Coastguard Worker   CHeaderOptions():
70*f6dc9357SAndroid Build Coastguard Worker       CompressMainHeader(true)
71*f6dc9357SAndroid Build Coastguard Worker       /*
72*f6dc9357SAndroid Build Coastguard Worker       , WriteCTime(false)
73*f6dc9357SAndroid Build Coastguard Worker       , WriteATime(false)
74*f6dc9357SAndroid Build Coastguard Worker       , WriteMTime(true)
75*f6dc9357SAndroid Build Coastguard Worker       */
76*f6dc9357SAndroid Build Coastguard Worker       {}
77*f6dc9357SAndroid Build Coastguard Worker };
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker struct CFileItem2
81*f6dc9357SAndroid Build Coastguard Worker {
82*f6dc9357SAndroid Build Coastguard Worker   UInt64 CTime;
83*f6dc9357SAndroid Build Coastguard Worker   UInt64 ATime;
84*f6dc9357SAndroid Build Coastguard Worker   UInt64 MTime;
85*f6dc9357SAndroid Build Coastguard Worker   UInt64 StartPos;
86*f6dc9357SAndroid Build Coastguard Worker   UInt32 Attrib;
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker   bool CTimeDefined;
89*f6dc9357SAndroid Build Coastguard Worker   bool ATimeDefined;
90*f6dc9357SAndroid Build Coastguard Worker   bool MTimeDefined;
91*f6dc9357SAndroid Build Coastguard Worker   bool StartPosDefined;
92*f6dc9357SAndroid Build Coastguard Worker   bool AttribDefined;
93*f6dc9357SAndroid Build Coastguard Worker   bool IsAnti;
94*f6dc9357SAndroid Build Coastguard Worker   // bool IsAux;
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker   /*
97*f6dc9357SAndroid Build Coastguard Worker   void Init()
98*f6dc9357SAndroid Build Coastguard Worker   {
99*f6dc9357SAndroid Build Coastguard Worker     CTimeDefined = false;
100*f6dc9357SAndroid Build Coastguard Worker     ATimeDefined = false;
101*f6dc9357SAndroid Build Coastguard Worker     MTimeDefined = false;
102*f6dc9357SAndroid Build Coastguard Worker     StartPosDefined = false;
103*f6dc9357SAndroid Build Coastguard Worker     AttribDefined = false;
104*f6dc9357SAndroid Build Coastguard Worker     IsAnti = false;
105*f6dc9357SAndroid Build Coastguard Worker     // IsAux = false;
106*f6dc9357SAndroid Build Coastguard Worker   }
107*f6dc9357SAndroid Build Coastguard Worker   */
108*f6dc9357SAndroid Build Coastguard Worker };
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker struct COutFolders
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker   CUInt32DefVector FolderUnpackCRCs; // Now we use it for headers only.
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CNum> NumUnpackStreamsVector;
116*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt64> CoderUnpackSizes; // including unpack sizes of bond coders
117*f6dc9357SAndroid Build Coastguard Worker 
OutFoldersClearCOutFolders118*f6dc9357SAndroid Build Coastguard Worker   void OutFoldersClear()
119*f6dc9357SAndroid Build Coastguard Worker   {
120*f6dc9357SAndroid Build Coastguard Worker     FolderUnpackCRCs.Clear();
121*f6dc9357SAndroid Build Coastguard Worker     NumUnpackStreamsVector.Clear();
122*f6dc9357SAndroid Build Coastguard Worker     CoderUnpackSizes.Clear();
123*f6dc9357SAndroid Build Coastguard Worker   }
124*f6dc9357SAndroid Build Coastguard Worker 
OutFoldersReserveDownCOutFolders125*f6dc9357SAndroid Build Coastguard Worker   void OutFoldersReserveDown()
126*f6dc9357SAndroid Build Coastguard Worker   {
127*f6dc9357SAndroid Build Coastguard Worker     FolderUnpackCRCs.ReserveDown();
128*f6dc9357SAndroid Build Coastguard Worker     NumUnpackStreamsVector.ReserveDown();
129*f6dc9357SAndroid Build Coastguard Worker     CoderUnpackSizes.ReserveDown();
130*f6dc9357SAndroid Build Coastguard Worker   }
131*f6dc9357SAndroid Build Coastguard Worker };
132*f6dc9357SAndroid Build Coastguard Worker 
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker struct CArchiveDatabaseOut: public COutFolders
135*f6dc9357SAndroid Build Coastguard Worker {
136*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt64> PackSizes;
137*f6dc9357SAndroid Build Coastguard Worker   CUInt32DefVector PackCRCs;
138*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CFolder> Folders;
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CFileItem> Files;
141*f6dc9357SAndroid Build Coastguard Worker   UStringVector Names;
142*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector CTime;
143*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector ATime;
144*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector MTime;
145*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector StartPos;
146*f6dc9357SAndroid Build Coastguard Worker   CUInt32DefVector Attrib;
147*f6dc9357SAndroid Build Coastguard Worker   CBoolVector IsAnti;
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker   /*
150*f6dc9357SAndroid Build Coastguard Worker   CBoolVector IsAux;
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer SecureBuf;
153*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> SecureSizes;
154*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> SecureIDs;
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker   void ClearSecure()
157*f6dc9357SAndroid Build Coastguard Worker   {
158*f6dc9357SAndroid Build Coastguard Worker     SecureBuf.Free();
159*f6dc9357SAndroid Build Coastguard Worker     SecureSizes.Clear();
160*f6dc9357SAndroid Build Coastguard Worker     SecureIDs.Clear();
161*f6dc9357SAndroid Build Coastguard Worker   }
162*f6dc9357SAndroid Build Coastguard Worker   */
163*f6dc9357SAndroid Build Coastguard Worker 
ClearCArchiveDatabaseOut164*f6dc9357SAndroid Build Coastguard Worker   void Clear()
165*f6dc9357SAndroid Build Coastguard Worker   {
166*f6dc9357SAndroid Build Coastguard Worker     OutFoldersClear();
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker     PackSizes.Clear();
169*f6dc9357SAndroid Build Coastguard Worker     PackCRCs.Clear();
170*f6dc9357SAndroid Build Coastguard Worker     Folders.Clear();
171*f6dc9357SAndroid Build Coastguard Worker 
172*f6dc9357SAndroid Build Coastguard Worker     Files.Clear();
173*f6dc9357SAndroid Build Coastguard Worker     Names.Clear();
174*f6dc9357SAndroid Build Coastguard Worker     CTime.Clear();
175*f6dc9357SAndroid Build Coastguard Worker     ATime.Clear();
176*f6dc9357SAndroid Build Coastguard Worker     MTime.Clear();
177*f6dc9357SAndroid Build Coastguard Worker     StartPos.Clear();
178*f6dc9357SAndroid Build Coastguard Worker     Attrib.Clear();
179*f6dc9357SAndroid Build Coastguard Worker     IsAnti.Clear();
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker     /*
182*f6dc9357SAndroid Build Coastguard Worker     IsAux.Clear();
183*f6dc9357SAndroid Build Coastguard Worker     ClearSecure();
184*f6dc9357SAndroid Build Coastguard Worker     */
185*f6dc9357SAndroid Build Coastguard Worker   }
186*f6dc9357SAndroid Build Coastguard Worker 
ReserveDownCArchiveDatabaseOut187*f6dc9357SAndroid Build Coastguard Worker   void ReserveDown()
188*f6dc9357SAndroid Build Coastguard Worker   {
189*f6dc9357SAndroid Build Coastguard Worker     OutFoldersReserveDown();
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker     PackSizes.ReserveDown();
192*f6dc9357SAndroid Build Coastguard Worker     PackCRCs.ReserveDown();
193*f6dc9357SAndroid Build Coastguard Worker     Folders.ReserveDown();
194*f6dc9357SAndroid Build Coastguard Worker 
195*f6dc9357SAndroid Build Coastguard Worker     Files.ReserveDown();
196*f6dc9357SAndroid Build Coastguard Worker     Names.ReserveDown();
197*f6dc9357SAndroid Build Coastguard Worker     CTime.ReserveDown();
198*f6dc9357SAndroid Build Coastguard Worker     ATime.ReserveDown();
199*f6dc9357SAndroid Build Coastguard Worker     MTime.ReserveDown();
200*f6dc9357SAndroid Build Coastguard Worker     StartPos.ReserveDown();
201*f6dc9357SAndroid Build Coastguard Worker     Attrib.ReserveDown();
202*f6dc9357SAndroid Build Coastguard Worker     IsAnti.ReserveDown();
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker     /*
205*f6dc9357SAndroid Build Coastguard Worker     IsAux.ReserveDown();
206*f6dc9357SAndroid Build Coastguard Worker     */
207*f6dc9357SAndroid Build Coastguard Worker   }
208*f6dc9357SAndroid Build Coastguard Worker 
IsEmptyCArchiveDatabaseOut209*f6dc9357SAndroid Build Coastguard Worker   bool IsEmpty() const
210*f6dc9357SAndroid Build Coastguard Worker   {
211*f6dc9357SAndroid Build Coastguard Worker     return (
212*f6dc9357SAndroid Build Coastguard Worker       PackSizes.IsEmpty() &&
213*f6dc9357SAndroid Build Coastguard Worker       NumUnpackStreamsVector.IsEmpty() &&
214*f6dc9357SAndroid Build Coastguard Worker       Folders.IsEmpty() &&
215*f6dc9357SAndroid Build Coastguard Worker       Files.IsEmpty());
216*f6dc9357SAndroid Build Coastguard Worker   }
217*f6dc9357SAndroid Build Coastguard Worker 
CheckNumFilesCArchiveDatabaseOut218*f6dc9357SAndroid Build Coastguard Worker   bool CheckNumFiles() const
219*f6dc9357SAndroid Build Coastguard Worker   {
220*f6dc9357SAndroid Build Coastguard Worker     unsigned size = Files.Size();
221*f6dc9357SAndroid Build Coastguard Worker     return (
222*f6dc9357SAndroid Build Coastguard Worker            CTime.CheckSize(size)
223*f6dc9357SAndroid Build Coastguard Worker         && ATime.CheckSize(size)
224*f6dc9357SAndroid Build Coastguard Worker         && MTime.CheckSize(size)
225*f6dc9357SAndroid Build Coastguard Worker         && StartPos.CheckSize(size)
226*f6dc9357SAndroid Build Coastguard Worker         && Attrib.CheckSize(size)
227*f6dc9357SAndroid Build Coastguard Worker         && (size == IsAnti.Size() || IsAnti.Size() == 0));
228*f6dc9357SAndroid Build Coastguard Worker   }
229*f6dc9357SAndroid Build Coastguard Worker 
IsItemAntiCArchiveDatabaseOut230*f6dc9357SAndroid Build Coastguard Worker   bool IsItemAnti(unsigned index) const { return (index < IsAnti.Size() && IsAnti[index]); }
231*f6dc9357SAndroid Build Coastguard Worker   // bool IsItemAux(unsigned index) const { return (index < IsAux.Size() && IsAux[index]); }
232*f6dc9357SAndroid Build Coastguard Worker 
SetItem_AntiCArchiveDatabaseOut233*f6dc9357SAndroid Build Coastguard Worker   void SetItem_Anti(unsigned index, bool isAnti)
234*f6dc9357SAndroid Build Coastguard Worker   {
235*f6dc9357SAndroid Build Coastguard Worker     while (index >= IsAnti.Size())
236*f6dc9357SAndroid Build Coastguard Worker       IsAnti.Add(false);
237*f6dc9357SAndroid Build Coastguard Worker     IsAnti[index] = isAnti;
238*f6dc9357SAndroid Build Coastguard Worker   }
239*f6dc9357SAndroid Build Coastguard Worker   /*
240*f6dc9357SAndroid Build Coastguard Worker   void SetItem_Aux(unsigned index, bool isAux)
241*f6dc9357SAndroid Build Coastguard Worker   {
242*f6dc9357SAndroid Build Coastguard Worker     while (index >= IsAux.Size())
243*f6dc9357SAndroid Build Coastguard Worker       IsAux.Add(false);
244*f6dc9357SAndroid Build Coastguard Worker     IsAux[index] = isAux;
245*f6dc9357SAndroid Build Coastguard Worker   }
246*f6dc9357SAndroid Build Coastguard Worker   */
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker   void AddFile(const CFileItem &file, const CFileItem2 &file2, const UString &name);
249*f6dc9357SAndroid Build Coastguard Worker };
250*f6dc9357SAndroid Build Coastguard Worker 
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker class COutArchive
253*f6dc9357SAndroid Build Coastguard Worker {
WriteDirect(const void * data,UInt32 size)254*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteDirect(const void *data, UInt32 size) { return WriteStream(SeqStream, data, size); }
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetPos() const;
257*f6dc9357SAndroid Build Coastguard Worker   void WriteBytes(const void *data, size_t size);
WriteBytes(const CByteBuffer & data)258*f6dc9357SAndroid Build Coastguard Worker   void WriteBytes(const CByteBuffer &data) { WriteBytes(data, data.Size()); }
259*f6dc9357SAndroid Build Coastguard Worker   void WriteByte(Byte b);
WriteByte_ToStream(Byte b)260*f6dc9357SAndroid Build Coastguard Worker   void WriteByte_ToStream(Byte b)
261*f6dc9357SAndroid Build Coastguard Worker   {
262*f6dc9357SAndroid Build Coastguard Worker     _outByte.WriteByte(b);
263*f6dc9357SAndroid Build Coastguard Worker     // _crc = CRC_UPDATE_BYTE(_crc, b);
264*f6dc9357SAndroid Build Coastguard Worker   }
265*f6dc9357SAndroid Build Coastguard Worker   // void WriteUInt32(UInt32 value);
266*f6dc9357SAndroid Build Coastguard Worker   // void WriteUInt64(UInt64 value);
267*f6dc9357SAndroid Build Coastguard Worker   void WriteNumber(UInt64 value);
WriteID(UInt64 value)268*f6dc9357SAndroid Build Coastguard Worker   void WriteID(UInt64 value) { WriteNumber(value); }
269*f6dc9357SAndroid Build Coastguard Worker 
270*f6dc9357SAndroid Build Coastguard Worker   void WriteFolder(const CFolder &folder);
271*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteFileHeader(const CFileItem &itemInfo);
272*f6dc9357SAndroid Build Coastguard Worker   void Write_BoolVector(const CBoolVector &boolVector);
273*f6dc9357SAndroid Build Coastguard Worker   void Write_BoolVector_numDefined(const CBoolVector &boolVector, unsigned numDefined);
274*f6dc9357SAndroid Build Coastguard Worker   void WritePropBoolVector(Byte id, const CBoolVector &boolVector);
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   void WriteHashDigests(const CUInt32DefVector &digests);
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker   void WritePackInfo(
279*f6dc9357SAndroid Build Coastguard Worker       UInt64 dataOffset,
280*f6dc9357SAndroid Build Coastguard Worker       const CRecordVector<UInt64> &packSizes,
281*f6dc9357SAndroid Build Coastguard Worker       const CUInt32DefVector &packCRCs);
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker   void WriteUnpackInfo(
284*f6dc9357SAndroid Build Coastguard Worker       const CObjectVector<CFolder> &folders,
285*f6dc9357SAndroid Build Coastguard Worker       const COutFolders &outFolders);
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker   void WriteSubStreamsInfo(
288*f6dc9357SAndroid Build Coastguard Worker       const CObjectVector<CFolder> &folders,
289*f6dc9357SAndroid Build Coastguard Worker       const COutFolders &outFolders,
290*f6dc9357SAndroid Build Coastguard Worker       const CRecordVector<UInt64> &unpackSizes,
291*f6dc9357SAndroid Build Coastguard Worker       const CUInt32DefVector &digests);
292*f6dc9357SAndroid Build Coastguard Worker 
293*f6dc9357SAndroid Build Coastguard Worker   void SkipToAligned(unsigned pos, unsigned alignShifts);
294*f6dc9357SAndroid Build Coastguard Worker   void WriteAlignedBools(const CBoolVector &v, unsigned numDefined, Byte type, unsigned itemSizeShifts);
295*f6dc9357SAndroid Build Coastguard Worker   void Write_UInt32DefVector_numDefined(const CUInt32DefVector &v, unsigned numDefined);
296*f6dc9357SAndroid Build Coastguard Worker   void Write_UInt64DefVector_type(const CUInt64DefVector &v, Byte type);
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker   HRESULT EncodeStream(
299*f6dc9357SAndroid Build Coastguard Worker       DECL_EXTERNAL_CODECS_LOC_VARS
300*f6dc9357SAndroid Build Coastguard Worker       CEncoder &encoder, const CByteBuffer &data,
301*f6dc9357SAndroid Build Coastguard Worker       CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders, COutFolders &outFolders);
302*f6dc9357SAndroid Build Coastguard Worker   void WriteHeader(
303*f6dc9357SAndroid Build Coastguard Worker       const CArchiveDatabaseOut &db,
304*f6dc9357SAndroid Build Coastguard Worker       // const CHeaderOptions &headerOptions,
305*f6dc9357SAndroid Build Coastguard Worker       UInt64 &headerOffset);
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker   bool _countMode;
308*f6dc9357SAndroid Build Coastguard Worker   bool _writeToStream;
309*f6dc9357SAndroid Build Coastguard Worker   bool _useAlign;
310*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_7Z_VOL
311*f6dc9357SAndroid Build Coastguard Worker   bool _endMarker;
312*f6dc9357SAndroid Build Coastguard Worker   #endif
313*f6dc9357SAndroid Build Coastguard Worker   // UInt32 _crc;
314*f6dc9357SAndroid Build Coastguard Worker   size_t _countSize;
315*f6dc9357SAndroid Build Coastguard Worker   CWriteBufferLoc _outByte2;
316*f6dc9357SAndroid Build Coastguard Worker   COutBuffer _outByte;
317*f6dc9357SAndroid Build Coastguard Worker   UInt64 _signatureHeaderPos;
318*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IOutStream> Stream;
319*f6dc9357SAndroid Build Coastguard Worker 
320*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_7Z_VOL
321*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteFinishSignature();
322*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteFinishHeader(const CFinishHeader &h);
323*f6dc9357SAndroid Build Coastguard Worker   #endif
324*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteStartHeader(const CStartHeader &h);
325*f6dc9357SAndroid Build Coastguard Worker 
326*f6dc9357SAndroid Build Coastguard Worker public:
327*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialOutStream> SeqStream;
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker   // COutArchive();
330*f6dc9357SAndroid Build Coastguard Worker   HRESULT Create_and_WriteStartPrefix(ISequentialOutStream *stream /* , bool endMarker */);
331*f6dc9357SAndroid Build Coastguard Worker   void Close();
332*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteDatabase(
333*f6dc9357SAndroid Build Coastguard Worker       DECL_EXTERNAL_CODECS_LOC_VARS
334*f6dc9357SAndroid Build Coastguard Worker       const CArchiveDatabaseOut &db,
335*f6dc9357SAndroid Build Coastguard Worker       const CCompressionMethodMode *options,
336*f6dc9357SAndroid Build Coastguard Worker       const CHeaderOptions &headerOptions);
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_7Z_VOL
339*f6dc9357SAndroid Build Coastguard Worker   static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false);
340*f6dc9357SAndroid Build Coastguard Worker   static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false);
341*f6dc9357SAndroid Build Coastguard Worker   #endif
342*f6dc9357SAndroid Build Coastguard Worker };
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker }}
345*f6dc9357SAndroid Build Coastguard Worker 
346*f6dc9357SAndroid Build Coastguard Worker #endif
347