1*f6dc9357SAndroid Build Coastguard Worker /* 7z.h -- 7z interface 2*f6dc9357SAndroid Build Coastguard Worker 2023-04-02 : Igor Pavlov : Public domain */ 3*f6dc9357SAndroid Build Coastguard Worker 4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_7Z_H 5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_7Z_H 6*f6dc9357SAndroid Build Coastguard Worker 7*f6dc9357SAndroid Build Coastguard Worker #include "7zTypes.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #define k7zStartHeaderSize 0x20 12*f6dc9357SAndroid Build Coastguard Worker #define k7zSignatureSize 6 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker extern const Byte k7zSignature[k7zSignatureSize]; 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker typedef struct 17*f6dc9357SAndroid Build Coastguard Worker { 18*f6dc9357SAndroid Build Coastguard Worker const Byte *Data; 19*f6dc9357SAndroid Build Coastguard Worker size_t Size; 20*f6dc9357SAndroid Build Coastguard Worker } CSzData; 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker /* CSzCoderInfo & CSzFolder support only default methods */ 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker typedef struct 25*f6dc9357SAndroid Build Coastguard Worker { 26*f6dc9357SAndroid Build Coastguard Worker size_t PropsOffset; 27*f6dc9357SAndroid Build Coastguard Worker UInt32 MethodID; 28*f6dc9357SAndroid Build Coastguard Worker Byte NumStreams; 29*f6dc9357SAndroid Build Coastguard Worker Byte PropsSize; 30*f6dc9357SAndroid Build Coastguard Worker } CSzCoderInfo; 31*f6dc9357SAndroid Build Coastguard Worker 32*f6dc9357SAndroid Build Coastguard Worker typedef struct 33*f6dc9357SAndroid Build Coastguard Worker { 34*f6dc9357SAndroid Build Coastguard Worker UInt32 InIndex; 35*f6dc9357SAndroid Build Coastguard Worker UInt32 OutIndex; 36*f6dc9357SAndroid Build Coastguard Worker } CSzBond; 37*f6dc9357SAndroid Build Coastguard Worker 38*f6dc9357SAndroid Build Coastguard Worker #define SZ_NUM_CODERS_IN_FOLDER_MAX 4 39*f6dc9357SAndroid Build Coastguard Worker #define SZ_NUM_BONDS_IN_FOLDER_MAX 3 40*f6dc9357SAndroid Build Coastguard Worker #define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker typedef struct 43*f6dc9357SAndroid Build Coastguard Worker { 44*f6dc9357SAndroid Build Coastguard Worker UInt32 NumCoders; 45*f6dc9357SAndroid Build Coastguard Worker UInt32 NumBonds; 46*f6dc9357SAndroid Build Coastguard Worker UInt32 NumPackStreams; 47*f6dc9357SAndroid Build Coastguard Worker UInt32 UnpackStream; 48*f6dc9357SAndroid Build Coastguard Worker UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX]; 49*f6dc9357SAndroid Build Coastguard Worker CSzBond Bonds[SZ_NUM_BONDS_IN_FOLDER_MAX]; 50*f6dc9357SAndroid Build Coastguard Worker CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX]; 51*f6dc9357SAndroid Build Coastguard Worker } CSzFolder; 52*f6dc9357SAndroid Build Coastguard Worker 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd); 55*f6dc9357SAndroid Build Coastguard Worker 56*f6dc9357SAndroid Build Coastguard Worker typedef struct 57*f6dc9357SAndroid Build Coastguard Worker { 58*f6dc9357SAndroid Build Coastguard Worker UInt32 Low; 59*f6dc9357SAndroid Build Coastguard Worker UInt32 High; 60*f6dc9357SAndroid Build Coastguard Worker } CNtfsFileTime; 61*f6dc9357SAndroid Build Coastguard Worker 62*f6dc9357SAndroid Build Coastguard Worker typedef struct 63*f6dc9357SAndroid Build Coastguard Worker { 64*f6dc9357SAndroid Build Coastguard Worker Byte *Defs; /* MSB 0 bit numbering */ 65*f6dc9357SAndroid Build Coastguard Worker UInt32 *Vals; 66*f6dc9357SAndroid Build Coastguard Worker } CSzBitUi32s; 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker typedef struct 69*f6dc9357SAndroid Build Coastguard Worker { 70*f6dc9357SAndroid Build Coastguard Worker Byte *Defs; /* MSB 0 bit numbering */ 71*f6dc9357SAndroid Build Coastguard Worker // UInt64 *Vals; 72*f6dc9357SAndroid Build Coastguard Worker CNtfsFileTime *Vals; 73*f6dc9357SAndroid Build Coastguard Worker } CSzBitUi64s; 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker #define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) 76*f6dc9357SAndroid Build Coastguard Worker 77*f6dc9357SAndroid Build Coastguard Worker #define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) 78*f6dc9357SAndroid Build Coastguard Worker 79*f6dc9357SAndroid Build Coastguard Worker typedef struct 80*f6dc9357SAndroid Build Coastguard Worker { 81*f6dc9357SAndroid Build Coastguard Worker UInt32 NumPackStreams; 82*f6dc9357SAndroid Build Coastguard Worker UInt32 NumFolders; 83*f6dc9357SAndroid Build Coastguard Worker 84*f6dc9357SAndroid Build Coastguard Worker UInt64 *PackPositions; // NumPackStreams + 1 85*f6dc9357SAndroid Build Coastguard Worker CSzBitUi32s FolderCRCs; // NumFolders 86*f6dc9357SAndroid Build Coastguard Worker 87*f6dc9357SAndroid Build Coastguard Worker size_t *FoCodersOffsets; // NumFolders + 1 88*f6dc9357SAndroid Build Coastguard Worker UInt32 *FoStartPackStreamIndex; // NumFolders + 1 89*f6dc9357SAndroid Build Coastguard Worker UInt32 *FoToCoderUnpackSizes; // NumFolders + 1 90*f6dc9357SAndroid Build Coastguard Worker Byte *FoToMainUnpackSizeIndex; // NumFolders 91*f6dc9357SAndroid Build Coastguard Worker UInt64 *CoderUnpackSizes; // for all coders in all folders 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker Byte *CodersData; 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker UInt64 RangeLimit; 96*f6dc9357SAndroid Build Coastguard Worker } CSzAr; 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex); 99*f6dc9357SAndroid Build Coastguard Worker 100*f6dc9357SAndroid Build Coastguard Worker SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, 101*f6dc9357SAndroid Build Coastguard Worker ILookInStreamPtr stream, UInt64 startPos, 102*f6dc9357SAndroid Build Coastguard Worker Byte *outBuffer, size_t outSize, 103*f6dc9357SAndroid Build Coastguard Worker ISzAllocPtr allocMain); 104*f6dc9357SAndroid Build Coastguard Worker 105*f6dc9357SAndroid Build Coastguard Worker typedef struct 106*f6dc9357SAndroid Build Coastguard Worker { 107*f6dc9357SAndroid Build Coastguard Worker CSzAr db; 108*f6dc9357SAndroid Build Coastguard Worker 109*f6dc9357SAndroid Build Coastguard Worker UInt64 startPosAfterHeader; 110*f6dc9357SAndroid Build Coastguard Worker UInt64 dataPos; 111*f6dc9357SAndroid Build Coastguard Worker 112*f6dc9357SAndroid Build Coastguard Worker UInt32 NumFiles; 113*f6dc9357SAndroid Build Coastguard Worker 114*f6dc9357SAndroid Build Coastguard Worker UInt64 *UnpackPositions; // NumFiles + 1 115*f6dc9357SAndroid Build Coastguard Worker // Byte *IsEmptyFiles; 116*f6dc9357SAndroid Build Coastguard Worker Byte *IsDirs; 117*f6dc9357SAndroid Build Coastguard Worker CSzBitUi32s CRCs; 118*f6dc9357SAndroid Build Coastguard Worker 119*f6dc9357SAndroid Build Coastguard Worker CSzBitUi32s Attribs; 120*f6dc9357SAndroid Build Coastguard Worker // CSzBitUi32s Parents; 121*f6dc9357SAndroid Build Coastguard Worker CSzBitUi64s MTime; 122*f6dc9357SAndroid Build Coastguard Worker CSzBitUi64s CTime; 123*f6dc9357SAndroid Build Coastguard Worker 124*f6dc9357SAndroid Build Coastguard Worker UInt32 *FolderToFile; // NumFolders + 1 125*f6dc9357SAndroid Build Coastguard Worker UInt32 *FileToFolder; // NumFiles 126*f6dc9357SAndroid Build Coastguard Worker 127*f6dc9357SAndroid Build Coastguard Worker size_t *FileNameOffsets; /* in 2-byte steps */ 128*f6dc9357SAndroid Build Coastguard Worker Byte *FileNames; /* UTF-16-LE */ 129*f6dc9357SAndroid Build Coastguard Worker } CSzArEx; 130*f6dc9357SAndroid Build Coastguard Worker 131*f6dc9357SAndroid Build Coastguard Worker #define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i)) 132*f6dc9357SAndroid Build Coastguard Worker 133*f6dc9357SAndroid Build Coastguard Worker #define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i]) 134*f6dc9357SAndroid Build Coastguard Worker 135*f6dc9357SAndroid Build Coastguard Worker void SzArEx_Init(CSzArEx *p); 136*f6dc9357SAndroid Build Coastguard Worker void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc); 137*f6dc9357SAndroid Build Coastguard Worker UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); 138*f6dc9357SAndroid Build Coastguard Worker int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); 139*f6dc9357SAndroid Build Coastguard Worker 140*f6dc9357SAndroid Build Coastguard Worker /* 141*f6dc9357SAndroid Build Coastguard Worker if dest == NULL, the return value specifies the required size of the buffer, 142*f6dc9357SAndroid Build Coastguard Worker in 16-bit characters, including the null-terminating character. 143*f6dc9357SAndroid Build Coastguard Worker if dest != NULL, the return value specifies the number of 16-bit characters that 144*f6dc9357SAndroid Build Coastguard Worker are written to the dest, including the null-terminating character. */ 145*f6dc9357SAndroid Build Coastguard Worker 146*f6dc9357SAndroid Build Coastguard Worker size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); 147*f6dc9357SAndroid Build Coastguard Worker 148*f6dc9357SAndroid Build Coastguard Worker /* 149*f6dc9357SAndroid Build Coastguard Worker size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex); 150*f6dc9357SAndroid Build Coastguard Worker UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest); 151*f6dc9357SAndroid Build Coastguard Worker */ 152*f6dc9357SAndroid Build Coastguard Worker 153*f6dc9357SAndroid Build Coastguard Worker 154*f6dc9357SAndroid Build Coastguard Worker 155*f6dc9357SAndroid Build Coastguard Worker /* 156*f6dc9357SAndroid Build Coastguard Worker SzArEx_Extract extracts file from archive 157*f6dc9357SAndroid Build Coastguard Worker 158*f6dc9357SAndroid Build Coastguard Worker *outBuffer must be 0 before first call for each new archive. 159*f6dc9357SAndroid Build Coastguard Worker 160*f6dc9357SAndroid Build Coastguard Worker Extracting cache: 161*f6dc9357SAndroid Build Coastguard Worker If you need to decompress more than one file, you can send 162*f6dc9357SAndroid Build Coastguard Worker these values from previous call: 163*f6dc9357SAndroid Build Coastguard Worker *blockIndex, 164*f6dc9357SAndroid Build Coastguard Worker *outBuffer, 165*f6dc9357SAndroid Build Coastguard Worker *outBufferSize 166*f6dc9357SAndroid Build Coastguard Worker You can consider "*outBuffer" as cache of solid block. If your archive is solid, 167*f6dc9357SAndroid Build Coastguard Worker it will increase decompression speed. 168*f6dc9357SAndroid Build Coastguard Worker 169*f6dc9357SAndroid Build Coastguard Worker If you use external function, you can declare these 3 cache variables 170*f6dc9357SAndroid Build Coastguard Worker (blockIndex, outBuffer, outBufferSize) as static in that external function. 171*f6dc9357SAndroid Build Coastguard Worker 172*f6dc9357SAndroid Build Coastguard Worker Free *outBuffer and set *outBuffer to 0, if you want to flush cache. 173*f6dc9357SAndroid Build Coastguard Worker */ 174*f6dc9357SAndroid Build Coastguard Worker 175*f6dc9357SAndroid Build Coastguard Worker SRes SzArEx_Extract( 176*f6dc9357SAndroid Build Coastguard Worker const CSzArEx *db, 177*f6dc9357SAndroid Build Coastguard Worker ILookInStreamPtr inStream, 178*f6dc9357SAndroid Build Coastguard Worker UInt32 fileIndex, /* index of file */ 179*f6dc9357SAndroid Build Coastguard Worker UInt32 *blockIndex, /* index of solid block */ 180*f6dc9357SAndroid Build Coastguard Worker Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ 181*f6dc9357SAndroid Build Coastguard Worker size_t *outBufferSize, /* buffer size for output buffer */ 182*f6dc9357SAndroid Build Coastguard Worker size_t *offset, /* offset of stream for required file in *outBuffer */ 183*f6dc9357SAndroid Build Coastguard Worker size_t *outSizeProcessed, /* size of file in *outBuffer */ 184*f6dc9357SAndroid Build Coastguard Worker ISzAllocPtr allocMain, 185*f6dc9357SAndroid Build Coastguard Worker ISzAllocPtr allocTemp); 186*f6dc9357SAndroid Build Coastguard Worker 187*f6dc9357SAndroid Build Coastguard Worker 188*f6dc9357SAndroid Build Coastguard Worker /* 189*f6dc9357SAndroid Build Coastguard Worker SzArEx_Open Errors: 190*f6dc9357SAndroid Build Coastguard Worker SZ_ERROR_NO_ARCHIVE 191*f6dc9357SAndroid Build Coastguard Worker SZ_ERROR_ARCHIVE 192*f6dc9357SAndroid Build Coastguard Worker SZ_ERROR_UNSUPPORTED 193*f6dc9357SAndroid Build Coastguard Worker SZ_ERROR_MEM 194*f6dc9357SAndroid Build Coastguard Worker SZ_ERROR_CRC 195*f6dc9357SAndroid Build Coastguard Worker SZ_ERROR_INPUT_EOF 196*f6dc9357SAndroid Build Coastguard Worker SZ_ERROR_FAIL 197*f6dc9357SAndroid Build Coastguard Worker */ 198*f6dc9357SAndroid Build Coastguard Worker 199*f6dc9357SAndroid Build Coastguard Worker SRes SzArEx_Open(CSzArEx *p, ILookInStreamPtr inStream, 200*f6dc9357SAndroid Build Coastguard Worker ISzAllocPtr allocMain, ISzAllocPtr allocTemp); 201*f6dc9357SAndroid Build Coastguard Worker 202*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END 203*f6dc9357SAndroid Build Coastguard Worker 204*f6dc9357SAndroid Build Coastguard Worker #endif 205