8 #include "7zCompressionMode.h"
11 #include "../../Common/OutBuffer.h"
12 #include "../../../Common/DynamicBuffer.h"
23 CWriteBufferLoc(): _size(0), _pos(0) {}
24 void Init(Byte *data, size_t size)
30 HRESULT Write(const void *data, size_t size)
32 if (_pos + size > _size)
34 memmove(_data + _pos, data, size);
40 class CWriteDynamicBuffer
42 CByteDynamicBuffer _buffer;
45 CWriteDynamicBuffer(): _pos(0) {}
50 void Write(const void *data, size_t size)
52 if (_pos + size > _buffer.GetCapacity())
53 _buffer.EnsureCapacity(_pos + size);
54 memmove(((Byte *)_buffer) +_pos, data, size);
57 operator Byte *() { return (Byte *)_buffer; };
58 operator const Byte *() const { return (const Byte *)_buffer; };
59 size_t GetSize() const { return _pos; }
64 // bool UseAdditionalHeaderStreams;
65 bool CompressMainHeader;
71 // UseAdditionalHeaderStreams(false),
72 CompressMainHeader(true),
75 WriteAccessed(false) {}
80 UInt64 _prefixHeaderPos;
82 HRESULT WriteDirect(const void *data, UInt32 size);
83 HRESULT WriteDirectByte(Byte b) { return WriteDirect(&b, 1); }
84 HRESULT WriteDirectUInt32(UInt32 value);
85 HRESULT WriteDirectUInt64(UInt64 value);
87 HRESULT WriteBytes(const void *data, size_t size);
88 HRESULT WriteBytes(const CByteBuffer &data);
89 HRESULT WriteByte(Byte b);
90 HRESULT WriteUInt32(UInt32 value);
91 HRESULT WriteNumber(UInt64 value);
92 HRESULT WriteID(UInt64 value) { return WriteNumber(value); }
94 HRESULT WriteFolder(const CFolder &folder);
95 HRESULT WriteFileHeader(const CFileItem &itemInfo);
96 HRESULT WriteBoolVector(const CBoolVector &boolVector);
97 HRESULT WriteHashDigests(
98 const CRecordVector<bool> &digestsDefined,
99 const CRecordVector<UInt32> &hashDigests);
101 HRESULT WritePackInfo(
103 const CRecordVector<UInt64> &packSizes,
104 const CRecordVector<bool> &packCRCsDefined,
105 const CRecordVector<UInt32> &packCRCs);
107 HRESULT WriteUnPackInfo(const CObjectVector<CFolder> &folders);
109 HRESULT WriteSubStreamsInfo(
110 const CObjectVector<CFolder> &folders,
111 const CRecordVector<CNum> &numUnPackStreamsInFolders,
112 const CRecordVector<UInt64> &unPackSizes,
113 const CRecordVector<bool> &digestsDefined,
114 const CRecordVector<UInt32> &hashDigests);
117 HRESULT WriteStreamsInfo(
119 const CRecordVector<UInt64> &packSizes,
120 const CRecordVector<bool> &packCRCsDefined,
121 const CRecordVector<UInt32> &packCRCs,
122 bool externalFolders,
123 UInt64 externalFoldersStreamIndex,
124 const CObjectVector<CFolder> &folders,
125 const CRecordVector<CNum> &numUnPackStreamsInFolders,
126 const CRecordVector<UInt64> &unPackSizes,
127 const CRecordVector<bool> &digestsDefined,
128 const CRecordVector<UInt32> &hashDigests);
132 HRESULT WriteTime(const CObjectVector<CFileItem> &files, Byte type);
134 HRESULT EncodeStream(
135 DECL_EXTERNAL_CODECS_LOC_VARS
136 CEncoder &encoder, const Byte *data, size_t dataSize,
137 CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders);
138 HRESULT EncodeStream(
139 DECL_EXTERNAL_CODECS_LOC_VARS
140 CEncoder &encoder, const CByteBuffer &data,
141 CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders);
143 const CArchiveDatabase &database,
144 const CHeaderOptions &headerOptions,
145 UInt64 &headerOffset);
154 CWriteBufferLoc _outByte2;
155 CWriteDynamicBuffer _dynamicBuffer;
162 HRESULT WriteSignature();
164 HRESULT WriteFinishSignature();
166 HRESULT WriteStartHeader(const CStartHeader &h);
168 HRESULT WriteFinishHeader(const CFinishHeader &h);
170 CMyComPtr<IOutStream> Stream;
173 COutArchive() { _outByte.Create(1 << 16); }
174 CMyComPtr<ISequentialOutStream> SeqStream;
175 HRESULT Create(ISequentialOutStream *stream, bool endMarker);
177 HRESULT SkeepPrefixArchiveHeader();
178 HRESULT WriteDatabase(
179 DECL_EXTERNAL_CODECS_LOC_VARS
180 const CArchiveDatabase &database,
181 const CCompressionMethodMode *options,
182 const CHeaderOptions &headerOptions);
185 static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false);
186 static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false);