| /* 7z.h -- 7z interface |
| 2010-03-11 : Igor Pavlov : Public domain */ |
| |
| #ifndef __7Z_H |
| #define __7Z_H |
| |
| #include "7zBuf.h" |
| |
| EXTERN_C_BEGIN |
| |
| #define k7zStartHeaderSize 0x20 |
| #define k7zSignatureSize 6 |
| extern Byte k7zSignature[k7zSignatureSize]; |
| #define k7zMajorVersion 0 |
| |
| enum EIdEnum |
| { |
| k7zIdEnd, |
| k7zIdHeader, |
| k7zIdArchiveProperties, |
| k7zIdAdditionalStreamsInfo, |
| k7zIdMainStreamsInfo, |
| k7zIdFilesInfo, |
| k7zIdPackInfo, |
| k7zIdUnpackInfo, |
| k7zIdSubStreamsInfo, |
| k7zIdSize, |
| k7zIdCRC, |
| k7zIdFolder, |
| k7zIdCodersUnpackSize, |
| k7zIdNumUnpackStream, |
| k7zIdEmptyStream, |
| k7zIdEmptyFile, |
| k7zIdAnti, |
| k7zIdName, |
| k7zIdCTime, |
| k7zIdATime, |
| k7zIdMTime, |
| k7zIdWinAttributes, |
| k7zIdComment, |
| k7zIdEncodedHeader, |
| k7zIdStartPos, |
| k7zIdDummy |
| }; |
| |
| typedef struct |
| { |
| UInt32 NumInStreams; |
| UInt32 NumOutStreams; |
| UInt64 MethodID; |
| CBuf Props; |
| } CSzCoderInfo; |
| |
| void SzCoderInfo_Init(CSzCoderInfo *p); |
| void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc); |
| |
| typedef struct |
| { |
| UInt32 InIndex; |
| UInt32 OutIndex; |
| } CSzBindPair; |
| |
| typedef struct |
| { |
| CSzCoderInfo *Coders; |
| CSzBindPair *BindPairs; |
| UInt32 *PackStreams; |
| UInt64 *UnpackSizes; |
| UInt32 NumCoders; |
| UInt32 NumBindPairs; |
| UInt32 NumPackStreams; |
| int UnpackCRCDefined; |
| UInt32 UnpackCRC; |
| |
| UInt32 NumUnpackStreams; |
| } CSzFolder; |
| |
| void SzFolder_Init(CSzFolder *p); |
| UInt64 SzFolder_GetUnpackSize(CSzFolder *p); |
| int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex); |
| UInt32 SzFolder_GetNumOutStreams(CSzFolder *p); |
| UInt64 SzFolder_GetUnpackSize(CSzFolder *p); |
| |
| SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes, |
| ILookInStream *stream, UInt64 startPos, |
| Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); |
| |
| typedef struct |
| { |
| UInt32 Low; |
| UInt32 High; |
| } CNtfsFileTime; |
| |
| typedef struct |
| { |
| CNtfsFileTime MTime; |
| UInt64 Size; |
| UInt32 Crc; |
| UInt32 Attrib; |
| Byte HasStream; |
| Byte IsDir; |
| Byte IsAnti; |
| Byte CrcDefined; |
| Byte MTimeDefined; |
| Byte AttribDefined; |
| } CSzFileItem; |
| |
| void SzFile_Init(CSzFileItem *p); |
| |
| typedef struct |
| { |
| UInt64 *PackSizes; |
| Byte *PackCRCsDefined; |
| UInt32 *PackCRCs; |
| CSzFolder *Folders; |
| CSzFileItem *Files; |
| UInt32 NumPackStreams; |
| UInt32 NumFolders; |
| UInt32 NumFiles; |
| } CSzAr; |
| |
| void SzAr_Init(CSzAr *p); |
| void SzAr_Free(CSzAr *p, ISzAlloc *alloc); |
| |
| |
| /* |
| SzExtract extracts file from archive |
| |
| *outBuffer must be 0 before first call for each new archive. |
| |
| Extracting cache: |
| If you need to decompress more than one file, you can send |
| these values from previous call: |
| *blockIndex, |
| *outBuffer, |
| *outBufferSize |
| You can consider "*outBuffer" as cache of solid block. If your archive is solid, |
| it will increase decompression speed. |
| |
| If you use external function, you can declare these 3 cache variables |
| (blockIndex, outBuffer, outBufferSize) as static in that external function. |
| |
| Free *outBuffer and set *outBuffer to 0, if you want to flush cache. |
| */ |
| |
| typedef struct |
| { |
| CSzAr db; |
| |
| UInt64 startPosAfterHeader; |
| UInt64 dataPos; |
| |
| UInt32 *FolderStartPackStreamIndex; |
| UInt64 *PackStreamStartPositions; |
| UInt32 *FolderStartFileIndex; |
| UInt32 *FileIndexToFolderIndexMap; |
| |
| size_t *FileNameOffsets; /* in 2-byte steps */ |
| CBuf FileNames; /* UTF-16-LE */ |
| } CSzArEx; |
| |
| void SzArEx_Init(CSzArEx *p); |
| void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); |
| UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); |
| int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); |
| |
| /* |
| if dest == NULL, the return value specifies the required size of the buffer, |
| in 16-bit characters, including the null-terminating character. |
| if dest != NULL, the return value specifies the number of 16-bit characters that |
| are written to the dest, including the null-terminating character. */ |
| |
| size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); |
| |
| SRes SzArEx_Extract( |
| const CSzArEx *db, |
| ILookInStream *inStream, |
| UInt32 fileIndex, /* index of file */ |
| UInt32 *blockIndex, /* index of solid block */ |
| Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ |
| size_t *outBufferSize, /* buffer size for output buffer */ |
| size_t *offset, /* offset of stream for required file in *outBuffer */ |
| size_t *outSizeProcessed, /* size of file in *outBuffer */ |
| ISzAlloc *allocMain, |
| ISzAlloc *allocTemp); |
| |
| |
| /* |
| SzArEx_Open Errors: |
| SZ_ERROR_NO_ARCHIVE |
| SZ_ERROR_ARCHIVE |
| SZ_ERROR_UNSUPPORTED |
| SZ_ERROR_MEM |
| SZ_ERROR_CRC |
| SZ_ERROR_INPUT_EOF |
| SZ_ERROR_FAIL |
| */ |
| |
| SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp); |
| |
| EXTERN_C_END |
| |
| #endif |