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