Line | Count | Source (jump to first uncovered line) |
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 | 0 | #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); |
85 | 167k | HEADER_TYPE GetHeaderType() {return CurHeaderType;} |
86 | 196k | RAROptions* GetRAROptions() {return Cmd;} |
87 | 0 | 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(); |
96 | 0 | void QOpenUnload() {QOpen.Unload();} |
97 | 536 | 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 |