1*f6dc9357SAndroid Build Coastguard Worker // RarHandler.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_RAR_HANDLER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_RAR_HANDLER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../IArchive.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "RarItem.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 13*f6dc9357SAndroid Build Coastguard Worker namespace NRar { 14*f6dc9357SAndroid Build Coastguard Worker 15*f6dc9357SAndroid Build Coastguard Worker struct CInArcInfo 16*f6dc9357SAndroid Build Coastguard Worker { 17*f6dc9357SAndroid Build Coastguard Worker UInt32 Flags; 18*f6dc9357SAndroid Build Coastguard Worker Byte EncryptVersion; 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker UInt64 StartPos; 21*f6dc9357SAndroid Build Coastguard Worker UInt64 EndPos; 22*f6dc9357SAndroid Build Coastguard Worker UInt64 FileSize; 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker UInt32 EndFlags; 25*f6dc9357SAndroid Build Coastguard Worker UInt32 VolNumber; 26*f6dc9357SAndroid Build Coastguard Worker UInt32 DataCRC; 27*f6dc9357SAndroid Build Coastguard Worker bool EndOfArchive_was_Read; 28*f6dc9357SAndroid Build Coastguard Worker CInArcInfoCInArcInfo29*f6dc9357SAndroid Build Coastguard Worker CInArcInfo(): EndFlags(0), VolNumber(0), EndOfArchive_was_Read(false) {} 30*f6dc9357SAndroid Build Coastguard Worker GetPhySizeCInArcInfo31*f6dc9357SAndroid Build Coastguard Worker UInt64 GetPhySize() const { return EndPos - StartPos; } 32*f6dc9357SAndroid Build Coastguard Worker ExtraZeroTail_is_PossibleCInArcInfo33*f6dc9357SAndroid Build Coastguard Worker bool ExtraZeroTail_is_Possible() const { return IsVolume() && IsRecovery() && EndOfArchive_was_Read; } 34*f6dc9357SAndroid Build Coastguard Worker IsVolumeCInArcInfo35*f6dc9357SAndroid Build Coastguard Worker bool IsVolume() const { return (Flags & NHeader::NArchive::kVolume) != 0; } IsCommentedCInArcInfo36*f6dc9357SAndroid Build Coastguard Worker bool IsCommented() const { return (Flags & NHeader::NArchive::kComment) != 0; } 37*f6dc9357SAndroid Build Coastguard Worker // kLock IsSolidCInArcInfo38*f6dc9357SAndroid Build Coastguard Worker bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; } HaveNewVolumeNameCInArcInfo39*f6dc9357SAndroid Build Coastguard Worker bool HaveNewVolumeName() const { return (Flags & NHeader::NArchive::kNewVolName) != 0; } 40*f6dc9357SAndroid Build Coastguard Worker // kAuthenticity IsRecoveryCInArcInfo41*f6dc9357SAndroid Build Coastguard Worker bool IsRecovery() const { return (Flags & NHeader::NArchive::kRecovery) != 0; } IsEncryptedCInArcInfo42*f6dc9357SAndroid Build Coastguard Worker bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; } IsFirstVolumeCInArcInfo43*f6dc9357SAndroid Build Coastguard Worker bool IsFirstVolume() const { return (Flags & NHeader::NArchive::kFirstVolume) != 0; } 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker // bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; } 46*f6dc9357SAndroid Build Coastguard Worker // bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); } 47*f6dc9357SAndroid Build Coastguard Worker AreMoreVolumesCInArcInfo48*f6dc9357SAndroid Build Coastguard Worker bool AreMoreVolumes() const { return (EndFlags & NHeader::NArchive::kEndOfArc_Flags_NextVol) != 0; } Is_VolNumber_DefinedCInArcInfo49*f6dc9357SAndroid Build Coastguard Worker bool Is_VolNumber_Defined() const { return (EndFlags & NHeader::NArchive::kEndOfArc_Flags_VolNumber) != 0; } Is_DataCRC_DefinedCInArcInfo50*f6dc9357SAndroid Build Coastguard Worker bool Is_DataCRC_Defined() const { return (EndFlags & NHeader::NArchive::kEndOfArc_Flags_DataCRC) != 0; } 51*f6dc9357SAndroid Build Coastguard Worker }; 52*f6dc9357SAndroid Build Coastguard Worker 53*f6dc9357SAndroid Build Coastguard Worker struct CArc 54*f6dc9357SAndroid Build Coastguard Worker { 55*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> Stream; 56*f6dc9357SAndroid Build Coastguard Worker UInt64 PhySize; 57*f6dc9357SAndroid Build Coastguard Worker // CByteBuffer Comment; 58*f6dc9357SAndroid Build Coastguard Worker CArcCArc59*f6dc9357SAndroid Build Coastguard Worker CArc(): PhySize(0) {} 60*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *CreateLimitedStream(UInt64 offset, UInt64 size) const; 61*f6dc9357SAndroid Build Coastguard Worker }; 62*f6dc9357SAndroid Build Coastguard Worker 63*f6dc9357SAndroid Build Coastguard Worker struct CRefItem 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker unsigned VolumeIndex; 66*f6dc9357SAndroid Build Coastguard Worker unsigned ItemIndex; 67*f6dc9357SAndroid Build Coastguard Worker unsigned NumItems; 68*f6dc9357SAndroid Build Coastguard Worker }; 69*f6dc9357SAndroid Build Coastguard Worker 70*f6dc9357SAndroid Build Coastguard Worker class CHandler Z7_final: 71*f6dc9357SAndroid Build Coastguard Worker public IInArchive, 72*f6dc9357SAndroid Build Coastguard Worker Z7_PUBLIC_ISetCompressCodecsInfo_IFEC 73*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 74*f6dc9357SAndroid Build Coastguard Worker { 75*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN2(IInArchive) 76*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC 77*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_END 78*f6dc9357SAndroid Build Coastguard Worker Z7_COM_ADDREF_RELEASE 79*f6dc9357SAndroid Build Coastguard Worker 80*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IInArchive) 81*f6dc9357SAndroid Build Coastguard Worker DECL_ISetCompressCodecsInfo 82*f6dc9357SAndroid Build Coastguard Worker 83*f6dc9357SAndroid Build Coastguard Worker bool _isArc; 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CRefItem> _refItems; 86*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CItem> _items; 87*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CArc> _arcs; 88*f6dc9357SAndroid Build Coastguard Worker NArchive::NRar::CInArcInfo _arcInfo; 89*f6dc9357SAndroid Build Coastguard Worker // AString _errorMessage; 90*f6dc9357SAndroid Build Coastguard Worker UInt32 _errorFlags; 91*f6dc9357SAndroid Build Coastguard Worker UInt32 _warningFlags; 92*f6dc9357SAndroid Build Coastguard Worker UString _missingVolName; 93*f6dc9357SAndroid Build Coastguard Worker 94*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_VARS 95*f6dc9357SAndroid Build Coastguard Worker 96*f6dc9357SAndroid Build Coastguard Worker UInt64 GetPackSize(unsigned refIndex) const; 97*f6dc9357SAndroid Build Coastguard Worker bool IsSolid(unsigned refIndex) const; 98*f6dc9357SAndroid Build Coastguard Worker 99*f6dc9357SAndroid Build Coastguard Worker /* 100*f6dc9357SAndroid Build Coastguard Worker void AddErrorMessage(const AString &s) 101*f6dc9357SAndroid Build Coastguard Worker { 102*f6dc9357SAndroid Build Coastguard Worker if (!_errorMessage.IsEmpty()) 103*f6dc9357SAndroid Build Coastguard Worker _errorMessage.Add_LF(); 104*f6dc9357SAndroid Build Coastguard Worker _errorMessage += s; 105*f6dc9357SAndroid Build Coastguard Worker } 106*f6dc9357SAndroid Build Coastguard Worker */ 107*f6dc9357SAndroid Build Coastguard Worker 108*f6dc9357SAndroid Build Coastguard Worker HRESULT Open2(IInStream *stream, 109*f6dc9357SAndroid Build Coastguard Worker const UInt64 *maxCheckStartPosition, 110*f6dc9357SAndroid Build Coastguard Worker IArchiveOpenCallback *openCallback); 111*f6dc9357SAndroid Build Coastguard Worker }; 112*f6dc9357SAndroid Build Coastguard Worker 113*f6dc9357SAndroid Build Coastguard Worker }} 114*f6dc9357SAndroid Build Coastguard Worker 115*f6dc9357SAndroid Build Coastguard Worker #endif 116