1/* 7z.h -- 7z interface 22010-03-11 : Igor Pavlov : Public domain */ 3 4#ifndef __7Z_H 5#define __7Z_H 6 7#include "7zBuf.h" 8 9EXTERN_C_BEGIN 10 11#define k7zStartHeaderSize 0x20 12#define k7zSignatureSize 6 13extern Byte k7zSignature[k7zSignatureSize]; 14#define k7zMajorVersion 0 15 16enum 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 46typedef struct 47{ 48 UInt32 NumInStreams; 49 UInt32 NumOutStreams; 50 UInt64 MethodID; 51 CBuf Props; 52} CSzCoderInfo; 53 54void SzCoderInfo_Init(CSzCoderInfo *p); 55void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc); 56 57typedef struct 58{ 59 UInt32 InIndex; 60 UInt32 OutIndex; 61} CSzBindPair; 62 63typedef 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 78void SzFolder_Init(CSzFolder *p); 79UInt64 SzFolder_GetUnpackSize(CSzFolder *p); 80int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex); 81UInt32 SzFolder_GetNumOutStreams(CSzFolder *p); 82UInt64 SzFolder_GetUnpackSize(CSzFolder *p); 83 84SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes, 85 ILookInStream *stream, UInt64 startPos, 86 Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); 87 88typedef struct 89{ 90 UInt32 Low; 91 UInt32 High; 92} CNtfsFileTime; 93 94typedef 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 108void SzFile_Init(CSzFileItem *p); 109 110typedef 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 122void SzAr_Init(CSzAr *p); 123void 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 146typedef 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 162void SzArEx_Init(CSzArEx *p); 163void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); 164UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); 165int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); 166 167/* 168if dest == NULL, the return value specifies the required size of the buffer, 169 in 16-bit characters, including the null-terminating character. 170if 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 173size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); 174 175SRes 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/* 189SzArEx_Open Errors: 190SZ_ERROR_NO_ARCHIVE 191SZ_ERROR_ARCHIVE 192SZ_ERROR_UNSUPPORTED 193SZ_ERROR_MEM 194SZ_ERROR_CRC 195SZ_ERROR_INPUT_EOF 196SZ_ERROR_FAIL 197*/ 198 199SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp); 200 201EXTERN_C_END 202 203#endif 204