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