Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TZIPFile.h
Go to the documentation of this file.
1 // @(#)root/io:$Id$
2 // Author: Fons Rademakers 30/6/04
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TZIPFile
13 #define ROOT_TZIPFile
14 
15 #include "TArchiveFile.h"
16 
17 class TZIPMember;
18 
19 
20 class TZIPFile : public TArchiveFile {
21 
22 protected:
23  Long64_t fDirPos; ///< Central directory position
24  Long64_t fDirSize; ///< Central directory size
25  Long64_t fDirOffset; ///< Central directory offset (from the beginning of the archive)
26  TString fComment; ///< Archive comment
27 
28  Long64_t FindEndHeader();
29  Int_t ReadEndHeader(Long64_t pos);
30  Long64_t ReadZip64EndLocator(Long64_t pos);
31  Int_t ReadZip64EndRecord(Long64_t pos);
32  Int_t ReadDirectory();
33  Int_t ReadMemberHeader(TZIPMember *member);
34  UInt_t Get(const void *buffer, Int_t bytes);
35  ULong64_t Get64(const void *buffer, Int_t bytes);
36  Int_t DecodeZip64ExtendedExtraField(TZIPMember *m, Bool_t global = kTRUE);
37 
38  /// ZIP archive constants
39  enum EZIPConstants {
40  // - Archive version required (and made)
41  kARCHIVE_VERSION = 45,
42 
43  // - Magic header constants
44  kDIR_HEADER_MAGIC = 0x02014b50,
45  kENTRY_HEADER_MAGIC = 0x04034b50,
46  kEND_HEADER_MAGIC = 0x06054b50,
47  kZIP64_EDR_HEADER_MAGIC = 0x06064b50,
48  kZIP64_EDL_HEADER_MAGIC = 0x07064b50,
49  kZIP64_EXTENDED_MAGIC = 0x0001, ///< Zip64 Extended Information Extra Field
50  kZIP_MAGIC_LEN = 4, ///< Length of magic's
51  kMAX_VAR_LEN = 0xffff, ///< Max variable-width field length
52  kMAX_SIZE = 0xffffffff, ///< Max size of things
53 
54  // - Offsets into the central directory headers
55  kDIR_MAGIC_OFF = 0,
56  kDIR_VMADE_OFF = 4, kDIR_VMADE_LEN = 2,
57  kDIR_VREQD_OFF = 6, kDIR_VREQD_LEN = 2,
58  kDIR_FLAG_OFF = 8, kDIR_FLAG_LEN = 2,
59  kDIR_METHOD_OFF = 10, kDIR_METHOD_LEN = 2,
60  kDIR_DATE_OFF = 12, kDIR_DATE_LEN = 4,
61  kDIR_CRC32_OFF = 16, kDIR_CRC32_LEN = 4,
62  kDIR_CSIZE_OFF = 20, kDIR_CSIZE_LEN = 4,
63  kDIR_USIZE_OFF = 24, kDIR_USIZE_LEN = 4,
64  kDIR_NAMELEN_OFF = 28, kDIR_NAMELEN_LEN = 2,
65  kDIR_EXTRALEN_OFF = 30, kDIR_EXTRALEN_LEN = 2,
66  kDIR_COMMENTLEN_OFF = 32, kDIR_COMMENTLEN_LEN = 2,
67  kDIR_DISK_START_OFF = 34, kDIR_DISK_START_LEN = 2,
68  kDIR_INT_ATTR_OFF = 36, kDIR_INT_ATTR_LEN = 2,
69  kDIR_EXT_ATTR_OFF = 38, kDIR_EXT_ATTR_LEN = 4,
70  kDIR_ENTRY_POS_OFF = 42, kDIR_ENTRY_POS_LEN = 4,
71  kDIR_HEADER_SIZE = 46,
72 
73  // - Offsets into the Zip64 end of central directory record (EDR)
74  kZIP64_EDR_MAGIC_OFF = 0,
75  kZIP64_EDR_SIZE_OFF = 4, kZIP64_EDR_SIZE_LEN = 8,
76  kZIP64_EDR_VERS_MADE_OFF = 12, kZIP64_EDR_VERS_MADE_LEN = 2,
77  kZIP64_EDR_VERS_EXT_OFF = 14, kZIP64_EDR_VERS_EXT_LEN = 2,
78  kZIP64_EDR_DISK_OFF = 16, kZIP64_EDR_DISK_LEN = 4,
79  kZIP64_EDR_DIR_DISK_OFF = 20, kZIP64_EDR_DIR_DISK_LEN = 4,
80  kZIP64_EDR_DISK_HDRS_OFF = 24, kZIP64_EDR_DISK_HDRS_LEN = 8,
81  kZIP64_EDR_TOTAL_HDRS_OFF = 32, kZIP64_EDR_TOTAL_HDRS_LEN = 8,
82  kZIP64_EDR_DIR_SIZE_OFF = 40, kZIP64_EDR_DIR_SIZE_LEN = 8,
83  kZIP64_EDR_DIR_OFFSET_OFF = 48, kZIP64_EDR_DIR_OFFSET_LEN = 8,
84  kZIP64_EDR_HEADER_SIZE = 56,
85 
86  // - Offsets into the Zip64 end of central directory locator (EDL)
87  kZIP64_EDL_MAGIC_OFF = 0,
88  kZIP64_EDL_DISK_OFF = 4, kZIP64_EDL_DISK_LEN = 4,
89  kZIP64_EDL_REC_OFFSET_OFF = 8, kZIP64_EDL_REC_OFFSET_LEN = 8,
90  kZIP64_EDL_TOTAL_DISK_OFF = 16, kZIP64_EDL_TOTAL_DISK_LEN = 4,
91  kZIP64_EDL_HEADER_SIZE = 20,
92 
93  // - Offsets into the end-of-archive header
94  kEND_MAGIC_OFF = 0,
95  kEND_DISK_OFF = 4, kEND_DISK_LEN = 2,
96  kEND_DIR_DISK_OFF = 6, kEND_DIR_DISK_LEN = 2,
97  kEND_DISK_HDRS_OFF = 8, kEND_DISK_HDRS_LEN = 2,
98  kEND_TOTAL_HDRS_OFF = 10, kEND_TOTAL_HDRS_LEN = 2,
99  kEND_DIR_SIZE_OFF = 12, kEND_DIR_SIZE_LEN = 4,
100  kEND_DIR_OFFSET_OFF = 16, kEND_DIR_OFFSET_LEN = 4,
101  kEND_COMMENTLEN_OFF = 20, kEND_COMMENTLEN_LEN = 2,
102  kEND_HEADER_SIZE = 22,
103 
104  // - Offsets into the local entry headers
105  kENTRY_MAGIC_OFF = 0,
106  kENTRY_VREQD_OFF = 4, kENTRY_VREQD_LEN = 2,
107  kENTRY_FLAG_OFF = 6, kENTRY_FLAG_LEN = 2,
108  kENTRY_METHOD_OFF = 8, kENTRY_METHOD_LEN = 2,
109  kENTRY_DATE_OFF = 10, kENTRY_DATE_LEN = 4,
110  kENTRY_CRC32_OFF = 14, kENTRY_CRC32_LEN = 4,
111  kENTRY_CSIZE_OFF = 18, kENTRY_CSIZE_LEN = 4,
112  kENTRY_USIZE_OFF = 22, kENTRY_USIZE_LEN = 4,
113  kENTRY_NAMELEN_OFF = 26, kENTRY_NAMELEN_LEN = 2,
114  kENTRY_EXTRALEN_OFF = 28, kENTRY_EXTRALEN_LEN = 2,
115  kENTRY_HEADER_SIZE = 30,
116 
117  // - Offsets into the Zip64 Extended Information Extra Field
118  kZIP64_EXTENDED_MAGIC_OFF = 0, kZIP64_EXTENDED_MAGIC_LEN = 2,
119  kZIP64_EXTENDED_SIZE_OFF = 2, kZIP64_EXTENDED_SIZE_LEN = 2,
120  kZIP64_EXTENDED_USIZE_OFF = 4, kZIP64_EXTENDED_USIZE_LEN = 8,
121  kZIP64_EXTENTED_CSIZE_OFF = 12, kZIP64_EXTENDED_CSIZE_LEN = 8,
122  kZIP64_EXTENDED_HDR_OFFSET_OFF = 20, kZIP64_EXTENDED_HDR_OFFSET_LEN = 8,
123  kZIP64_EXTENDED_DISK_OFF = 28, kZIP64_EXTENDED_DISK_LEN = 4,
124  kZIP64_EXTENDED_SIZE = 32,
125 
126  // - Compression method and strategy
127  kSTORED = 0, ///< Stored as is
128  kDEFLATED = 8 ///< Stored using deflate
129  };
130 
131  TZIPFile(const TZIPFile&) = delete; // Not implemented
132  TZIPFile& operator=(const TZIPFile&) = delete; // Not implemented
133 
134 public:
135  TZIPFile();
136  TZIPFile(const char *archive, const char *member, TFile *file);
137  virtual ~TZIPFile() { }
138 
139  virtual Int_t OpenArchive();
140  virtual Int_t SetCurrentMember();
141 
142  void Print(Option_t *option = "") const;
143 
144  ClassDef(TZIPFile,1) //A ZIP archive file
145 };
146 
147 /**
148 \class TZIPMember
149 \ingroup IO
150 A ZIP archive consists of files compressed with the popular ZLIB
151 compression algorithm; this class records the information about a
152 single archive member.
153 */
154 
155 
156 class TZIPMember : public TArchiveMember {
157 
158 friend class TZIPFile;
159 
160 private:
161  void *fLocal; ///< Extra file header data
162  UInt_t fLocalLen; ///< Length of extra file header data
163  void *fGlobal; ///< Extra directory data
164  UInt_t fGlobalLen; ///< Length of extra directory data
165  UInt_t fCRC32; ///< CRC-32 for all decompressed data
166  UInt_t fAttrInt; ///< Internal file attributes
167  UInt_t fAttrExt; ///< External file attributes
168  UInt_t fMethod; ///< Compression type
169  UInt_t fLevel; ///< Compression level
170 
171 public:
172  TZIPMember();
173  TZIPMember(const char *name);
174  TZIPMember(const TZIPMember &member);
175  TZIPMember &operator=(const TZIPMember &rhs);
176  virtual ~TZIPMember();
177 
178  void *GetLocal() const { return fLocal; }
179  UInt_t GetLocalLen() const { return fLocalLen; }
180  void *GetGlobal() const { return fGlobal; }
181  UInt_t GetGlobalLen() const { return fGlobalLen; }
182  UInt_t GetCRC32() const { return fCRC32; }
183  UInt_t GetAttrInt() const { return fAttrInt; }
184  UInt_t GetAttrExt() const { return fAttrExt; }
185  UInt_t GetMethod() const { return fMethod; }
186  UInt_t GetLevel() const { return fLevel; }
187 
188  void Print(Option_t *option = "") const;
189 
190  ClassDef(TZIPMember, 0); //A ZIP archive member file
191 };
192 
193 #endif