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