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