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
|