filtercoder.h

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

H
131
字号
// FilterCoder.h#ifndef __FILTERCODER_H#define __FILTERCODER_H#include "../../../Common/MyCom.h"#include "../../ICoder.h"#include "../../IPassword.h"#define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) if (iid == IID_ ## i) \{ if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \*outObject = (void *)(i *)this; AddRef(); return S_OK; } class CFilterCoder:  public ICompressCoder,  // #ifdef _ST_MODE  public ICompressSetInStream,  public ISequentialInStream,  public ICompressSetOutStream,  public ISequentialOutStream,  public IOutStreamFlush,  // #endif  #ifndef _NO_CRYPTO  public ICryptoSetPassword,  #endif  #ifndef EXTRACT_ONLY  public ICompressWriteCoderProperties,  #endif  public ICompressSetDecoderProperties2,  public CMyUnknownImp{protected:  Byte *_buffer;  // #ifdef _ST_MODE  CMyComPtr<ISequentialInStream> _inStream;  CMyComPtr<ISequentialOutStream> _outStream;  UInt32 _bufferPos;  UInt32 _convertedPosBegin;  UInt32 _convertedPosEnd;  // #endif  bool _outSizeIsDefined;  UInt64 _outSize;  UInt64 _nowPos64;  HRESULT Init()   {     _nowPos64 = 0;    _outSizeIsDefined = false;    return Filter->Init();   }  CMyComPtr<ICryptoSetPassword> _setPassword;  #ifndef EXTRACT_ONLY  CMyComPtr<ICompressWriteCoderProperties> _writeCoderProperties;  #endif  CMyComPtr<ICompressSetDecoderProperties2> _setDecoderProperties;public:  CMyComPtr<ICompressFilter> Filter;  CFilterCoder();  ~CFilterCoder();  HRESULT WriteWithLimit(ISequentialOutStream *outStream, UInt32 size);  bool NeedMore() const      { return (!_outSizeIsDefined || (_nowPos64 < _outSize)); }public:  MY_QUERYINTERFACE_BEGIN    MY_QUERYINTERFACE_ENTRY(ICompressCoder)    // #ifdef _ST_MODE    MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)    MY_QUERYINTERFACE_ENTRY(ISequentialInStream)    MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream)    MY_QUERYINTERFACE_ENTRY(ISequentialOutStream)    MY_QUERYINTERFACE_ENTRY(IOutStreamFlush)    // #endif    #ifndef _NO_CRYPTO    MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _setPassword)    #endif    #ifndef EXTRACT_ONLY    MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties)    #endif    MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties)  MY_QUERYINTERFACE_END  MY_ADDREF_RELEASE  STDMETHOD(Code)(ISequentialInStream *inStream,      ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,      ICompressProgressInfo *progress);  // #ifdef _ST_MODE  STDMETHOD(ReleaseInStream)();  STDMETHOD(SetInStream)(ISequentialInStream *inStream);  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); \  STDMETHOD(SetOutStream)(ISequentialOutStream *outStream);  STDMETHOD(ReleaseOutStream)();  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);  STDMETHOD(Flush)();  // #endif  #ifndef _NO_CRYPTO  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);  #endif  #ifndef EXTRACT_ONLY  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);  #endif  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);};// #ifdef _ST_MODEclass CInStreamReleaser{public:  CFilterCoder *FilterCoder;  CInStreamReleaser(): FilterCoder(0) {}  ~CInStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); }};class COutStreamReleaser{public:  CFilterCoder *FilterCoder;  COutStreamReleaser(): FilterCoder(0) {}  ~COutStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); }};// #endif#endif

⌨️ 快捷键说明

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