xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Rar/RarHandler.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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