1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
// FilterCoder.h
#ifndef ZIP7_INC_FILTER_CODER_H
#define ZIP7_INC_FILTER_CODER_H
#include "../../../C/Alloc.h"
#include "../../Common/MyCom.h"
#include "../ICoder.h"
#ifndef Z7_NO_CRYPTO
#include "../IPassword.h"
#endif
#define Z7_COM_QI_ENTRY_AG(i, sub0, sub) else if (iid == IID_ ## i) \
{ if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \
*outObject = (void *)(i *)this; }
struct CAlignedMidBuffer
{
Byte *_buf;
CAlignedMidBuffer(): _buf(NULL) {}
~CAlignedMidBuffer();
void AllocAligned(size_t size);
};
class CFilterCoder Z7_final :
public ICompressCoder,
public ICompressSetOutStreamSize,
public ICompressInitEncoder,
public ICompressSetInStream,
public ISequentialInStream,
public ICompressSetOutStream,
public ISequentialOutStream,
public IOutStreamFinish,
public ICompressSetBufSize,
#ifndef Z7_NO_CRYPTO
public ICryptoSetPassword,
public ICryptoProperties,
#endif
#ifndef Z7_EXTRACT_ONLY
public ICompressSetCoderProperties,
public ICompressWriteCoderProperties,
public ICompressSetCoderPropertiesOpt,
// public ICryptoResetSalt,
public ICryptoResetInitVector,
#endif
public ICompressSetDecoderProperties2,
public CMyUnknownImp,
public CAlignedMidBuffer
{
UInt32 _bufSize;
UInt32 _inBufSize;
UInt32 _outBufSize;
bool _encodeMode;
bool _outSize_Defined;
UInt64 _outSize;
UInt64 _nowPos64;
CMyComPtr<ISequentialInStream> _inStream;
CMyComPtr<ISequentialOutStream> _outStream;
UInt32 _bufPos;
UInt32 _convPos; // current pos in buffer for converted data
UInt32 _convSize; // size of converted data starting from _convPos
void InitSpecVars()
{
_bufPos = 0;
_convPos = 0;
_convSize = 0;
_outSize_Defined = false;
_outSize = 0;
_nowPos64 = 0;
}
HRESULT Alloc();
HRESULT Init_and_Alloc();
HRESULT Flush2();
#ifndef Z7_NO_CRYPTO
CMyComPtr<ICryptoSetPassword> _setPassword;
CMyComPtr<ICryptoProperties> _cryptoProperties;
#endif
#ifndef Z7_EXTRACT_ONLY
CMyComPtr<ICompressSetCoderProperties> _setCoderProperties;
CMyComPtr<ICompressWriteCoderProperties> _writeCoderProperties;
CMyComPtr<ICompressSetCoderPropertiesOpt> _setCoderPropertiesOpt;
// CMyComPtr<ICryptoResetSalt> _cryptoResetSalt;
CMyComPtr<ICryptoResetInitVector> _cryptoResetInitVector;
#endif
CMyComPtr<ICompressSetDecoderProperties2> _setDecoderProperties2;
public:
CMyComPtr<ICompressFilter> Filter;
CFilterCoder(bool encodeMode);
struct C_InStream_Releaser
{
CFilterCoder *FilterCoder;
C_InStream_Releaser(): FilterCoder(NULL) {}
~C_InStream_Releaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); }
};
struct C_OutStream_Releaser
{
CFilterCoder *FilterCoder;
C_OutStream_Releaser(): FilterCoder(NULL) {}
~C_OutStream_Releaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); }
};
struct C_Filter_Releaser
{
CFilterCoder *FilterCoder;
C_Filter_Releaser(): FilterCoder(NULL) {}
~C_Filter_Releaser() { if (FilterCoder) FilterCoder->Filter.Release(); }
};
private:
Z7_COM_QI_BEGIN2(ICompressCoder)
Z7_COM_QI_ENTRY(ICompressSetOutStreamSize)
Z7_COM_QI_ENTRY(ICompressInitEncoder)
Z7_COM_QI_ENTRY(ICompressSetInStream)
Z7_COM_QI_ENTRY(ISequentialInStream)
Z7_COM_QI_ENTRY(ICompressSetOutStream)
Z7_COM_QI_ENTRY(ISequentialOutStream)
Z7_COM_QI_ENTRY(IOutStreamFinish)
Z7_COM_QI_ENTRY(ICompressSetBufSize)
#ifndef Z7_NO_CRYPTO
Z7_COM_QI_ENTRY_AG(ICryptoSetPassword, Filter, _setPassword)
Z7_COM_QI_ENTRY_AG(ICryptoProperties, Filter, _cryptoProperties)
#endif
#ifndef Z7_EXTRACT_ONLY
Z7_COM_QI_ENTRY_AG(ICompressSetCoderProperties, Filter, _setCoderProperties)
Z7_COM_QI_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties)
Z7_COM_QI_ENTRY_AG(ICompressSetCoderPropertiesOpt, Filter, _setCoderPropertiesOpt)
// Z7_COM_QI_ENTRY_AG(ICryptoResetSalt, Filter, _cryptoResetSalt)
Z7_COM_QI_ENTRY_AG(ICryptoResetInitVector, Filter, _cryptoResetInitVector)
#endif
Z7_COM_QI_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties2)
Z7_COM_QI_END
Z7_COM_ADDREF_RELEASE
public:
Z7_IFACE_COM7_IMP(ICompressCoder)
Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize)
Z7_IFACE_COM7_IMP(ICompressInitEncoder)
Z7_IFACE_COM7_IMP(ICompressSetInStream)
private:
Z7_IFACE_COM7_IMP(ISequentialInStream)
public:
Z7_IFACE_COM7_IMP(ICompressSetOutStream)
private:
Z7_IFACE_COM7_IMP(ISequentialOutStream)
public:
Z7_IFACE_COM7_IMP(IOutStreamFinish)
private:
Z7_IFACE_COM7_IMP(ICompressSetBufSize)
#ifndef Z7_NO_CRYPTO
Z7_IFACE_COM7_IMP(ICryptoSetPassword)
Z7_IFACE_COM7_IMP(ICryptoProperties)
#endif
#ifndef Z7_EXTRACT_ONLY
Z7_IFACE_COM7_IMP(ICompressSetCoderProperties)
Z7_IFACE_COM7_IMP(ICompressWriteCoderProperties)
Z7_IFACE_COM7_IMP(ICompressSetCoderPropertiesOpt)
// Z7_IFACE_COM7_IMP(ICryptoResetSalt)
Z7_IFACE_COM7_IMP(ICryptoResetInitVector)
#endif
public:
Z7_IFACE_COM7_IMP(ICompressSetDecoderProperties2)
HRESULT Init_NoSubFilterInit();
};
#endif
|