1 #ifndef _RAR_ARCHIVE_
2 #define _RAR_ARCHIVE_
3 
4 class PPack;
5 class RawRead;
6 class RawWrite;
7 
8 enum NOMODIFY_FLAGS
9 {
10   NMDF_ALLOWLOCK=1,NMDF_ALLOWANYVOLUME=2,NMDF_ALLOWFIRSTVOLUME=4
11 };
12 
13 enum RARFORMAT {RARFMT_NONE,RARFMT14,RARFMT15,RARFMT50,RARFMT_FUTURE};
14 
15 enum ADDSUBDATA_FLAGS
16 {
17   ASDF_SPLIT          = 1, // Allow to split archive just before header if necessary.
18   ASDF_COMPRESS       = 2, // Allow to compress data following subheader.
19   ASDF_CRYPT          = 4, // Encrypt data after subheader if password is set.
20   ASDF_CRYPTIFHEADERS = 8  // Encrypt data after subheader only in -hp mode.
21 };
22 
23 // RAR5 headers must not exceed 2 MB.
24 #define MAX_HEADER_SIZE_RAR5 0x200000
25 
26 class Archive:public File
27 {
28   private:
29     void UpdateLatestTime(FileHeader *CurBlock);
30     void ConvertNameCase(wchar *Name);
31     void ConvertFileHeader(FileHeader *hd);
32     size_t ReadHeader14();
33     size_t ReadHeader15();
34     size_t ReadHeader50();
35     void ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb);
36     void RequestArcPassword();
37     void UnexpEndArcMsg();
38     void BrokenHeaderMsg();
39     void UnkEncVerMsg(const wchar *Name,const wchar *Info);
40     bool DoGetComment(Array<wchar> *CmtData);
41     bool ReadCommentData(Array<wchar> *CmtData);
42 
43 #if !defined(RAR_NOCRYPT)
44     CryptData HeadersCrypt;
45 #endif
46     ComprDataIO SubDataIO;
47     bool DummyCmd;
48     RAROptions *Cmd;
49 
50 
51     RarTime LatestTime;
52     int LastReadBlock;
53     HEADER_TYPE CurHeaderType;
54 
55     bool SilentOpen;
56 #ifdef USE_QOPEN
57     QuickOpen QOpen;
58     bool ProhibitQOpen;
59 #endif
60   public:
61     Archive(RAROptions *InitCmd=NULL);
62     ~Archive();
63     static RARFORMAT IsSignature(const byte *D,size_t Size);
64     bool IsArchive(bool EnableBroken);
65     size_t SearchBlock(HEADER_TYPE HeaderType);
66     size_t SearchSubBlock(const wchar *Type);
67     size_t SearchRR();
68     size_t ReadHeader();
69     void CheckArc(bool EnableBroken);
70     void CheckOpen(const wchar *Name);
71     bool WCheckOpen(const wchar *Name);
72     bool GetComment(Array<wchar> *CmtData);
73     void ViewComment();
74     void SetLatestTime(RarTime *NewTime);
75     void SeekToNext();
76     bool CheckAccess();
77     bool IsArcDir();
78     void ConvertAttributes();
79     void VolSubtractHeaderSize(size_t SubSize);
80     uint FullHeaderSize(size_t Size);
81     int64 GetStartPos();
82     void AddSubData(byte *SrcData,uint64 DataSize,File *SrcFile,
83          const wchar *Name,uint Flags);
84     bool ReadSubData(Array<byte> *UnpData,File *DestFile,bool TestMode);
GetHeaderType()85     HEADER_TYPE GetHeaderType() {return CurHeaderType;}
GetRAROptions()86     RAROptions* GetRAROptions() {return Cmd;}
SetSilentOpen(bool Mode)87     void SetSilentOpen(bool Mode) {SilentOpen=Mode;}
88 #if 0
89     void GetRecoveryInfo(bool Required,int64 *Size,int *Percent);
90 #endif
91 #ifdef USE_QOPEN
92     bool Open(const wchar *Name,uint Mode=FMF_READ);
93     int Read(void *Data,size_t Size);
94     void Seek(int64 Offset,int Method);
95     int64 Tell();
QOpenUnload()96     void QOpenUnload() {QOpen.Unload();}
SetProhibitQOpen(bool Mode)97     void SetProhibitQOpen(bool Mode) {ProhibitQOpen=Mode;}
98 #endif
99 
100     BaseBlock ShortBlock;
101     MarkHeader MarkHead;
102     MainHeader MainHead;
103     CryptHeader CryptHead;
104     FileHeader FileHead;
105     EndArcHeader EndArcHead;
106     SubBlockHeader SubBlockHead;
107     FileHeader SubHead;
108     CommentHeader CommHead;
109     ProtectHeader ProtectHead;
110     UnixOwnersHeader UOHead;
111     EAHeader EAHead;
112     StreamHeader StreamHead;
113 
114     int64 CurBlockPos;
115     int64 NextBlockPos;
116 
117     RARFORMAT Format;
118     bool Solid;
119     bool Volume;
120     bool MainComment;
121     bool Locked;
122     bool Signed;
123     bool FirstVolume;
124     bool NewNumbering;
125     bool Protected;
126     bool Encrypted;
127     size_t SFXSize;
128     bool BrokenHeader;
129     bool FailedHeaderDecryption;
130 
131 #if !defined(RAR_NOCRYPT)
132     byte ArcSalt[SIZE_SALT50];
133 #endif
134 
135     bool Splitting;
136 
137     uint VolNumber;
138     int64 VolWrite;
139     uint64 AddingFilesSize;
140     uint64 AddingHeadersSize;
141 
142     bool NewArchive;
143 
144     wchar FirstVolumeName[NM];
145 };
146 
147 
148 #endif
149