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