| // 7zOut.h |
| |
| #ifndef __7Z_OUT_H |
| #define __7Z_OUT_H |
| |
| #include "7zCompressionMode.h" |
| #include "7zEncode.h" |
| #include "7zHeader.h" |
| #include "7zItem.h" |
| |
| #include "../../Common/OutBuffer.h" |
| |
| namespace NArchive { |
| namespace N7z { |
| |
| class CWriteBufferLoc |
| { |
| Byte *_data; |
| size_t _size; |
| size_t _pos; |
| public: |
| CWriteBufferLoc(): _size(0), _pos(0) {} |
| void Init(Byte *data, size_t size) |
| { |
| _data = data; |
| _size = size; |
| _pos = 0; |
| } |
| void WriteBytes(const void *data, size_t size) |
| { |
| if (size > _size - _pos) |
| throw 1; |
| memcpy(_data + _pos, data, size); |
| _pos += size; |
| } |
| void WriteByte(Byte b) |
| { |
| if (_size == _pos) |
| throw 1; |
| _data[_pos++] = b; |
| } |
| size_t GetPos() const { return _pos; } |
| }; |
| |
| struct CHeaderOptions |
| { |
| bool CompressMainHeader; |
| bool WriteCTime; |
| bool WriteATime; |
| bool WriteMTime; |
| |
| CHeaderOptions(): |
| CompressMainHeader(true), |
| WriteCTime(false), |
| WriteATime(false), |
| WriteMTime(true) |
| {} |
| }; |
| |
| class COutArchive |
| { |
| UInt64 _prefixHeaderPos; |
| |
| HRESULT WriteDirect(const void *data, UInt32 size); |
| |
| UInt64 GetPos() const; |
| void WriteBytes(const void *data, size_t size); |
| void WriteBytes(const CByteBuffer &data) { WriteBytes(data, data.GetCapacity()); } |
| void WriteByte(Byte b); |
| void WriteUInt32(UInt32 value); |
| void WriteUInt64(UInt64 value); |
| void WriteNumber(UInt64 value); |
| void WriteID(UInt64 value) { WriteNumber(value); } |
| |
| void WriteFolder(const CFolder &folder); |
| HRESULT WriteFileHeader(const CFileItem &itemInfo); |
| void WriteBoolVector(const CBoolVector &boolVector); |
| void WriteHashDigests( |
| const CRecordVector<bool> &digestsDefined, |
| const CRecordVector<UInt32> &hashDigests); |
| |
| void WritePackInfo( |
| UInt64 dataOffset, |
| const CRecordVector<UInt64> &packSizes, |
| const CRecordVector<bool> &packCRCsDefined, |
| const CRecordVector<UInt32> &packCRCs); |
| |
| void WriteUnpackInfo(const CObjectVector<CFolder> &folders); |
| |
| void WriteSubStreamsInfo( |
| const CObjectVector<CFolder> &folders, |
| const CRecordVector<CNum> &numUnpackStreamsInFolders, |
| const CRecordVector<UInt64> &unpackSizes, |
| const CRecordVector<bool> &digestsDefined, |
| const CRecordVector<UInt32> &hashDigests); |
| |
| void SkipAlign(unsigned pos, unsigned alignSize); |
| void WriteAlignedBoolHeader(const CBoolVector &v, int numDefined, Byte type, unsigned itemSize); |
| void WriteUInt64DefVector(const CUInt64DefVector &v, Byte type); |
| |
| HRESULT EncodeStream( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| CEncoder &encoder, const CByteBuffer &data, |
| CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders); |
| void WriteHeader( |
| const CArchiveDatabase &db, |
| const CHeaderOptions &headerOptions, |
| UInt64 &headerOffset); |
| |
| bool _countMode; |
| bool _writeToStream; |
| size_t _countSize; |
| UInt32 _crc; |
| COutBuffer _outByte; |
| CWriteBufferLoc _outByte2; |
| |
| #ifdef _7Z_VOL |
| bool _endMarker; |
| #endif |
| |
| HRESULT WriteSignature(); |
| #ifdef _7Z_VOL |
| HRESULT WriteFinishSignature(); |
| #endif |
| HRESULT WriteStartHeader(const CStartHeader &h); |
| #ifdef _7Z_VOL |
| HRESULT WriteFinishHeader(const CFinishHeader &h); |
| #endif |
| CMyComPtr<IOutStream> Stream; |
| public: |
| |
| COutArchive() { _outByte.Create(1 << 16); } |
| CMyComPtr<ISequentialOutStream> SeqStream; |
| HRESULT Create(ISequentialOutStream *stream, bool endMarker); |
| void Close(); |
| HRESULT SkipPrefixArchiveHeader(); |
| HRESULT WriteDatabase( |
| DECL_EXTERNAL_CODECS_LOC_VARS |
| const CArchiveDatabase &db, |
| const CCompressionMethodMode *options, |
| const CHeaderOptions &headerOptions); |
| |
| #ifdef _7Z_VOL |
| static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false); |
| static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false); |
| #endif |
| |
| }; |
| |
| }} |
| |
| #endif |