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