25#ifndef SRC_XRDZIP_XRDZIPCDFH_HH_
26#define SRC_XRDZIP_XRDZIPCDFH_HH_
35#include <unordered_map>
51 typedef std::vector<std::unique_ptr<CDFH>>
cdvec_t;
56 typedef std::unordered_map<std::string, size_t>
cdmap_t;
61 typedef std::unordered_map<std::string, std::unique_ptr<CDFH>>
cdrecs_t;
75 inline static std::tuple<cdvec_t, cdmap_t>
Parse(
const char *buffer, uint32_t bufferSize, uint16_t nbCdRecords )
80 cdvec.reserve( nbCdRecords );
82 for(
size_t i = 0; i < nbCdRecords; ++i )
86 uint32_t signature = to<uint32_t>( buffer +
offset );
89 std::unique_ptr<CDFH> cdfh(
new CDFH( buffer +
offset, bufferSize ) );
91 bufferSize -= cdfh->cdfhSize;
92 cdmap[cdfh->filename] = i;
93 cdvec.push_back( std::move( cdfh ) );
96 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
105 inline static std::tuple<cdvec_t, cdmap_t>
Parse(
const char *&buffer, uint32_t bufferSize )
110 while( bufferSize > 0 )
112 if( bufferSize <
sizeof( uint32_t ) )
throw bad_data();
114 uint32_t signature = to<uint32_t>( buffer );
116 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
118 std::unique_ptr<CDFH> cdfh(
new CDFH( buffer ) );
120 buffer += cdfh->cdfhSize;
121 bufferSize -= cdfh->cdfhSize;
122 cdmap[cdfh->filename] = i++;
123 cdvec.push_back( std::move( cdfh ) );
126 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
132 inline static size_t CalcSize(
const cdvec_t &cdvec, uint32_t orgcdsz, uint32_t orgcdcnt )
135 auto itr = cdvec.begin() + orgcdcnt;
136 for( ; itr != cdvec.end() ; ++itr )
138 CDFH *cdfh = itr->get();
141 return size + orgcdsz;
149 std::copy( orgcdbuf.begin(), orgcdbuf.end(), std::back_inserter( buffer ) );
150 auto itr = cdvec.begin() + orgcdcnt;
151 for( ; itr != cdvec.end() ; ++itr )
153 CDFH *cdfh = itr->get();
161 CDFH(
LFH *lfh, mode_t mode, uint64_t lfhOffset ):
195 CDFH(
const char *buffer,
const uint32_t maxSize = 0 )
203 ZCRC32 = to<uint32_t>(buffer + 16);
209 nbDisk = to<uint16_t>(buffer + 34);
212 offset = to<uint32_t>(buffer + 42);
231 return cdfh.
extra->offset;
246 exsize +=
sizeof( uint64_t );
253 exsize +=
sizeof( uint64_t );
260 exsize +=
sizeof( uint64_t );
267 exsize +=
sizeof( uint32_t );
272 if( exsize == 0 )
return;
279 extra->FromBuffer( buffer, exsize, ovrflws );
305 std::copy(
filename.begin(),
filename.end(), std::back_inserter( buffer ) );
307 extra->Serialize( buffer );
310 std::copy(
comment.begin(),
comment.end(), std::back_inserter( buffer ) );
Definition XrdZipCDFH.hh:42
std::unordered_map< std::string, std::unique_ptr< CDFH > > cdrecs_t
Definition XrdZipCDFH.hh:61
std::vector< std::unique_ptr< CDFH > > cdvec_t
Definition XrdZipCDFH.hh:51
std::vector< char > buffer_t
Definition XrdZipUtils.hh:56
static void copy_bytes(const INT value, buffer_t &buffer)
Definition XrdZipUtils.hh:62
std::unordered_map< std::string, size_t > cdmap_t
Definition XrdZipCDFH.hh:56
Definition XrdZipCDFH.hh:67
uint32_t uncompressedSize
Definition XrdZipCDFH.hh:336
uint32_t offset
Definition XrdZipCDFH.hh:343
uint16_t cdfhSize
Definition XrdZipCDFH.hh:347
uint16_t nbDisk
Definition XrdZipCDFH.hh:340
static uint64_t GetOffset(const CDFH &cdfh)
Definition XrdZipCDFH.hh:227
std::unique_ptr< Extra > extra
Definition XrdZipCDFH.hh:345
uint16_t internAttr
Definition XrdZipCDFH.hh:341
std::string filename
Definition XrdZipCDFH.hh:344
CDFH(LFH *lfh, mode_t mode, uint64_t lfhOffset)
Definition XrdZipCDFH.hh:161
uint32_t externAttr
Definition XrdZipCDFH.hh:342
static std::tuple< cdvec_t, cdmap_t > Parse(const char *buffer, uint32_t bufferSize, uint16_t nbCdRecords)
Definition XrdZipCDFH.hh:75
uint16_t zipVersion
Definition XrdZipCDFH.hh:329
static const uint16_t cdfhBaseSize
Definition XrdZipCDFH.hh:353
uint16_t extraLength
Definition XrdZipCDFH.hh:338
uint16_t compressionMethod
Definition XrdZipCDFH.hh:332
bool HasDataDescriptor()
Definition XrdZipCDFH.hh:324
static std::tuple< cdvec_t, cdmap_t > Parse(const char *&buffer, uint32_t bufferSize)
Definition XrdZipCDFH.hh:105
uint16_t generalBitFlag
Definition XrdZipCDFH.hh:331
void Serialize(buffer_t &buffer)
Serialize the object into a buffer.
Definition XrdZipCDFH.hh:286
uint32_t ZCRC32
Definition XrdZipCDFH.hh:334
uint16_t commentLength
Definition XrdZipCDFH.hh:339
uint16_t minZipVersion
Definition XrdZipCDFH.hh:330
static size_t CalcSize(const cdvec_t &cdvec, uint32_t orgcdsz, uint32_t orgcdcnt)
Definition XrdZipCDFH.hh:132
static const uint32_t cdfhSign
Definition XrdZipCDFH.hh:352
static void Serialize(uint32_t orgcdcnt, const buffer_t &orgcdbuf, const cdvec_t &cdvec, buffer_t &buffer)
Definition XrdZipCDFH.hh:144
void ParseExtra(const char *buffer, uint16_t length)
Definition XrdZipCDFH.hh:237
uint32_t compressedSize
Definition XrdZipCDFH.hh:335
uint16_t filenameLength
Definition XrdZipCDFH.hh:337
CDFH(const char *buffer, const uint32_t maxSize=0)
Definition XrdZipCDFH.hh:195
bool IsZIP64() const
Definition XrdZipCDFH.hh:316
dos_timestmp timestmp
Definition XrdZipCDFH.hh:333
std::string comment
Definition XrdZipCDFH.hh:346
static const uint16_t flag
Definition XrdZipDataDescriptor.hh:43
A data structure representing ZIP Local File Header.
Definition XrdZipLFH.hh:42
Definition XrdZipUtils.hh:42
Definition XrdZipUtils.hh:105
uint16_t time
Definition XrdZipUtils.hh:142
uint16_t date
Definition XrdZipUtils.hh:155
Definition XrdZipUtils.hh:49