1*f6dc9357SAndroid Build Coastguard Worker // HfsHandler.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_HFS_HANDLER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_HFS_HANDLER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/PropVariant.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../Compress/LzfseDecoder.h" 9*f6dc9357SAndroid Build Coastguard Worker #include "../Compress/ZlibDecoder.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 12*f6dc9357SAndroid Build Coastguard Worker namespace NHfs { 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker static const UInt32 k_decmpfs_HeaderSize = 16; 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker struct CCompressHeader 17*f6dc9357SAndroid Build Coastguard Worker { 18*f6dc9357SAndroid Build Coastguard Worker UInt64 UnpackSize; 19*f6dc9357SAndroid Build Coastguard Worker UInt32 Method; 20*f6dc9357SAndroid Build Coastguard Worker Byte DataPos; 21*f6dc9357SAndroid Build Coastguard Worker bool IsCorrect; 22*f6dc9357SAndroid Build Coastguard Worker bool IsSupported; 23*f6dc9357SAndroid Build Coastguard Worker bool IsResource; 24*f6dc9357SAndroid Build Coastguard Worker IsMethod_Compressed_InlineCCompressHeader25*f6dc9357SAndroid Build Coastguard Worker bool IsMethod_Compressed_Inline() const { return DataPos == k_decmpfs_HeaderSize; } IsMethod_Uncompressed_InlineCCompressHeader26*f6dc9357SAndroid Build Coastguard Worker bool IsMethod_Uncompressed_Inline() const { return DataPos == k_decmpfs_HeaderSize + 1; } IsMethod_ResourceCCompressHeader27*f6dc9357SAndroid Build Coastguard Worker bool IsMethod_Resource() const { return IsResource; } 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker void Parse(const Byte *p, size_t size); 30*f6dc9357SAndroid Build Coastguard Worker ClearCCompressHeader31*f6dc9357SAndroid Build Coastguard Worker void Clear() 32*f6dc9357SAndroid Build Coastguard Worker { 33*f6dc9357SAndroid Build Coastguard Worker UnpackSize = 0; 34*f6dc9357SAndroid Build Coastguard Worker Method = 0; 35*f6dc9357SAndroid Build Coastguard Worker DataPos = 0; 36*f6dc9357SAndroid Build Coastguard Worker IsCorrect = false; 37*f6dc9357SAndroid Build Coastguard Worker IsSupported = false; 38*f6dc9357SAndroid Build Coastguard Worker IsResource = false; 39*f6dc9357SAndroid Build Coastguard Worker } 40*f6dc9357SAndroid Build Coastguard Worker CCompressHeaderCCompressHeader41*f6dc9357SAndroid Build Coastguard Worker CCompressHeader() { Clear(); } 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker void MethodToProp(NWindows::NCOM::CPropVariant &prop) const; 44*f6dc9357SAndroid Build Coastguard Worker }; 45*f6dc9357SAndroid Build Coastguard Worker 46*f6dc9357SAndroid Build Coastguard Worker void MethodsMaskToProp(UInt32 methodsMask, NWindows::NCOM::CPropVariant &prop); 47*f6dc9357SAndroid Build Coastguard Worker 48*f6dc9357SAndroid Build Coastguard Worker 49*f6dc9357SAndroid Build Coastguard Worker class CDecoder 50*f6dc9357SAndroid Build Coastguard Worker { 51*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2_Create<ICompressCoder, NCompress::NZlib::CDecoder> _zlibDecoder; 52*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2_Create<ICompressCoder, NCompress::NLzfse::CDecoder> _lzfseDecoder; 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker CByteBuffer _tableBuf; 55*f6dc9357SAndroid Build Coastguard Worker CByteBuffer _buf; 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker HRESULT ExtractResourceFork_ZLIB( 58*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *inStream, ISequentialOutStream *realOutStream, 59*f6dc9357SAndroid Build Coastguard Worker UInt64 forkSize, UInt64 unpackSize, 60*f6dc9357SAndroid Build Coastguard Worker UInt64 progressStart, IArchiveExtractCallback *extractCallback); 61*f6dc9357SAndroid Build Coastguard Worker 62*f6dc9357SAndroid Build Coastguard Worker HRESULT ExtractResourceFork_LZFSE( 63*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *inStream, ISequentialOutStream *realOutStream, 64*f6dc9357SAndroid Build Coastguard Worker UInt64 forkSize, UInt64 unpackSize, 65*f6dc9357SAndroid Build Coastguard Worker UInt64 progressStart, IArchiveExtractCallback *extractCallback); 66*f6dc9357SAndroid Build Coastguard Worker 67*f6dc9357SAndroid Build Coastguard Worker HRESULT ExtractResourceFork_ZBM( 68*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *inStream, ISequentialOutStream *realOutStream, 69*f6dc9357SAndroid Build Coastguard Worker UInt64 forkSize, UInt64 unpackSize, 70*f6dc9357SAndroid Build Coastguard Worker UInt64 progressStart, IArchiveExtractCallback *extractCallback); 71*f6dc9357SAndroid Build Coastguard Worker 72*f6dc9357SAndroid Build Coastguard Worker public: 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker HRESULT Extract( 75*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *inStreamFork, ISequentialOutStream *realOutStream, 76*f6dc9357SAndroid Build Coastguard Worker UInt64 forkSize, 77*f6dc9357SAndroid Build Coastguard Worker const CCompressHeader &compressHeader, 78*f6dc9357SAndroid Build Coastguard Worker const CByteBuffer *data, 79*f6dc9357SAndroid Build Coastguard Worker UInt64 progressStart, IArchiveExtractCallback *extractCallback, 80*f6dc9357SAndroid Build Coastguard Worker int &opRes); 81*f6dc9357SAndroid Build Coastguard Worker 82*f6dc9357SAndroid Build Coastguard Worker CDecoder(bool IsAdlerOptional); 83*f6dc9357SAndroid Build Coastguard Worker }; 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker }} 86*f6dc9357SAndroid Build Coastguard Worker 87*f6dc9357SAndroid Build Coastguard Worker #endif 88