Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Archive/Rar/RarHandler.h')
-rw-r--r--[-rwxr-xr-x]CPP/7zip/Archive/Rar/RarHandler.h79
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,