xrootd
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
XrdZipZIP64EOCD.hh
Go to the documentation of this file.
1 /*
2  * XrdZipZIP64EOCD.hh
3  *
4  * Created on: 9 Nov 2020
5  * Author: simonm
6  */
7 
8 #ifndef SRC_XRDZIP_XRDZIPZIP64EOCD_HH_
9 #define SRC_XRDZIP_XRDZIPZIP64EOCD_HH_
10 
11 #include "XrdZip/XrdZipUtils.hh"
12 #include "XrdZip/XrdZipLFH.hh"
13 #include "XrdZip/XrdZipCDFH.hh"
14 #include <string>
15 #include <sstream>
16 
17 namespace XrdZip
18 {
19  //---------------------------------------------------------------------------
22  //---------------------------------------------------------------------------
23  struct ZIP64_EOCD
24  {
25  //-------------------------------------------------------------------------
27  //-------------------------------------------------------------------------
28  ZIP64_EOCD( const char* buffer ):
30  {
31  zip64EocdSize = *reinterpret_cast<const uint64_t*>( buffer + 4 );
32  zipVersion = *reinterpret_cast<const uint16_t*>( buffer + 12 );
33  minZipVersion = *reinterpret_cast<const uint16_t*>( buffer + 14 );
34  nbDisk = *reinterpret_cast<const uint32_t*>( buffer + 16 );
35  nbDiskCd = *reinterpret_cast<const uint32_t*>( buffer + 20 );
36  nbCdRecD = *reinterpret_cast<const uint64_t*>( buffer + 24 );
37  nbCdRec = *reinterpret_cast<const uint64_t*>( buffer + 32 );
38  cdSize = *reinterpret_cast<const uint64_t*>( buffer + 40 );
39  cdOffset = *reinterpret_cast<const uint64_t*>( buffer + 48 );
40 
42  }
43 
44  //-------------------------------------------------------------------------
46  //-------------------------------------------------------------------------
47  ZIP64_EOCD( uint64_t cdoff, uint32_t cdcnt, uint32_t cdsize ) :
48  zipVersion( ( 3 << 8 ) | 63 ),
49  minZipVersion( 45 ),
50  nbDisk( 0 ),
51  nbDiskCd( 0 ),
53  {
54  nbCdRec = cdcnt;
55  nbCdRecD = cdcnt;
56  cdSize = cdsize;
57  cdOffset = cdoff;
58 
61  }
62 
63  //-------------------------------------------------------------------------
65  //-------------------------------------------------------------------------
66  void Serialize( buffer_t &buffer )
67  {
68  copy_bytes( zip64EocdSign, buffer );
69  copy_bytes( zip64EocdSize, buffer );
70  copy_bytes( zipVersion, buffer );
71  copy_bytes( minZipVersion, buffer );
72  copy_bytes( nbDisk, buffer );
73  copy_bytes( nbDiskCd, buffer );
74  copy_bytes( nbCdRecD, buffer );
75  copy_bytes( nbCdRec, buffer );
76  copy_bytes( cdSize, buffer );
77  copy_bytes( cdOffset, buffer );
78 
79  std::copy( extensibleData.begin(), extensibleData.end(), std::back_inserter( buffer ) );
80  }
81 
82  //-------------------------------------------------------------------------
84  //-------------------------------------------------------------------------
85  std::string ToString()
86  {
87  std::stringstream ss;
88  ss << "{zip64EocdSize=" << zip64EocdSize;
89  ss << ";zipVersion=" << zipVersion;
90  ss << ";minZipVersion=" << minZipVersion;
91  ss << ";nbDisk=" << nbDisk;
92  ss << ";nbDiskCd=" << nbDiskCd;
93  ss << ";nbCdRecD=" << nbCdRecD;
94  ss << ";nbCdRec=" << nbCdRec;
95  ss << ";cdSize=" << cdSize;
96  ss << ";cdOffset=" << cdOffset;
97  ss << ";extensibleData=" << extensibleData;
98  ss << ";extensibleDataLength" << extensibleDataLength << "}";
99  return ss.str();
100  }
101 
102  uint64_t zip64EocdSize; //< size of zip64 end of central directory record
103  uint16_t zipVersion; //< version made by
104  uint16_t minZipVersion; //< version needed to extract
105  uint32_t nbDisk; //< number of this disk
106  uint32_t nbDiskCd; //< number of the disk with the start of the central directory
107  uint64_t nbCdRecD; //< total number of entries in the central directory on this disk
108  uint64_t nbCdRec; //< total number of entries in the central directory
109  uint64_t cdSize; //< size of the central directory
110  uint64_t cdOffset; //< offset of start of central directory
111  std::string extensibleData; //< zip64 extensible data sector
112  uint64_t extensibleDataLength; //< extensible data length
113  uint64_t zip64EocdTotalSize; //< size of the record
114 
115  //-------------------------------------------------------------------------
116  // the End of Central Directory signature
117  //-------------------------------------------------------------------------
118  static const uint32_t zip64EocdSign = 0x06064b50;
119  static const uint16_t zip64EocdBaseSize = 56;
120  };
121 }
122 
123 #endif /* SRC_XRDZIP_XRDZIPZIP64EOCD_HH_ */
ZIP64_EOCD(const char *buffer)
Constructor from a buffer.
Definition: XrdZipZIP64EOCD.hh:28
uint64_t cdSize
Definition: XrdZipZIP64EOCD.hh:109
uint64_t zip64EocdSize
Definition: XrdZipZIP64EOCD.hh:102
ZIP64_EOCD(uint64_t cdoff, uint32_t cdcnt, uint32_t cdsize)
Constructor from last LFH + CDFH.
Definition: XrdZipZIP64EOCD.hh:47
std::vector< char > buffer_t
Definition: XrdZipUtils.hh:54
uint16_t minZipVersion
Definition: XrdZipZIP64EOCD.hh:104
uint16_t zipVersion
Definition: XrdZipZIP64EOCD.hh:103
static void copy_bytes(const INT value, buffer_t &buffer)
Definition: XrdZipUtils.hh:60
uint32_t nbDiskCd
Definition: XrdZipZIP64EOCD.hh:106
uint32_t nbDisk
Definition: XrdZipZIP64EOCD.hh:105
Definition: XrdZipZIP64EOCD.hh:23
uint64_t nbCdRecD
Definition: XrdZipZIP64EOCD.hh:107
uint64_t cdOffset
Definition: XrdZipZIP64EOCD.hh:110
static const uint32_t zip64EocdSign
Definition: XrdZipZIP64EOCD.hh:118
uint64_t extensibleDataLength
Definition: XrdZipZIP64EOCD.hh:112
std::string ToString()
Convert the ZIP64EOCD into a string for logging purposes.
Definition: XrdZipZIP64EOCD.hh:85
static const uint16_t zip64EocdBaseSize
Definition: XrdZipZIP64EOCD.hh:119
uint64_t zip64EocdTotalSize
Definition: XrdZipZIP64EOCD.hh:113
void Serialize(buffer_t &buffer)
Serialize the object into a buffer.
Definition: XrdZipZIP64EOCD.hh:66
uint64_t nbCdRec
Definition: XrdZipZIP64EOCD.hh:108
std::string extensibleData
Definition: XrdZipZIP64EOCD.hh:111