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