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