repo sync | baa3858 | 2013-07-26 17:53:31 -0700 | [diff] [blame] | 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
|