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
204