1 /* 7z.h -- 7z interface 2 2010-03-11 : Igor Pavlov : Public domain */ 3 4 #ifndef __7Z_H 5 #define __7Z_H 6 7 #include "7zBuf.h" 8 9 EXTERN_C_BEGIN 10 11 #define k7zStartHeaderSize 0x20 12 #define k7zSignatureSize 6 13 extern Byte k7zSignature[k7zSignatureSize]; 14 #define k7zMajorVersion 0 15 16 enum EIdEnum 17 { 18 k7zIdEnd, 19 k7zIdHeader, 20 k7zIdArchiveProperties, 21 k7zIdAdditionalStreamsInfo, 22 k7zIdMainStreamsInfo, 23 k7zIdFilesInfo, 24 k7zIdPackInfo, 25 k7zIdUnpackInfo, 26 k7zIdSubStreamsInfo, 27 k7zIdSize, 28 k7zIdCRC, 29 k7zIdFolder, 30 k7zIdCodersUnpackSize, 31 k7zIdNumUnpackStream, 32 k7zIdEmptyStream, 33 k7zIdEmptyFile, 34 k7zIdAnti, 35 k7zIdName, 36 k7zIdCTime, 37 k7zIdATime, 38 k7zIdMTime, 39 k7zIdWinAttributes, 40 k7zIdComment, 41 k7zIdEncodedHeader, 42 k7zIdStartPos, 43 k7zIdDummy 44 }; 45 46 typedef struct 47 { 48 UInt32 NumInStreams; 49 UInt32 NumOutStreams; 50 UInt64 MethodID; 51 CBuf Props; 52 } CSzCoderInfo; 53 54 void SzCoderInfo_Init(CSzCoderInfo *p); 55 void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc); 56 57 typedef struct 58 { 59 UInt32 InIndex; 60 UInt32 OutIndex; 61 } CSzBindPair; 62 63 typedef struct 64 { 65 CSzCoderInfo *Coders; 66 CSzBindPair *BindPairs; 67 UInt32 *PackStreams; 68 UInt64 *UnpackSizes; 69 UInt32 NumCoders; 70 UInt32 NumBindPairs; 71 UInt32 NumPackStreams; 72 int UnpackCRCDefined; 73 UInt32 UnpackCRC; 74 75 UInt32 NumUnpackStreams; 76 } CSzFolder; 77 78 void SzFolder_Init(CSzFolder *p); 79 UInt64 SzFolder_GetUnpackSize(CSzFolder *p); 80 int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex); 81 UInt32 SzFolder_GetNumOutStreams(CSzFolder *p); 82 UInt64 SzFolder_GetUnpackSize(CSzFolder *p); 83 84 SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes, 85 ILookInStream *stream, UInt64 startPos, 86 Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); 87 88 typedef struct 89 { 90 UInt32 Low; 91 UInt32 High; 92 } CNtfsFileTime; 93 94 typedef struct 95 { 96 CNtfsFileTime MTime; 97 UInt64 Size; 98 UInt32 Crc; 99 UInt32 Attrib; 100 Byte HasStream; 101 Byte IsDir; 102 Byte IsAnti; 103 Byte CrcDefined; 104 Byte MTimeDefined; 105 Byte AttribDefined; 106 } CSzFileItem; 107 108 void SzFile_Init(CSzFileItem *p); 109 110 typedef struct 111 { 112 UInt64 *PackSizes; 113 Byte *PackCRCsDefined; 114 UInt32 *PackCRCs; 115 CSzFolder *Folders; 116 CSzFileItem *Files; 117 UInt32 NumPackStreams; 118 UInt32 NumFolders; 119 UInt32 NumFiles; 120 } CSzAr; 121 122 void SzAr_Init(CSzAr *p); 123 void SzAr_Free(CSzAr *p, ISzAlloc *alloc); 124 125 126 /* 127 SzExtract extracts file from archive 128 129 *outBuffer must be 0 before first call for each new archive. 130 131 Extracting cache: 132 If you need to decompress more than one file, you can send 133 these values from previous call: 134 *blockIndex, 135 *outBuffer, 136 *outBufferSize 137 You can consider "*outBuffer" as cache of solid block. If your archive is solid, 138 it will increase decompression speed. 139 140 If you use external function, you can declare these 3 cache variables 141 (blockIndex, outBuffer, outBufferSize) as static in that external function. 142 143 Free *outBuffer and set *outBuffer to 0, if you want to flush cache. 144 */ 145 146 typedef struct 147 { 148 CSzAr db; 149 150 UInt64 startPosAfterHeader; 151 UInt64 dataPos; 152 153 UInt32 *FolderStartPackStreamIndex; 154 UInt64 *PackStreamStartPositions; 155 UInt32 *FolderStartFileIndex; 156 UInt32 *FileIndexToFolderIndexMap; 157 158 size_t *FileNameOffsets; /* in 2-byte steps */ 159 CBuf FileNames; /* UTF-16-LE */ 160 } CSzArEx; 161 162 void SzArEx_Init(CSzArEx *p); 163 void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); 164 UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); 165 int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); 166 167 /* 168 if dest == NULL, the return value specifies the required size of the buffer, 169 in 16-bit characters, including the null-terminating character. 170 if dest != NULL, the return value specifies the number of 16-bit characters that 171 are written to the dest, including the null-terminating character. */ 172 173 size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); 174 175 SRes SzArEx_Extract( 176 const CSzArEx *db, 177 ILookInStream *inStream, 178 UInt32 fileIndex, /* index of file */ 179 UInt32 *blockIndex, /* index of solid block */ 180 Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ 181 size_t *outBufferSize, /* buffer size for output buffer */ 182 size_t *offset, /* offset of stream for required file in *outBuffer */ 183 size_t *outSizeProcessed, /* size of file in *outBuffer */ 184 ISzAlloc *allocMain, 185 ISzAlloc *allocTemp); 186 187 188 /* 189 SzArEx_Open Errors: 190 SZ_ERROR_NO_ARCHIVE 191 SZ_ERROR_ARCHIVE 192 SZ_ERROR_UNSUPPORTED 193 SZ_ERROR_MEM 194 SZ_ERROR_CRC 195 SZ_ERROR_INPUT_EOF 196 SZ_ERROR_FAIL 197 */ 198 199 SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp); 200 201 EXTERN_C_END 202 203 #endif 204