mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-07 05:15:01 -06:00
9.34
This commit is contained in:
committed by
Kornel Lesiński
parent
83f8ddcc5b
commit
f08f4dcc3c
79
CPP/7zip/Archive/Rar/RarHandler.h
Executable file → Normal file
79
CPP/7zip/Archive/Rar/RarHandler.h
Executable file → Normal file
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user