annotate src/win32/7zip/7z/CPP/7zip/Common/FilterCoder.h @ 1:f9f4f1b99eed

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