tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

7z.h (5275B)


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