1// FilterCoder.h 2 3#ifndef __FILTERCODER_H 4#define __FILTERCODER_H 5 6#include "../../Common/MyCom.h" 7#include "../ICoder.h" 8#include "../IPassword.h" 9 10#define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) if (iid == IID_ ## i) \ 11{ if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \ 12*outObject = (void *)(i *)this; AddRef(); return S_OK; } 13 14class CFilterCoder: 15 public ICompressCoder, 16 // #ifdef _ST_MODE 17 public ICompressSetInStream, 18 public ISequentialInStream, 19 public ICompressSetOutStream, 20 public ISequentialOutStream, 21 public IOutStreamFlush, 22 // #endif 23 24 #ifndef _NO_CRYPTO 25 public ICryptoSetPassword, 26 #endif 27 #ifndef EXTRACT_ONLY 28 public ICompressSetCoderProperties, 29 public ICompressWriteCoderProperties, 30 // public ICryptoResetSalt, 31 public ICryptoResetInitVector, 32 #endif 33 public ICompressSetDecoderProperties2, 34 public CMyUnknownImp 35{ 36protected: 37 Byte *_buffer; 38 // #ifdef _ST_MODE 39 CMyComPtr<ISequentialInStream> _inStream; 40 CMyComPtr<ISequentialOutStream> _outStream; 41 UInt32 _bufferPos; 42 UInt32 _convertedPosBegin; 43 UInt32 _convertedPosEnd; 44 // #endif 45 bool _outSizeIsDefined; 46 UInt64 _outSize; 47 UInt64 _nowPos64; 48 49 HRESULT Init() 50 { 51 _nowPos64 = 0; 52 _outSizeIsDefined = false; 53 return Filter->Init(); 54 } 55 56 CMyComPtr<ICryptoSetPassword> _setPassword; 57 #ifndef EXTRACT_ONLY 58 CMyComPtr<ICompressSetCoderProperties> _SetCoderProperties; 59 CMyComPtr<ICompressWriteCoderProperties> _writeCoderProperties; 60 // CMyComPtr<ICryptoResetSalt> _CryptoResetSalt; 61 CMyComPtr<ICryptoResetInitVector> _CryptoResetInitVector; 62 #endif 63 CMyComPtr<ICompressSetDecoderProperties2> _setDecoderProperties; 64public: 65 CMyComPtr<ICompressFilter> Filter; 66 67 CFilterCoder(); 68 ~CFilterCoder(); 69 HRESULT WriteWithLimit(ISequentialOutStream *outStream, UInt32 size); 70 bool NeedMore() const 71 { return (!_outSizeIsDefined || (_nowPos64 < _outSize)); } 72 73public: 74 MY_QUERYINTERFACE_BEGIN 75 MY_QUERYINTERFACE_ENTRY(ICompressCoder) 76 // #ifdef _ST_MODE 77 MY_QUERYINTERFACE_ENTRY(ICompressSetInStream) 78 MY_QUERYINTERFACE_ENTRY(ISequentialInStream) 79 80 MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream) 81 MY_QUERYINTERFACE_ENTRY(ISequentialOutStream) 82 MY_QUERYINTERFACE_ENTRY(IOutStreamFlush) 83 // #endif 84 85 #ifndef _NO_CRYPTO 86 MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _setPassword) 87 #endif 88 89 #ifndef EXTRACT_ONLY 90 MY_QUERYINTERFACE_ENTRY_AG(ICompressSetCoderProperties, Filter, _SetCoderProperties) 91 MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties) 92 // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt) 93 MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector) 94 #endif 95 96 MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties) 97 MY_QUERYINTERFACE_END 98 MY_ADDREF_RELEASE 99 STDMETHOD(Code)(ISequentialInStream *inStream, 100 ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, 101 ICompressProgressInfo *progress); 102 // #ifdef _ST_MODE 103 STDMETHOD(ReleaseInStream)(); 104 STDMETHOD(SetInStream)(ISequentialInStream *inStream); 105 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); \ 106 STDMETHOD(SetOutStream)(ISequentialOutStream *outStream); 107 STDMETHOD(ReleaseOutStream)(); 108 STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); 109 STDMETHOD(Flush)(); 110 // #endif 111 112 #ifndef _NO_CRYPTO 113 STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); 114 #endif 115 #ifndef EXTRACT_ONLY 116 STDMETHOD(SetCoderProperties)(const PROPID *propIDs, 117 const PROPVARIANT *properties, UInt32 numProperties); 118 STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); 119 // STDMETHOD(ResetSalt)(); 120 STDMETHOD(ResetInitVector)(); 121 #endif 122 STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); 123}; 124 125// #ifdef _ST_MODE 126class CInStreamReleaser 127{ 128public: 129 CFilterCoder *FilterCoder; 130 CInStreamReleaser(): FilterCoder(0) {} 131 ~CInStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); } 132}; 133 134class COutStreamReleaser 135{ 136public: 137 CFilterCoder *FilterCoder; 138 COutStreamReleaser(): FilterCoder(0) {} 139 ~COutStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); } 140}; 141// #endif 142 143#endif 144