| #ifndef _RAR_ARCHIVE_ |
| #define _RAR_ARCHIVE_ |
| |
| class PPack; |
| class RawRead; |
| class RawWrite; |
| |
| enum NOMODIFY_FLAGS |
| { |
| NMDF_ALLOWLOCK=1,NMDF_ALLOWANYVOLUME=2,NMDF_ALLOWFIRSTVOLUME=4 |
| }; |
| |
| enum RARFORMAT {RARFMT_NONE,RARFMT14,RARFMT15,RARFMT50,RARFMT_FUTURE}; |
| |
| enum ADDSUBDATA_FLAGS |
| { |
| ASDF_SPLIT = 1, // Allow to split archive just before header if necessary. |
| ASDF_COMPRESS = 2, // Allow to compress data following subheader. |
| ASDF_CRYPT = 4, // Encrypt data after subheader if password is set. |
| ASDF_CRYPTIFHEADERS = 8 // Encrypt data after subheader only in -hp mode. |
| }; |
| |
| // RAR5 headers must not exceed 2 MB. |
| #define MAX_HEADER_SIZE_RAR5 0x200000 |
| |
| class Archive:public File |
| { |
| private: |
| void UpdateLatestTime(FileHeader *CurBlock); |
| void ConvertNameCase(wchar *Name); |
| void ConvertFileHeader(FileHeader *hd); |
| void WriteBlock50(HEADER_TYPE HeaderType,BaseBlock *wb,bool OnlySetSize,bool NonFinalWrite); |
| size_t ReadHeader14(); |
| size_t ReadHeader15(); |
| size_t ReadHeader50(); |
| void ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb); |
| void RequestArcPassword(); |
| void UnexpEndArcMsg(); |
| void BrokenHeaderMsg(); |
| void UnkEncVerMsg(const wchar *Name); |
| void UnkEncVerMsg(); |
| bool ReadCommentData(Array<wchar> *CmtData); |
| |
| #if !defined(RAR_NOCRYPT) |
| CryptData HeadersCrypt; |
| #endif |
| ComprDataIO SubDataIO; |
| bool DummyCmd; |
| RAROptions *Cmd; |
| |
| |
| RarTime LatestTime; |
| int LastReadBlock; |
| HEADER_TYPE CurHeaderType; |
| |
| bool SilentOpen; |
| #ifdef USE_QOPEN |
| QuickOpen QOpen; |
| bool ProhibitQOpen; |
| #endif |
| |
| #if defined(CHROMIUM_UNRAR) |
| // A handle for a temporary file that should be used when extracting the |
| // archive. This is used to extract the contents while in a sandbox. |
| FileHandle hTempFile; |
| #endif |
| |
| public: |
| Archive(RAROptions *InitCmd=NULL); |
| ~Archive(); |
| static RARFORMAT IsSignature(const byte *D,size_t Size); |
| bool IsArchive(bool EnableBroken); |
| size_t SearchBlock(HEADER_TYPE HeaderType); |
| size_t SearchSubBlock(const wchar *Type); |
| size_t SearchRR(); |
| void WriteBlock(HEADER_TYPE HeaderType,BaseBlock *wb=NULL,bool OnlySetSize=false,bool NonFinalWrite=false); |
| void SetBlockSize(HEADER_TYPE HeaderType,BaseBlock *wb=NULL) {WriteBlock(HeaderType,wb,true);} |
| size_t ReadHeader(); |
| void CheckArc(bool EnableBroken); |
| void CheckOpen(const wchar *Name); |
| bool WCheckOpen(const wchar *Name); |
| bool GetComment(Array<wchar> *CmtData); |
| void ViewComment(); |
| void SetLatestTime(RarTime *NewTime); |
| void SeekToNext(); |
| bool CheckAccess(); |
| bool IsArcDir(); |
| void ConvertAttributes(); |
| void VolSubtractHeaderSize(size_t SubSize); |
| uint FullHeaderSize(size_t Size); |
| int64 GetStartPos(); |
| void AddSubData(byte *SrcData,uint64 DataSize,File *SrcFile, |
| const wchar *Name,uint Flags); |
| bool ReadSubData(Array<byte> *UnpData,File *DestFile); |
| HEADER_TYPE GetHeaderType() {return CurHeaderType;}; |
| RAROptions* GetRAROptions() {return Cmd;} |
| void SetSilentOpen(bool Mode) {SilentOpen=Mode;} |
| #if 0 |
| void GetRecoveryInfo(bool Required,int64 *Size,int *Percent); |
| #endif |
| #ifdef USE_QOPEN |
| bool Open(const wchar *Name,uint Mode=FMF_READ); |
| int Read(void *Data,size_t Size); |
| void Seek(int64 Offset,int Method); |
| int64 Tell(); |
| void QOpenUnload() {QOpen.Unload();} |
| void SetProhibitQOpen(bool Mode) {ProhibitQOpen=Mode;} |
| #endif |
| #if defined(CHROMIUM_UNRAR) |
| void SetTempFileHandle(FileHandle hF); |
| FileHandle GetTempFileHandle(); |
| #endif |
| |
| BaseBlock ShortBlock; |
| MarkHeader MarkHead; |
| MainHeader MainHead; |
| CryptHeader CryptHead; |
| FileHeader FileHead; |
| EndArcHeader EndArcHead; |
| SubBlockHeader SubBlockHead; |
| FileHeader SubHead; |
| CommentHeader CommHead; |
| ProtectHeader ProtectHead; |
| UnixOwnersHeader UOHead; |
| EAHeader EAHead; |
| StreamHeader StreamHead; |
| |
| int64 CurBlockPos; |
| int64 NextBlockPos; |
| |
| RARFORMAT Format; |
| bool Solid; |
| bool Volume; |
| bool MainComment; |
| bool Locked; |
| bool Signed; |
| bool FirstVolume; |
| bool NewNumbering; |
| bool Protected; |
| bool Encrypted; |
| size_t SFXSize; |
| bool BrokenHeader; |
| bool FailedHeaderDecryption; |
| |
| #if !defined(RAR_NOCRYPT) |
| byte ArcSalt[SIZE_SALT50]; |
| #endif |
| |
| bool Splitting; |
| |
| uint VolNumber; |
| int64 VolWrite; |
| uint64 AddingFilesSize; |
| uint64 AddingHeadersSize; |
| |
| bool NewArchive; |
| |
| wchar FirstVolumeName[NM]; |
| }; |
| |
| |
| #endif |