Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cZipDir.h
Go to the documentation of this file.
1 //
6 
7 #ifndef _INC_cZipDir_H
8 #define _INC_cZipDir_H
9 #ifndef NO_PRAGMA_ONCE
10 #pragma once
11 #endif
12 
13 #include "../Codec/cStreamZLib.h" // ZIP_COMPLEV_TYPE
14 
15 #ifdef USE_ZLIB
16 #include "../Cipher/cCipherBase.h"
19 #include "GrayCore/include/cBits.h"
21 
22 namespace GrayLib
23 {
24  typedef INT32 ZIP_OFFSET_t;
25  typedef UINT32 ZIP_SIZE_t;
26 
28  {
31  ZIP_MAGIC_LOCALENTRY = (0x04034b50),
32  ZIP_MAGIC_DIRENTRY = (0x02014b50),
33  ZIP_MAGIC_DIREND = (0x06054b50),
34  ZIP_MAGIC_EXTLOC = (0x08074b50),
35  };
36 
38  {
42  ZIP_CTRL_FLAT = 1, // Make/Unzip a flat zip file. ignore child paths.
43  };
44  typedef BYTE ZIP_CTRL_TYPE; // bitmask
45 
47  {
50 
51  public:
53  {
56  COMPMETHOD_Store = 0,
64  // PKZIP 1.0
65  COMPMETHOD_Deflate = 8,
66  // WinZip/PKZIP v2.0 stop
67  COMPMETHOD_Deflate64 = 9,
68  COMPMETHOD_BZIP2 = 12,
69  // WinZip v?? stop
70  COMPMETHOD_JPEG = 96,
71  COMPMETHOD_WavPack = 97,
72  COMPMETHOD_PPMd = 98,
73  // WinZip v12.0 stop
74  };
75 
76  private:
77  static HRESULT GRAYCALL WriteValue(cStreamOutput& s, UINT32 x, size_t nbByte);
78 
79  protected:
80  static HRESULT GRAYCALL ReadU16(cStreamInput& stmIn, WORD* pX);
81  static HRESULT GRAYCALL ReadU32(cStreamInput& stmIn, UINT32* pX);
82 
83  static HRESULT WriteU16(cStreamOutput& s, WORD x)
84  {
85  return WriteValue(s, x, 2);
86  }
87  static HRESULT WriteU32(cStreamOutput& s, UINT32 x)
88  {
89  return WriteValue(s, x, 4);
90  }
91  };
92 
93  class GRAYLIB_LINK cZipDir : protected cZipData
94  {
100 
101  public:
103 
104  WORD m_nNumDisk;
106 
109 
112 
114 
115  public:
118 
119  bool isValidParams() const;
120 
123 
126 
128  {
131  if (m_nPosZipDir == ((STREAM_OFFSET_t)-1)) // since its not set, assume that it starts at 0. we are writing.
132  return 0;
133  return m_nPosZipDir - (m_nSizeLocalDir + m_nSizeCentralDir);
134  }
136  {
138  if (m_nPosZipDir == ((STREAM_OFFSET_t)-1)) // since its not set, assume that it starts at 0. we are writing.
139  return m_nSizeLocalDir;
140  return m_nPosZipDir - m_nSizeCentralDir;
141  }
142  size_t get_SizeCHD() const
143  {
145  return 4 + 18 + m_sGlobalComment.GetLength();
146  }
147  int get_FileCount() const
148  {
149  return (int)m_nNumberOfEntries;
150  }
151  };
152 
153 #pragma pack(1)
155  {
157  WORD m_wType;
158  WORD m_wLen; // USE_LITTLE_ENDIAN
159  };
160 
162  {
167 
168  public:
169  enum FLG_TYPE // m_bFlags
170  {
171  FLG_MTIME = (1 << 0), // mtime = modification.
172  FLG_ATIME = (1 << 1), // atime = access.
173  FLG_CTIME = (1 << 2), // ctime = creation
174  };
175 
176 #ifdef USE_LITTLE_ENDIAN
177  static const WORD k_Type = MAKEWORD('U', 'T'); // USE_LITTLE_ENDIAN "UT" = b[0]='U', b[1]='T'
178 #else
179  static const WORD k_Type = MAKEWORD('T', 'U');
180 #endif
181 
182  BYTE m_bFlags; // what m_atTime[] are populated ?
183  UINT32 m_atTime[3]; // TIMESEC_t as UINT32. convert to cTimeFile
184 
185  public:
186  cZipDataExUT(BYTE bFlags)
187  : m_bFlags(bFlags)
188  {
189  m_wType = k_Type;
190  m_wLen = get_Size();
191  }
192  WORD get_Size() const
193  {
195  int iTimes = cBits::Count1Bits(m_bFlags);
196  return (WORD)(4 + 1 + (iTimes * 4));
197  }
198  void InitFlags(BYTE bFlags)
199  {
200  m_wType = k_Type;
201  m_bFlags = bFlags;
202  m_wLen = get_Size();
203  }
204  int get_TimeIdx(FLG_TYPE bFlag) const
205  {
206  if (!(m_bFlags & bFlag))
207  return -1; // doesn't exist.
208  int j = 0;
209  for (int i = 0; i < 3; i++)
210  {
211  BYTE bFlagTmp = (1 << i);
212  if (!(bFlagTmp & m_bFlags))
213  continue;
214  if (bFlagTmp & bFlag)
215  return j;
216  j++;
217  }
218  ASSERT(0);
219  return -1;
220  }
221  };
222 #pragma pack()
223 
225  {
230 
231  public:
233  {
235  ZFLG_CRYPT = 0x01,
236  ZFLG_COMPLVL1 = 0x02,
237  ZFLG_COMPLVL2 = 0x04,
238  ZFLG_SUMS_FOLLOW = 0x08,
239  ZFLG_ENHANCED = 0x0010,
240  ZFLG_PATCH = 0x0020,
241  ZFLG_STRONG_ENC = 0x0040,
242  ZFLG_UNUSED = 0x0F80,
243  ZFLG_RESERVED = 0xF000
244  };
245 
246  static const int k_nFileNameMax = 256;
247  static const int k_nOffsetU = 14; // Bytes offset from start to update WriteHeader0U()
248 
249  public:
251  WORD m_wZFlags;
252 
253  // stored (no compression), Shrunk, Reduced (methods 1-4), Imploded, Tokenizing, Deflated, Deflate64, BZIP2, LZMA (EFS), WavPack, PPMd.
255 
256  UINT32 m_dwDosDate;
257  UINT32 m_dwCRC;
260 
263 
266 
267  public:
269  {
270  SetZeroData();
271  }
273  {
274  }
275 
276  void SetZeroData();
277 
278  size_t get_SizeLH() const
279  {
281  return 4 + 6 + 16 + 4 + m_wSize_FileName + m_wSize_Extra;
282  }
283 
284  bool isValidParams() const;
286 
288  {
289  return m_sFileName;
290  }
291  void put_FileName(cStringF sFileName)
292  {
293  m_sFileName = sFileName;
294  m_wSize_FileName = (WORD)m_sFileName.GetLength();
295  }
296 
297  void SetCopy(const cZipFileEntry0& h)
298  {
299  ASSERT(&h != this);
300  m_wVersionNeeded = h.m_wVersionNeeded;
301  m_wZFlags = h.m_wZFlags;
302  m_eCompressionMethod = h.m_eCompressionMethod;
303  m_dwDosDate = h.m_dwDosDate;
304  m_dwCRC = h.m_dwCRC;
305  m_dwCompressedSize = h.m_dwCompressedSize;
306  m_dwUncompressedSize = h.m_dwUncompressedSize;
307  m_wSize_FileName = h.m_wSize_FileName;
308  m_wSize_Extra = h.m_wSize_Extra;
309  m_sFileName = h.m_sFileName;
310  m_Extra.SetCopy(h.m_Extra);
311  }
312 
315  HRESULT WriteHeader0(cStreamOutput& s, bool bLH) const;
316 
317  void AddExUT(const cZipDataExUT* pEx);
319 
323 
324  void SetFileTimes(cTimeInt tCreated, cTimeInt tModified);
325 
327  bool put_CompLevel(ZIP_COMPLEV_TYPE nCompLevel);
328  };
329 
331  {
338 
339  typedef cZipFileEntry0 SUPER_t;
340 
341  public:
343  {
347 
366  SYSTEM_OS_400
367  };
368 
369  public:
370  BYTE m_bVersion;
372 
375 
378 
380 
381  public:
383  {
384  SetZeroData();
385  }
387  {
388  SetCopy(cp);
389  }
391  {
392  }
393 
394  bool isValidParams() const;
395  bool isMatch(const cZipFileEntry0& entry) const;
396 
397  cZipFileEntry1& operator =(const cZipFileEntry1& cp)
398  {
399  SetCopy(cp);
400  return *this;
401  }
402 
403  size_t get_SizeCH() const
404  {
406  return 46 + m_wSize_FileName + m_wSize_Extra + m_sComment.GetLength();
407  }
408  bool isAttrDir() const;
409  void SetZeroData();
410  void SetCopy(const cZipFileEntry1& h);
411 
414  };
415 
416  class cZipCrypt : public ICipherBase
417  {
422 
423  public:
424  static const size_t k_LEN_HEAD = 12;
425 
426  private:
427  bool m_bEncodeMode;
428  UINT32 m_keys[3];
429  const UINT32* m_pcrc_32_tab;
430 
431  private:
432  void InitKeys();
433  void InitKeys(const char* pszPass);
434 
435  UINT32 GetCRC32(UINT32 crc, BYTE b) const
436  {
437  return(m_pcrc_32_tab[(crc ^ b) & 0xff] ^ (crc >> 8));
438  }
439  BYTE CryptByte()
440  {
442  UINT32 nTmp = ((UINT32)(m_keys[2]) & 0xffff) | 2;
443  return (BYTE)(((nTmp * (nTmp ^ 1)) >> 8) & 0xff);
444  }
445  void UpdateKeys(BYTE c);
446 
447  public:
450 
451  bool InitDecrypt(const char* pszPass, BYTE* pBuffer);
452  void InitEncrypt(const char* pszPass, BYTE* pBuffer, UINT32 dwCRCForCrypting);
453 
454  BYTE EncryptByte(BYTE c)
455  {
456  BYTE t = CryptByte();
457  UpdateKeys(c);
458  return t ^ (c);
459  }
460  BYTE DecryptByte(BYTE c)
461  {
462  c ^= CryptByte();
463  UpdateKeys(c);
464  return c;
465  }
466 
467  virtual size_t get_BlockAlignSize() const override
468  {
470  return 1;
471  }
472  virtual HRESULT Cipher(BYTE* pOutput, const BYTE* pInput, size_t nSizeBytes) override
473  {
476  if (m_bEncodeMode)
477  {
478  for (size_t i = 0; i < nSizeBytes; i++)
479  {
480  pOutput[i] = EncryptByte(pInput[i]);
481  }
482  }
483  else
484  {
485  for (size_t i = 0; i < nSizeBytes; i++)
486  {
487  pOutput[i] = DecryptByte(pInput[i]);
488  }
489  }
490  return (HRESULT)nSizeBytes;
491  }
492  };
493 };
494 #endif
495 #endif
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define CATTR_PACKED
Definition: GrayCore.h:87
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cZipDir.h:417
BYTE DecryptByte(BYTE c)
Definition: cZipDir.h:460
static const size_t k_LEN_HEAD
in bytes
Definition: cZipDir.h:424
bool InitDecrypt(const char *pszPass, BYTE *pBuffer)
virtual size_t get_BlockAlignSize() const override
Definition: cZipDir.h:467
virtual HRESULT Cipher(BYTE *pOutput, const BYTE *pInput, size_t nSizeBytes) override
Definition: cZipDir.h:472
void InitEncrypt(const char *pszPass, BYTE *pBuffer, UINT32 dwCRCForCrypting)
BYTE EncryptByte(BYTE c)
Definition: cZipDir.h:454
Definition: cZipDir.h:162
BYTE m_bFlags
Definition: cZipDir.h:182
cZipDataExUT(BYTE bFlags)
Definition: cZipDir.h:186
int get_TimeIdx(FLG_TYPE bFlag) const
Definition: cZipDir.h:204
WORD get_Size() const
Definition: cZipDir.h:192
FLG_TYPE
Definition: cZipDir.h:170
void InitFlags(BYTE bFlags)
Definition: cZipDir.h:198
Definition: cZipDir.h:47
static HRESULT GRAYCALL ReadU32(cStreamInput &stmIn, UINT32 *pX)
static HRESULT WriteU32(cStreamOutput &s, UINT32 x)
Definition: cZipDir.h:87
static HRESULT GRAYCALL ReadU16(cStreamInput &stmIn, WORD *pX)
COMPMETHOD_TYPE
Definition: cZipDir.h:53
@ COMPMETHOD_OLD_REDUCE4
deprecated.
Definition: cZipDir.h:61
@ COMPMETHOD_OLD_REDUCE2
deprecated.
Definition: cZipDir.h:59
@ COMPMETHOD_OLD_TOKENIZE
deprecated.
Definition: cZipDir.h:63
@ COMPMETHOD_OLD_SHRINK
deprecated.
Definition: cZipDir.h:57
@ COMPMETHOD_OLD_REDUCE3
deprecated.
Definition: cZipDir.h:60
@ COMPMETHOD_OLD_REDUCE1
deprecated.
Definition: cZipDir.h:58
@ COMPMETHOD_OLD_IMPLODE
deprecated.
Definition: cZipDir.h:62
static HRESULT WriteU16(cStreamOutput &s, WORD x)
Definition: cZipDir.h:83
Definition: cZipDir.h:94
WORD m_nNumDisk
number of the current disk, used for spanning ZIP, unsupported, always 0
Definition: cZipDir.h:104
STREAM_OFFSET_t get_PosCH0() const
Definition: cZipDir.h:135
int get_FileCount() const
Definition: cZipDir.h:147
cString m_sGlobalComment
comment Has WORD prefix for length.
Definition: cZipDir.h:113
UINT32 m_nSizeCentralDir
size of the entire central directory (all entries, not data). bytes
Definition: cZipDir.h:110
HRESULT ReadHeader(cStreamInput &s)
ZIP_SIZE_t m_nSizeLocalDir
size of the local directory + all compressed file data. bytes
Definition: cZipDir.h:111
HRESULT WriteHeader(cStreamOutput &s)
HRESULT SeekZipDir(cStreamInput &s)
size_t get_SizeCHD() const
Definition: cZipDir.h:142
WORD m_nNumberOfEntries_CD
total number of entries/files in the central directory
Definition: cZipDir.h:108
WORD m_nNumDisk_CD
number the the disk with central directory, used for spanning ZIP, unsupported, always 0
Definition: cZipDir.h:105
HRESULT ReadZipDir(cStreamInput &s)
WORD m_nNumberOfEntries
total number of entries/files in the central directory on this disk
Definition: cZipDir.h:107
bool isValidParams() const
STREAM_OFFSET_t m_nPosZipDir
The absolute position of 'this' block in the .ZIP file. it can float from start. is relative to end o...
Definition: cZipDir.h:102
STREAM_OFFSET_t get_PosLH0() const
Definition: cZipDir.h:127
Definition: cZipDir.h:225
WORD m_wVersionNeeded
version needed to extract. 20 = PKUNZIP 2.0
Definition: cZipDir.h:250
UINT32 m_dwCRC
CRC-32 for the uncompressed file.
Definition: cZipDir.h:257
WORD m_wSize_FileName
MUST match m_sFileName.GetLength()
Definition: cZipDir.h:261
HRESULT ReadHeader0(cStreamInput &s, bool bLH)
ZIP_SIZE_t m_dwCompressedSize
compressed size bytes. number of bytes actually stored. plus crypt header size.
Definition: cZipDir.h:258
~cZipFileEntry0()
Definition: cZipDir.h:272
cStringF m_sFileName
name relative to some unknown root. ending in \ for directory.
Definition: cZipDir.h:264
ZIP_COMPLEV_TYPE get_CompLevel() const
cZipDataExUT * FindExUT() const
ZFLG_TYPE
Definition: cZipDir.h:233
void SetFileTimes(cTimeInt tCreated, cTimeInt tModified)
void AddExUT(const cZipDataExUT *pEx)
cStringF get_Name() const
Definition: cZipDir.h:287
UINT32 m_dwDosDate
last modified file date in DOS format. bit packed year,month,day,hour,min,second (accurate to 2 secon...
Definition: cZipDir.h:256
bool put_CompLevel(ZIP_COMPLEV_TYPE nCompLevel)
ZIP_SIZE_t m_dwUncompressedSize
uncompressed size bytes.
Definition: cZipDir.h:259
HRESULT WriteHeader0(cStreamOutput &s, bool bLH) const
void put_FileName(cStringF sFileName)
Definition: cZipDir.h:291
void SetCopy(const cZipFileEntry0 &h)
Definition: cZipDir.h:297
bool isValidParams() const
cHeapBlock m_Extra
extra field length. may contain UT. NOTE: NOT the same for LH and CH!
Definition: cZipDir.h:265
size_t get_SizeLH() const
Definition: cZipDir.h:278
WORD m_wZFlags
general purpose bit flags. ZFLG_TYPE, ZFLG_CRYPT
Definition: cZipDir.h:251
COMPMETHOD_TYPE m_eCompressionMethod
compression method. none=0, Z_DEFLATED=8, BZIP2=12, PPMd=98.
Definition: cZipDir.h:254
HRESULT WriteHeader0U(cStreamOutput &s) const
cTimeInt get_TimeCreated() const
cTimeInt get_DosDateAsTime() const
WORD m_wSize_Extra
size of m_Extra
Definition: cZipDir.h:262
cZipFileEntry0()
Definition: cZipDir.h:268
cTimeInt get_TimeModified() const
Definition: cZipDir.h:331
~cZipFileEntry1()
Definition: cZipDir.h:390
BYTE m_bVersion
version made by. 0=any. 20 = PKWARE 2.0
Definition: cZipDir.h:370
SYSTEM_TYPE m_eSystemMadeBy
0 = SYSTEM_MSDOS
Definition: cZipDir.h:371
WORD m_wDataTypeGuess
best guess about the data type: Z_BINARY or Z_ASCII. zstream.data_type.
Definition: cZipDir.h:376
void SetCopy(const cZipFileEntry1 &h)
cString m_sComment
file entry comment. WORD comment length
Definition: cZipDir.h:373
bool isMatch(const cZipFileEntry0 &entry) const
cZipFileEntry1(const cZipFileEntry1 &cp)
Definition: cZipDir.h:386
cZipFileEntry1()
Definition: cZipDir.h:382
SYSTEM_TYPE
Definition: cZipDir.h:343
@ SYSTEM_MVS
Definition: cZipDir.h:359
@ SYSTEM_ACORN_RISC
Unix like.
Definition: cZipDir.h:361
@ SYSTEM_ATARI_ST
Unix like.
Definition: cZipDir.h:353
@ SYSTEM_TANDEM
Unix like.
Definition: cZipDir.h:365
@ SYSTEM_BEOS
Unix like.
Definition: cZipDir.h:364
@ SYSTEM_Z_SYSTEM
Definition: cZipDir.h:356
@ SYSTEM_CPM
Definition: cZipDir.h:357
@ SYSTEM_WINDOWS_NTFS
like FILESYS_NTFS
Definition: cZipDir.h:358
@ SYSTEM_VSE
Definition: cZipDir.h:360
@ SYSTEM_VFAT
like FILESYS_FAT32
Definition: cZipDir.h:362
@ SYSTEM_UNIX
like FILESYS_NFS on Linux
Definition: cZipDir.h:351
@ SYSTEM_ALTERNATE_MVS
Definition: cZipDir.h:363
@ SYSTEM_MSDOS
like FILESYS_FAT
Definition: cZipDir.h:348
@ SYSTEM_OPENVMS
Unix like.
Definition: cZipDir.h:350
@ SYSTEM_VM_CMS
Definition: cZipDir.h:352
@ SYSTEM_OS2_HPFS
Definition: cZipDir.h:354
@ SYSTEM_MACINTOSH
Definition: cZipDir.h:355
@ SYSTEM_AMIGA
Definition: cZipDir.h:349
size_t get_SizeCH() const
Definition: cZipDir.h:403
WORD m_wDisk_num_start
disk number start
Definition: cZipDir.h:374
ZIP_SIZE_t m_nOffsetLocal
offset of this LH[X] from LH[0]. (4 bytes = ZIP_OFFSET_t)
Definition: cZipDir.h:379
UINT32 m_dwFileAttrFlags
external file attributes. _WIN32 ATTRIBUTE flags. FILEATTR_Directory = 0x20
Definition: cZipDir.h:377
HRESULT WriteHeader1(cStreamOutput &s) const
bool isValidParams() const
HRESULT ReadHeader1(cStreamInput &s)
StrLen_t GetLength() const noexcept
Definition: cString.h:183
Definition: cHeap.h:156
bool SetCopy(const cHeapBlock &rSrc)
Definition: cHeap.h:355
Definition: cStream.h:306
Definition: cStream.h:126
< similar to the MFC CTime and cTimeSpan, not as accurate or large ranged as COleDateTime
Definition: cTimeInt.h:101
Definition: cCipherBase.h:111
Definition: cMesh.h:22
ZIP_COMPLEV_TYPE
Definition: cStreamZLib.h:27
ZIP_MAGIC_TYPE
Definition: cZipDir.h:28
@ ZIP_MAGIC_DIREND
PK0506 = cZipDir = central header end block.
Definition: cZipDir.h:33
@ ZIP_MAGIC_LOCALENTRY
PK0304 = cZipFileEntry0 = local header. followed by compressed data.
Definition: cZipDir.h:31
@ ZIP_MAGIC_DIRENTRY
PK0102 = cZipFileEntry1 = central header directory entry.
Definition: cZipDir.h:32
@ ZIP_MAGIC_EXTLOC
PK0708 = ??
Definition: cZipDir.h:34
INT32 ZIP_OFFSET_t
relative file position in zip. offset relative to LH0.
Definition: cZipDir.h:24
ZIP_CTRL_TYPE_
Definition: cZipDir.h:38
@ ZIP_CTRL_FLAT
Definition: cZipDir.h:42
@ ZIP_CTRL_0
Definition: cZipDir.h:41
UINT32 ZIP_SIZE_t
size of a block
Definition: cZipDir.h:25
BYTE ZIP_CTRL_TYPE
Definition: cZipDir.h:44
LONG_PTR STREAM_OFFSET_t
Might be 64 or 32 bit. TODO SET USE_FILE_POS64.
Definition: cOSHandle.h:52
Definition: cZipDir.h:155
WORD m_wLen
Definition: cZipDir.h:158
WORD m_wType
Header for Sub Blocks found in m_Extra block.
Definition: cZipDir.h:157
static BIT_ENUM_t Count1Bits(TYPE nMask) noexcept
Definition: cBits.h:127