OLD | NEW |
(Empty) | |
| 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 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 |
| 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 in
dexInFolder); |
| 165 int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *r
esSize); |
| 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 *outBuffe
r */ |
| 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, ISzAl
loc *allocTemp); |
| 200 |
| 201 EXTERN_C_END |
| 202 |
| 203 #endif |
OLD | NEW |