7zout.h

来自「由7-zip提供的压缩、解压缩程序」· C头文件 代码 · 共 178 行

H
178
字号
// 7z/Out.h#ifndef __7Z_OUT_H#define __7Z_OUT_H#include "7zHeader.h"#include "7zItem.h"#include "7zCompressionMode.h"#include "7zEncode.h"#include "../../Common/OutBuffer.h"#include "../../../Common/DynamicBuffer.h"#include "../../../Common/CRC.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)    {     _pos = 0;    _data = data;    _size = size;   }  HRESULT Write(const void *data, size_t size)  {    if (_pos + size > _size)      return E_FAIL;    memmove(_data + _pos, data, size);    _pos += size;    return S_OK;   }};class CWriteDynamicBuffer{  CByteDynamicBuffer _buffer;  size_t _pos;public:  CWriteDynamicBuffer(): _pos(0) {}  void Init()    {     _pos = 0;  }  void Write(const void *data, size_t size)  {    if (_pos + size > _buffer.GetCapacity())      _buffer.EnsureCapacity(_pos + size);    memmove(((Byte *)_buffer) +_pos, data, size);    _pos += size;  }  operator Byte *() { return (Byte *)_buffer; };  operator const Byte *() const { return (const Byte *)_buffer; };  size_t GetSize() const { return _pos; }};class COutArchive{  UInt64 _prefixHeaderPos;  HRESULT WriteDirect(const void *data, UInt32 size);  HRESULT WriteDirectByte(Byte b) { return WriteDirect(&b, 1); }  HRESULT WriteDirectUInt32(UInt32 value);  HRESULT WriteDirectUInt64(UInt64 value);    HRESULT WriteBytes(const void *data, size_t size);  HRESULT WriteBytes(const CByteBuffer &data);  HRESULT WriteByte(Byte b);  HRESULT WriteUInt32(UInt32 value);  HRESULT WriteNumber(UInt64 value);  HRESULT WriteID(UInt64 value) { return WriteNumber(value); }  HRESULT WriteFolder(const CFolder &folder);  HRESULT WriteFileHeader(const CFileItem &itemInfo);  HRESULT WriteBoolVector(const CBoolVector &boolVector);  HRESULT WriteHashDigests(      const CRecordVector<bool> &digestsDefined,      const CRecordVector<UInt32> &hashDigests);  HRESULT WritePackInfo(      UInt64 dataOffset,      const CRecordVector<UInt64> &packSizes,      const CRecordVector<bool> &packCRCsDefined,      const CRecordVector<UInt32> &packCRCs);  HRESULT WriteUnPackInfo(      bool externalFolders,      CNum externalFoldersStreamIndex,      const CObjectVector<CFolder> &folders);  HRESULT WriteSubStreamsInfo(      const CObjectVector<CFolder> &folders,      const CRecordVector<CNum> &numUnPackStreamsInFolders,      const CRecordVector<UInt64> &unPackSizes,      const CRecordVector<bool> &digestsDefined,      const CRecordVector<UInt32> &hashDigests);  /*  HRESULT WriteStreamsInfo(      UInt64 dataOffset,      const CRecordVector<UInt64> &packSizes,      const CRecordVector<bool> &packCRCsDefined,      const CRecordVector<UInt32> &packCRCs,      bool externalFolders,      UInt64 externalFoldersStreamIndex,      const CObjectVector<CFolder> &folders,      const CRecordVector<CNum> &numUnPackStreamsInFolders,      const CRecordVector<UInt64> &unPackSizes,      const CRecordVector<bool> &digestsDefined,      const CRecordVector<UInt32> &hashDigests);  */  HRESULT WriteTime(const CObjectVector<CFileItem> &files, Byte type,      bool isExternal, CNum externalDataIndex);  HRESULT EncodeStream(CEncoder &encoder, const Byte *data, size_t dataSize,      CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders);  HRESULT EncodeStream(CEncoder &encoder, const CByteBuffer &data,       CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders);  HRESULT WriteHeader(const CArchiveDatabase &database,      const CCompressionMethodMode *options,       UInt64 &headerOffset);    bool _mainMode;  bool _dynamicMode;  bool _countMode;  size_t _countSize;  COutBuffer _outByte;  CWriteBufferLoc _outByte2;  CWriteDynamicBuffer _dynamicBuffer;  CCRC _crc;  #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 SkeepPrefixArchiveHeader();  HRESULT WriteDatabase(const CArchiveDatabase &database,      const CCompressionMethodMode *options,       bool useAdditionalHeaderStreams,       bool compressMainHeader);  #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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?