25#ifndef SRC_XRDZIP_XRDZIPCDFH_HH_
26#define SRC_XRDZIP_XRDZIPCDFH_HH_
35#include <unordered_map>
49 typedef std::vector<std::unique_ptr<CDFH>>
cdvec_t;
54 typedef std::unordered_map<std::string, size_t>
cdmap_t;
59 typedef std::unordered_map<std::string, std::unique_ptr<CDFH>>
cdrecs_t;
73 inline static std::tuple<cdvec_t, cdmap_t>
Parse(
const char *buffer, uint32_t bufferSize, uint16_t nbCdRecords )
78 cdvec.reserve( nbCdRecords );
80 for(
size_t i = 0; i < nbCdRecords; ++i )
84 uint32_t signature = to<uint32_t>( buffer +
offset );
87 std::unique_ptr<CDFH> cdfh(
new CDFH( buffer +
offset, bufferSize ) );
89 bufferSize -= cdfh->cdfhSize;
90 cdmap[cdfh->filename] = i;
91 cdvec.push_back( std::move( cdfh ) );
94 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
103 inline static std::tuple<cdvec_t, cdmap_t>
Parse(
const char *&buffer, uint32_t bufferSize )
108 while( bufferSize > 0 )
110 if( bufferSize <
sizeof( uint32_t ) )
throw bad_data();
112 uint32_t signature = to<uint32_t>( buffer );
114 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
116 std::unique_ptr<CDFH> cdfh(
new CDFH( buffer ) );
118 buffer += cdfh->cdfhSize;
119 bufferSize -= cdfh->cdfhSize;
120 cdmap[cdfh->filename] = i++;
121 cdvec.push_back( std::move( cdfh ) );
124 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
130 inline static size_t CalcSize(
const cdvec_t &cdvec, uint32_t orgcdsz, uint32_t orgcdcnt )
133 auto itr = cdvec.begin() + orgcdcnt;
134 for( ; itr != cdvec.end() ; ++itr )
136 CDFH *cdfh = itr->get();
139 return size + orgcdsz;
147 std::copy( orgcdbuf.begin(), orgcdbuf.end(), std::back_inserter( buffer ) );
148 auto itr = cdvec.begin() + orgcdcnt;
149 for( ; itr != cdvec.end() ; ++itr )
151 CDFH *cdfh = itr->get();
159 CDFH(
LFH *lfh, mode_t mode, uint64_t lfhOffset ):
193 CDFH(
const char *buffer,
const uint32_t maxSize = 0 )
195 zipVersion = *
reinterpret_cast<const uint16_t*
>( buffer + 4 );
196 minZipVersion = *
reinterpret_cast<const uint16_t*
>( buffer + 6 );
197 generalBitFlag = *
reinterpret_cast<const uint16_t*
>( buffer + 8 );
199 timestmp.
time = *
reinterpret_cast<const uint16_t*
>( buffer + 12 );
200 timestmp.
date = *
reinterpret_cast<const uint16_t*
>( buffer + 14 );
201 ZCRC32 = *
reinterpret_cast<const uint32_t*
>( buffer + 16 );
202 compressedSize = *
reinterpret_cast<const uint32_t*
>( buffer + 20 );
204 filenameLength = *
reinterpret_cast<const uint16_t*
>( buffer + 28 );
205 extraLength = *
reinterpret_cast<const uint16_t*
>( buffer + 30 );
206 commentLength = *
reinterpret_cast<const uint16_t*
>( buffer + 32 );
207 nbDisk = *
reinterpret_cast<const uint16_t*
>( buffer + 34 );
208 internAttr = *
reinterpret_cast<const uint16_t*
>( buffer + 36 );
209 externAttr = *
reinterpret_cast<const uint32_t*
>( buffer + 38 );
210 offset = *
reinterpret_cast<const uint32_t*
>( buffer + 42 );
229 return cdfh.
extra->offset;
244 exsize +=
sizeof( uint64_t );
251 exsize +=
sizeof( uint64_t );
258 exsize +=
sizeof( uint64_t );
265 exsize +=
sizeof( uint32_t );
270 if( exsize == 0 )
return;
277 extra->FromBuffer( buffer, exsize, ovrflws );
303 std::copy(
filename.begin(),
filename.end(), std::back_inserter( buffer ) );
305 extra->Serialize( buffer );
308 std::copy(
comment.begin(),
comment.end(), std::back_inserter( buffer ) );
Definition: XrdZipCDFH.hh:40
std::unordered_map< std::string, std::unique_ptr< CDFH > > cdrecs_t
Definition: XrdZipCDFH.hh:59
std::vector< std::unique_ptr< CDFH > > cdvec_t
Definition: XrdZipCDFH.hh:49
std::vector< char > buffer_t
Definition: XrdZipUtils.hh:54
static void copy_bytes(const INT value, buffer_t &buffer)
Definition: XrdZipUtils.hh:60
std::unordered_map< std::string, size_t > cdmap_t
Definition: XrdZipCDFH.hh:54
Definition: XrdZipCDFH.hh:65
uint32_t uncompressedSize
Definition: XrdZipCDFH.hh:334
uint32_t offset
Definition: XrdZipCDFH.hh:341
uint16_t cdfhSize
Definition: XrdZipCDFH.hh:345
uint16_t nbDisk
Definition: XrdZipCDFH.hh:338
static uint64_t GetOffset(const CDFH &cdfh)
Definition: XrdZipCDFH.hh:225
std::unique_ptr< Extra > extra
Definition: XrdZipCDFH.hh:343
uint16_t internAttr
Definition: XrdZipCDFH.hh:339
std::string filename
Definition: XrdZipCDFH.hh:342
CDFH(LFH *lfh, mode_t mode, uint64_t lfhOffset)
Definition: XrdZipCDFH.hh:159
uint32_t externAttr
Definition: XrdZipCDFH.hh:340
static std::tuple< cdvec_t, cdmap_t > Parse(const char *buffer, uint32_t bufferSize, uint16_t nbCdRecords)
Definition: XrdZipCDFH.hh:73
uint16_t zipVersion
Definition: XrdZipCDFH.hh:327
static const uint16_t cdfhBaseSize
Definition: XrdZipCDFH.hh:351
uint16_t extraLength
Definition: XrdZipCDFH.hh:336
uint16_t compressionMethod
Definition: XrdZipCDFH.hh:330
bool HasDataDescriptor()
Definition: XrdZipCDFH.hh:322
static std::tuple< cdvec_t, cdmap_t > Parse(const char *&buffer, uint32_t bufferSize)
Definition: XrdZipCDFH.hh:103
uint16_t generalBitFlag
Definition: XrdZipCDFH.hh:329
void Serialize(buffer_t &buffer)
Serialize the object into a buffer.
Definition: XrdZipCDFH.hh:284
uint32_t ZCRC32
Definition: XrdZipCDFH.hh:332
uint16_t commentLength
Definition: XrdZipCDFH.hh:337
uint16_t minZipVersion
Definition: XrdZipCDFH.hh:328
static size_t CalcSize(const cdvec_t &cdvec, uint32_t orgcdsz, uint32_t orgcdcnt)
Definition: XrdZipCDFH.hh:130
static const uint32_t cdfhSign
Definition: XrdZipCDFH.hh:350
static void Serialize(uint32_t orgcdcnt, const buffer_t &orgcdbuf, const cdvec_t &cdvec, buffer_t &buffer)
Definition: XrdZipCDFH.hh:142
void ParseExtra(const char *buffer, uint16_t length)
Definition: XrdZipCDFH.hh:235
uint32_t compressedSize
Definition: XrdZipCDFH.hh:333
uint16_t filenameLength
Definition: XrdZipCDFH.hh:335
CDFH(const char *buffer, const uint32_t maxSize=0)
Definition: XrdZipCDFH.hh:193
bool IsZIP64() const
Definition: XrdZipCDFH.hh:314
dos_timestmp timestmp
Definition: XrdZipCDFH.hh:331
std::string comment
Definition: XrdZipCDFH.hh:344
static const uint16_t flag
Definition: XrdZipDataDescriptor.hh:41
A data structure representing ZIP Local File Header.
Definition: XrdZipLFH.hh:42
Definition: XrdZipUtils.hh:40
Definition: XrdZipUtils.hh:93
uint16_t time
Definition: XrdZipUtils.hh:130
uint16_t date
Definition: XrdZipUtils.hh:143
Definition: XrdZipUtils.hh:47