1 // XzDecoder.h 2 3 #ifndef ZIP7_INC_XZ_DECODER_H 4 #define ZIP7_INC_XZ_DECODER_H 5 6 #include "../../../C/Xz.h" 7 8 #include "../../Common/MyCom.h" 9 10 #include "../ICoder.h" 11 12 namespace NCompress { 13 namespace NXz { 14 15 struct CDecoder 16 { 17 CXzDecMtHandle xz; 18 int _tryMt; 19 UInt32 _numThreads; 20 UInt64 _memUsage; 21 22 SRes MainDecodeSRes; // it's not HRESULT 23 bool MainDecodeSRes_wasUsed; 24 CXzStatInfo Stat; 25 CDecoderCDecoder26 CDecoder(): 27 xz(NULL), 28 _tryMt(True), 29 _numThreads(1), 30 _memUsage((UInt64)(sizeof(size_t)) << 28), 31 MainDecodeSRes(SZ_OK), 32 MainDecodeSRes_wasUsed(false) 33 {} 34 ~CDecoderCDecoder35 ~CDecoder() 36 { 37 if (xz) 38 XzDecMt_Destroy(xz); 39 } 40 41 /* Decode() can return S_OK, if there is data after good xz streams, and that data is not new xz stream. 42 check also (Stat.DataAfterEnd) flag */ 43 44 HRESULT Decode(ISequentialInStream *seqInStream, ISequentialOutStream *outStream, 45 const UInt64 *outSizeLimit, bool finishStream, ICompressProgressInfo *compressProgress); 46 }; 47 48 49 class CComDecoder Z7_final: 50 public ICompressCoder, 51 public ICompressSetFinishMode, 52 public ICompressGetInStreamProcessedSize, 53 #ifndef Z7_ST 54 public ICompressSetCoderMt, 55 public ICompressSetMemLimit, 56 #endif 57 public CMyUnknownImp, 58 public CDecoder 59 { 60 Z7_COM_QI_BEGIN2(ICompressCoder) 61 Z7_COM_QI_ENTRY(ICompressSetFinishMode) 62 Z7_COM_QI_ENTRY(ICompressGetInStreamProcessedSize) 63 #ifndef Z7_ST 64 Z7_COM_QI_ENTRY(ICompressSetCoderMt) 65 Z7_COM_QI_ENTRY(ICompressSetMemLimit) 66 #endif 67 Z7_COM_QI_END 68 Z7_COM_ADDREF_RELEASE 69 70 Z7_IFACE_COM7_IMP(ICompressCoder) 71 Z7_IFACE_COM7_IMP(ICompressSetFinishMode) 72 Z7_IFACE_COM7_IMP(ICompressGetInStreamProcessedSize) 73 #ifndef Z7_ST 74 Z7_IFACE_COM7_IMP(ICompressSetCoderMt) 75 Z7_IFACE_COM7_IMP(ICompressSetMemLimit) 76 #endif 77 78 bool _finishStream; 79 80 public: CComDecoder()81 CComDecoder(): _finishStream(false) {} 82 }; 83 84 }} 85 86 #endif 87