1*f6dc9357SAndroid Build Coastguard Worker // Archive/RarHeader.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_RAR_HEADER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_RAR_HEADER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyTypes.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 9*f6dc9357SAndroid Build Coastguard Worker namespace NRar { 10*f6dc9357SAndroid Build Coastguard Worker namespace NHeader { 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker const unsigned kMarkerSize = 7; 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker const unsigned kArchiveSolid = 0x1; 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker namespace NBlockType 17*f6dc9357SAndroid Build Coastguard Worker { 18*f6dc9357SAndroid Build Coastguard Worker enum EBlockType 19*f6dc9357SAndroid Build Coastguard Worker { 20*f6dc9357SAndroid Build Coastguard Worker kMarker = 0x72, 21*f6dc9357SAndroid Build Coastguard Worker kArchiveHeader, 22*f6dc9357SAndroid Build Coastguard Worker kFileHeader, 23*f6dc9357SAndroid Build Coastguard Worker kCommentHeader, 24*f6dc9357SAndroid Build Coastguard Worker kOldAuthenticity, 25*f6dc9357SAndroid Build Coastguard Worker kOldSubBlock, 26*f6dc9357SAndroid Build Coastguard Worker kRecoveryRecord, 27*f6dc9357SAndroid Build Coastguard Worker kAuthenticity, 28*f6dc9357SAndroid Build Coastguard Worker kSubBlock, 29*f6dc9357SAndroid Build Coastguard Worker kEndOfArchive 30*f6dc9357SAndroid Build Coastguard Worker }; 31*f6dc9357SAndroid Build Coastguard Worker } 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker namespace NArchive 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker const UInt16 kVolume = 1; 36*f6dc9357SAndroid Build Coastguard Worker const UInt16 kComment = 2; 37*f6dc9357SAndroid Build Coastguard Worker const UInt16 kLock = 4; 38*f6dc9357SAndroid Build Coastguard Worker const UInt16 kSolid = 8; 39*f6dc9357SAndroid Build Coastguard Worker const UInt16 kNewVolName = 0x10; // ('volname.partN.rar') 40*f6dc9357SAndroid Build Coastguard Worker const UInt16 kAuthenticity = 0x20; 41*f6dc9357SAndroid Build Coastguard Worker const UInt16 kRecovery = 0x40; 42*f6dc9357SAndroid Build Coastguard Worker const UInt16 kBlockEncryption = 0x80; 43*f6dc9357SAndroid Build Coastguard Worker const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later) 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker // const UInt16 kEncryptVer = 0x200; // RAR 3.6 : that feature was discarded by origial RAR 46*f6dc9357SAndroid Build Coastguard Worker 47*f6dc9357SAndroid Build Coastguard Worker const UInt16 kEndOfArc_Flags_NextVol = 1; 48*f6dc9357SAndroid Build Coastguard Worker const UInt16 kEndOfArc_Flags_DataCRC = 2; 49*f6dc9357SAndroid Build Coastguard Worker const UInt16 kEndOfArc_Flags_RevSpace = 4; 50*f6dc9357SAndroid Build Coastguard Worker const UInt16 kEndOfArc_Flags_VolNumber = 8; 51*f6dc9357SAndroid Build Coastguard Worker 52*f6dc9357SAndroid Build Coastguard Worker const unsigned kHeaderSizeMin = 7; 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker const unsigned kArchiveHeaderSize = 13; 55*f6dc9357SAndroid Build Coastguard Worker 56*f6dc9357SAndroid Build Coastguard Worker const unsigned kBlockHeadersAreEncrypted = 0x80; 57*f6dc9357SAndroid Build Coastguard Worker } 58*f6dc9357SAndroid Build Coastguard Worker 59*f6dc9357SAndroid Build Coastguard Worker namespace NFile 60*f6dc9357SAndroid Build Coastguard Worker { 61*f6dc9357SAndroid Build Coastguard Worker const unsigned kSplitBefore = 1 << 0; 62*f6dc9357SAndroid Build Coastguard Worker const unsigned kSplitAfter = 1 << 1; 63*f6dc9357SAndroid Build Coastguard Worker const unsigned kEncrypted = 1 << 2; 64*f6dc9357SAndroid Build Coastguard Worker const unsigned kComment = 1 << 3; 65*f6dc9357SAndroid Build Coastguard Worker const unsigned kSolid = 1 << 4; 66*f6dc9357SAndroid Build Coastguard Worker 67*f6dc9357SAndroid Build Coastguard Worker const unsigned kDictBitStart = 5; 68*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumDictBits = 3; 69*f6dc9357SAndroid Build Coastguard Worker const unsigned kDictMask = (1 << kNumDictBits) - 1; 70*f6dc9357SAndroid Build Coastguard Worker const unsigned kDictDirectoryValue = 0x7; 71*f6dc9357SAndroid Build Coastguard Worker 72*f6dc9357SAndroid Build Coastguard Worker const unsigned kSize64Bits = 1 << 8; 73*f6dc9357SAndroid Build Coastguard Worker const unsigned kUnicodeName = 1 << 9; 74*f6dc9357SAndroid Build Coastguard Worker const unsigned kSalt = 1 << 10; 75*f6dc9357SAndroid Build Coastguard Worker const unsigned kOldVersion = 1 << 11; 76*f6dc9357SAndroid Build Coastguard Worker const unsigned kExtTime = 1 << 12; 77*f6dc9357SAndroid Build Coastguard Worker // const unsigned kExtFlags = 1 << 13; 78*f6dc9357SAndroid Build Coastguard Worker // const unsigned kSkipIfUnknown = 1 << 14; 79*f6dc9357SAndroid Build Coastguard Worker 80*f6dc9357SAndroid Build Coastguard Worker const unsigned kLongBlock = 1 << 15; 81*f6dc9357SAndroid Build Coastguard Worker 82*f6dc9357SAndroid Build Coastguard Worker /* 83*f6dc9357SAndroid Build Coastguard Worker struct CBlock 84*f6dc9357SAndroid Build Coastguard Worker { 85*f6dc9357SAndroid Build Coastguard Worker // UInt16 HeadCRC; 86*f6dc9357SAndroid Build Coastguard Worker // Byte Type; 87*f6dc9357SAndroid Build Coastguard Worker // UInt16 Flags; 88*f6dc9357SAndroid Build Coastguard Worker // UInt16 HeadSize; 89*f6dc9357SAndroid Build Coastguard Worker UInt32 PackSize; 90*f6dc9357SAndroid Build Coastguard Worker UInt32 UnPackSize; 91*f6dc9357SAndroid Build Coastguard Worker Byte HostOS; 92*f6dc9357SAndroid Build Coastguard Worker UInt32 FileCRC; 93*f6dc9357SAndroid Build Coastguard Worker UInt32 Time; 94*f6dc9357SAndroid Build Coastguard Worker Byte UnPackVersion; 95*f6dc9357SAndroid Build Coastguard Worker Byte Method; 96*f6dc9357SAndroid Build Coastguard Worker UInt16 NameSize; 97*f6dc9357SAndroid Build Coastguard Worker UInt32 Attributes; 98*f6dc9357SAndroid Build Coastguard Worker }; 99*f6dc9357SAndroid Build Coastguard Worker */ 100*f6dc9357SAndroid Build Coastguard Worker 101*f6dc9357SAndroid Build Coastguard Worker /* 102*f6dc9357SAndroid Build Coastguard Worker struct CBlock32 103*f6dc9357SAndroid Build Coastguard Worker { 104*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadCRC; 105*f6dc9357SAndroid Build Coastguard Worker Byte Type; 106*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 107*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadSize; 108*f6dc9357SAndroid Build Coastguard Worker UInt32 PackSize; 109*f6dc9357SAndroid Build Coastguard Worker UInt32 UnPackSize; 110*f6dc9357SAndroid Build Coastguard Worker Byte HostOS; 111*f6dc9357SAndroid Build Coastguard Worker UInt32 FileCRC; 112*f6dc9357SAndroid Build Coastguard Worker UInt32 Time; 113*f6dc9357SAndroid Build Coastguard Worker Byte UnPackVersion; 114*f6dc9357SAndroid Build Coastguard Worker Byte Method; 115*f6dc9357SAndroid Build Coastguard Worker UInt16 NameSize; 116*f6dc9357SAndroid Build Coastguard Worker UInt32 Attributes; 117*f6dc9357SAndroid Build Coastguard Worker UInt16 GetRealCRC(const void *aName, UInt32 aNameSize, 118*f6dc9357SAndroid Build Coastguard Worker bool anExtraDataDefined = false, Byte *anExtraData = 0) const; 119*f6dc9357SAndroid Build Coastguard Worker }; 120*f6dc9357SAndroid Build Coastguard Worker struct CBlock64 121*f6dc9357SAndroid Build Coastguard Worker { 122*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadCRC; 123*f6dc9357SAndroid Build Coastguard Worker Byte Type; 124*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 125*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadSize; 126*f6dc9357SAndroid Build Coastguard Worker UInt32 PackSizeLow; 127*f6dc9357SAndroid Build Coastguard Worker UInt32 UnPackSizeLow; 128*f6dc9357SAndroid Build Coastguard Worker Byte HostOS; 129*f6dc9357SAndroid Build Coastguard Worker UInt32 FileCRC; 130*f6dc9357SAndroid Build Coastguard Worker UInt32 Time; 131*f6dc9357SAndroid Build Coastguard Worker Byte UnPackVersion; 132*f6dc9357SAndroid Build Coastguard Worker Byte Method; 133*f6dc9357SAndroid Build Coastguard Worker UInt16 NameSize; 134*f6dc9357SAndroid Build Coastguard Worker UInt32 Attributes; 135*f6dc9357SAndroid Build Coastguard Worker UInt32 PackSizeHigh; 136*f6dc9357SAndroid Build Coastguard Worker UInt32 UnPackSizeHigh; 137*f6dc9357SAndroid Build Coastguard Worker UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const; 138*f6dc9357SAndroid Build Coastguard Worker }; 139*f6dc9357SAndroid Build Coastguard Worker */ 140*f6dc9357SAndroid Build Coastguard Worker 141*f6dc9357SAndroid Build Coastguard Worker const unsigned kLabelFileAttribute = 0x08; 142*f6dc9357SAndroid Build Coastguard Worker const unsigned kWinFileDirectoryAttributeMask = 0x10; 143*f6dc9357SAndroid Build Coastguard Worker 144*f6dc9357SAndroid Build Coastguard Worker enum CHostOS 145*f6dc9357SAndroid Build Coastguard Worker { 146*f6dc9357SAndroid Build Coastguard Worker kHostMSDOS = 0, 147*f6dc9357SAndroid Build Coastguard Worker kHostOS2 = 1, 148*f6dc9357SAndroid Build Coastguard Worker kHostWin32 = 2, 149*f6dc9357SAndroid Build Coastguard Worker kHostUnix = 3, 150*f6dc9357SAndroid Build Coastguard Worker kHostMacOS = 4, 151*f6dc9357SAndroid Build Coastguard Worker kHostBeOS = 5 152*f6dc9357SAndroid Build Coastguard Worker }; 153*f6dc9357SAndroid Build Coastguard Worker } 154*f6dc9357SAndroid Build Coastguard Worker 155*f6dc9357SAndroid Build Coastguard Worker namespace NBlock 156*f6dc9357SAndroid Build Coastguard Worker { 157*f6dc9357SAndroid Build Coastguard Worker const UInt16 kLongBlock = 1 << 15; 158*f6dc9357SAndroid Build Coastguard Worker struct CBlock 159*f6dc9357SAndroid Build Coastguard Worker { 160*f6dc9357SAndroid Build Coastguard Worker UInt16 CRC; 161*f6dc9357SAndroid Build Coastguard Worker Byte Type; 162*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 163*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadSize; 164*f6dc9357SAndroid Build Coastguard Worker // UInt32 DataSize; 165*f6dc9357SAndroid Build Coastguard Worker }; 166*f6dc9357SAndroid Build Coastguard Worker } 167*f6dc9357SAndroid Build Coastguard Worker 168*f6dc9357SAndroid Build Coastguard Worker /* 169*f6dc9357SAndroid Build Coastguard Worker struct CSubBlock 170*f6dc9357SAndroid Build Coastguard Worker { 171*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadCRC; 172*f6dc9357SAndroid Build Coastguard Worker Byte HeadType; 173*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 174*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadSize; 175*f6dc9357SAndroid Build Coastguard Worker UInt32 DataSize; 176*f6dc9357SAndroid Build Coastguard Worker UInt16 SubType; 177*f6dc9357SAndroid Build Coastguard Worker Byte Level; // Reserved : Must be 0 178*f6dc9357SAndroid Build Coastguard Worker }; 179*f6dc9357SAndroid Build Coastguard Worker 180*f6dc9357SAndroid Build Coastguard Worker struct CCommentBlock 181*f6dc9357SAndroid Build Coastguard Worker { 182*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadCRC; 183*f6dc9357SAndroid Build Coastguard Worker Byte HeadType; 184*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 185*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadSize; 186*f6dc9357SAndroid Build Coastguard Worker UInt16 UnpSize; 187*f6dc9357SAndroid Build Coastguard Worker Byte UnpVer; 188*f6dc9357SAndroid Build Coastguard Worker Byte Method; 189*f6dc9357SAndroid Build Coastguard Worker UInt16 CommCRC; 190*f6dc9357SAndroid Build Coastguard Worker }; 191*f6dc9357SAndroid Build Coastguard Worker 192*f6dc9357SAndroid Build Coastguard Worker 193*f6dc9357SAndroid Build Coastguard Worker struct CProtectHeader 194*f6dc9357SAndroid Build Coastguard Worker { 195*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadCRC; 196*f6dc9357SAndroid Build Coastguard Worker Byte HeadType; 197*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 198*f6dc9357SAndroid Build Coastguard Worker UInt16 HeadSize; 199*f6dc9357SAndroid Build Coastguard Worker UInt32 DataSize; 200*f6dc9357SAndroid Build Coastguard Worker Byte Version; 201*f6dc9357SAndroid Build Coastguard Worker UInt16 RecSectors; 202*f6dc9357SAndroid Build Coastguard Worker UInt32 TotalBlocks; 203*f6dc9357SAndroid Build Coastguard Worker Byte Mark[8]; 204*f6dc9357SAndroid Build Coastguard Worker }; 205*f6dc9357SAndroid Build Coastguard Worker */ 206*f6dc9357SAndroid Build Coastguard Worker 207*f6dc9357SAndroid Build Coastguard Worker }}} 208*f6dc9357SAndroid Build Coastguard Worker 209*f6dc9357SAndroid Build Coastguard Worker #endif 210