diff options
Diffstat (limited to 'CPP/7zip/Archive/Rar/RarHandler.h')
-rw-r--r--[-rwxr-xr-x] | CPP/7zip/Archive/Rar/RarHandler.h | 79 |
1 files changed, 60 insertions, 19 deletions
diff --git a/CPP/7zip/Archive/Rar/RarHandler.h b/CPP/7zip/Archive/Rar/RarHandler.h index 79266827..81191be9 100755..100644 --- a/CPP/7zip/Archive/Rar/RarHandler.h +++ b/CPP/7zip/Archive/Rar/RarHandler.h @@ -7,44 +7,85 @@ #include "../../Common/CreateCoder.h" -#include "RarIn.h" -#include "RarVolumeInStream.h" +#include "RarItem.h" namespace NArchive { namespace NRar { +struct CInArcInfo +{ + UInt32 Flags; + Byte EncryptVersion; + + UInt64 StartPos; + UInt64 EndPos; + UInt64 FileSize; + + UInt32 EndFlags; + UInt32 VolNumber; + UInt32 DataCRC; + + CInArcInfo(): EndFlags(0) {} + + UInt64 GetPhySize() const { return EndPos - StartPos; } + + bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; } + bool IsCommented() const { return (Flags & NHeader::NArchive::kComment) != 0; } + bool IsVolume() const { return (Flags & NHeader::NArchive::kVolume) != 0; } + bool HaveNewVolumeName() const { return (Flags & NHeader::NArchive::kNewVolName) != 0; } + bool IsFirstVolume() const { return (Flags & NHeader::NArchive::kFirstVolume) != 0; } + bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; } + bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; } + bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); } + + bool Is_VolNumber_Defined() const { return (EndFlags & NHeader::NArchive::kEndOfArc_Flags_VolNumber) != 0; } + bool Is_DataCRC_Defined() const { return (EndFlags & NHeader::NArchive::kEndOfArc_Flags_DataCRC) != 0; } +}; + +struct CArc +{ + CMyComPtr<IInStream> Stream; + UInt64 PhySize; + // CByteBuffer Comment; + + CArc(): PhySize(0) {} + ISequentialInStream *CreateLimitedStream(UInt64 offset, UInt64 size) const; +}; + +struct CRefItem +{ + unsigned VolumeIndex; + unsigned ItemIndex; + unsigned NumItems; +}; + class CHandler: public IInArchive, PUBLIC_ISetCompressCodecsInfo public CMyUnknownImp { CRecordVector<CRefItem> _refItems; - CObjectVector<CItemEx> _items; - CObjectVector<CInArchive> _archives; - NArchive::NRar::CInArchiveInfo _archiveInfo; - AString _errorMessage; + CObjectVector<CItem> _items; + CObjectVector<CArc> _arcs; + NArchive::NRar::CInArcInfo _arcInfo; + // AString _errorMessage; + UInt32 _errorFlags; + UInt32 _warningFlags; + bool _isArc; DECL_EXTERNAL_CODECS_VARS - UInt64 GetPackSize(int refIndex) const; - - bool IsSolid(int refIndex) - { - const CItemEx &item = _items[_refItems[refIndex].ItemIndex]; - if (item.UnPackVersion < 20) - { - if (_archiveInfo.IsSolid()) - return (refIndex > 0); - return false; - } - return item.IsSolid(); - } + UInt64 GetPackSize(unsigned refIndex) const; + bool IsSolid(unsigned refIndex) const; + + /* void AddErrorMessage(const AString &s) { if (!_errorMessage.IsEmpty()) _errorMessage += '\n'; _errorMessage += s; } + */ HRESULT Open2(IInStream *stream, const UInt64 *maxCheckStartPosition, |