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