Home | History | Annotate | Download | only in Common
      1 // FilterCoder.h
      2 
      3 #ifndef __FILTER_CODER_H
      4 #define __FILTER_CODER_H
      5 
      6 #include "../../../C/Alloc.h"
      7 
      8 #include "../../Common/MyCom.h"
      9 #include "../ICoder.h"
     10 
     11 #ifndef _NO_CRYPTO
     12 #include "../IPassword.h"
     13 #endif
     14 
     15 #define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) else if (iid == IID_ ## i) \
     16   { if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \
     17     *outObject = (void *)(i *)this; }
     18 
     19 
     20 struct CAlignedMidBuffer
     21 {
     22   #ifdef _WIN32
     23 
     24   Byte *_buf;
     25 
     26   CAlignedMidBuffer(): _buf(NULL) {}
     27   ~CAlignedMidBuffer() { ::MidFree(_buf); }
     28 
     29   void AllocAlignedMask(size_t size, size_t)
     30   {
     31     ::MidFree(_buf);
     32     _buf = (Byte *)::MidAlloc(size);
     33   }
     34 
     35   #else
     36 
     37   Byte *_bufBase;
     38   Byte *_buf;
     39 
     40   CAlignedMidBuffer(): _bufBase(NULL), _buf(NULL) {}
     41   ~CAlignedMidBuffer() { ::MidFree(_bufBase); }
     42 
     43   void AllocAlignedMask(size_t size, size_t alignMask)
     44   {
     45     ::MidFree(_bufBase);
     46     _buf = NULL;
     47     _bufBase = (Byte *)::MidAlloc(size + alignMask);
     48 
     49     if (_bufBase)
     50     {
     51       // _buf = (Byte *)(((uintptr_t)_bufBase + alignMask) & ~(uintptr_t)alignMask);
     52          _buf = (Byte *)(((ptrdiff_t)_bufBase + alignMask) & ~(ptrdiff_t)alignMask);
     53     }
     54   }
     55 
     56   #endif
     57 };
     58 
     59 class CFilterCoder:
     60   public ICompressCoder,
     61 
     62   public ICompressSetOutStreamSize,
     63   public ICompressInitEncoder,
     64 
     65   public ICompressSetInStream,
     66   public ISequentialInStream,
     67 
     68   public ICompressSetOutStream,
     69   public ISequentialOutStream,
     70   public IOutStreamFinish,
     71 
     72   public ICompressSetBufSize,
     73 
     74   #ifndef _NO_CRYPTO
     75   public ICryptoSetPassword,
     76   public ICryptoProperties,
     77   #endif
     78 
     79   #ifndef EXTRACT_ONLY
     80   public ICompressSetCoderProperties,
     81   public ICompressWriteCoderProperties,
     82   // public ICryptoResetSalt,
     83   public ICryptoResetInitVector,
     84   #endif
     85 
     86   public ICompressSetDecoderProperties2,
     87   public CMyUnknownImp,
     88   public CAlignedMidBuffer
     89 {
     90   UInt32 _bufSize;
     91   UInt32 _inBufSize;
     92   UInt32 _outBufSize;
     93 
     94   bool _encodeMode;
     95   bool _outSizeIsDefined;
     96   UInt64 _outSize;
     97   UInt64 _nowPos64;
     98 
     99   CMyComPtr<ISequentialInStream> _inStream;
    100   CMyComPtr<ISequentialOutStream> _outStream;
    101   UInt32 _bufPos;
    102   UInt32 _convPos;    // current pos in buffer for converted data
    103   UInt32 _convSize;   // size of converted data starting from _convPos
    104 
    105   void InitSpecVars()
    106   {
    107     _bufPos = 0;
    108     _convPos = 0;
    109     _convSize = 0;
    110 
    111     _outSizeIsDefined = false;
    112     _outSize = 0;
    113     _nowPos64 = 0;
    114   }
    115 
    116   HRESULT Alloc();
    117   HRESULT Init_and_Alloc();
    118   HRESULT Flush2();
    119 
    120   #ifndef _NO_CRYPTO
    121   CMyComPtr<ICryptoSetPassword> _SetPassword;
    122   CMyComPtr<ICryptoProperties> _CryptoProperties;
    123   #endif
    124 
    125   #ifndef EXTRACT_ONLY
    126   CMyComPtr<ICompressSetCoderProperties> _SetCoderProperties;
    127   CMyComPtr<ICompressWriteCoderProperties> _WriteCoderProperties;
    128   // CMyComPtr<ICryptoResetSalt> _CryptoResetSalt;
    129   CMyComPtr<ICryptoResetInitVector> _CryptoResetInitVector;
    130   #endif
    131 
    132   CMyComPtr<ICompressSetDecoderProperties2> _SetDecoderProperties2;
    133 
    134 public:
    135   CMyComPtr<ICompressFilter> Filter;
    136 
    137   CFilterCoder(bool encodeMode);
    138   ~CFilterCoder();
    139 
    140   class C_InStream_Releaser
    141   {
    142   public:
    143     CFilterCoder *FilterCoder;
    144     C_InStream_Releaser(): FilterCoder(NULL) {}
    145     ~C_InStream_Releaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); }
    146   };
    147 
    148   class C_OutStream_Releaser
    149   {
    150   public:
    151     CFilterCoder *FilterCoder;
    152     C_OutStream_Releaser(): FilterCoder(NULL) {}
    153     ~C_OutStream_Releaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); }
    154   };
    155 
    156   MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
    157 
    158     MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize)
    159     MY_QUERYINTERFACE_ENTRY(ICompressInitEncoder)
    160 
    161     MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)
    162     MY_QUERYINTERFACE_ENTRY(ISequentialInStream)
    163 
    164     MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream)
    165     MY_QUERYINTERFACE_ENTRY(ISequentialOutStream)
    166     MY_QUERYINTERFACE_ENTRY(IOutStreamFinish)
    167 
    168     MY_QUERYINTERFACE_ENTRY(ICompressSetBufSize)
    169 
    170     #ifndef _NO_CRYPTO
    171     MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _SetPassword)
    172     MY_QUERYINTERFACE_ENTRY_AG(ICryptoProperties, Filter, _CryptoProperties)
    173     #endif
    174 
    175     #ifndef EXTRACT_ONLY
    176     MY_QUERYINTERFACE_ENTRY_AG(ICompressSetCoderProperties, Filter, _SetCoderProperties)
    177     MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _WriteCoderProperties)
    178     // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt)
    179     MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector)
    180     #endif
    181 
    182     MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _SetDecoderProperties2)
    183   MY_QUERYINTERFACE_END
    184   MY_ADDREF_RELEASE
    185 
    186 
    187   STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
    188       const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
    189 
    190   STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
    191   STDMETHOD(InitEncoder)();
    192 
    193   STDMETHOD(SetInStream)(ISequentialInStream *inStream);
    194   STDMETHOD(ReleaseInStream)();
    195   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
    196 
    197   STDMETHOD(SetOutStream)(ISequentialOutStream *outStream);
    198   STDMETHOD(ReleaseOutStream)();
    199   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
    200   STDMETHOD(OutStreamFinish)();
    201 
    202   STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
    203   STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
    204 
    205   #ifndef _NO_CRYPTO
    206   STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
    207 
    208   STDMETHOD(SetKey)(const Byte *data, UInt32 size);
    209   STDMETHOD(SetInitVector)(const Byte *data, UInt32 size);
    210   #endif
    211 
    212   #ifndef EXTRACT_ONLY
    213   STDMETHOD(SetCoderProperties)(const PROPID *propIDs,
    214       const PROPVARIANT *properties, UInt32 numProperties);
    215   STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
    216   // STDMETHOD(ResetSalt)();
    217   STDMETHOD(ResetInitVector)();
    218   #endif
    219 
    220   STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
    221 
    222 
    223   HRESULT Init_NoSubFilterInit();
    224 };
    225 
    226 #endif
    227