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 ) );
88 offset += cdfh->cdfhSize;
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 ):
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 );
227 return cdfh.
extra->offset;
242 exsize +=
sizeof( uint64_t );
249 exsize +=
sizeof( uint64_t );
256 exsize +=
sizeof( uint64_t );
263 exsize +=
sizeof( uint32_t );
268 if( exsize == 0 )
return;
275 extra->FromBuffer( buffer, exsize, ovrflws );
301 std::copy(
filename.begin(),
filename.end(), std::back_inserter( buffer ) );
303 extra->Serialize( buffer );
306 std::copy(
comment.begin(),
comment.end(), std::back_inserter( buffer ) );
uint16_t internAttr
Definition: XrdZipCDFH.hh:337
static const uint16_t cdfhBaseSize
Definition: XrdZipCDFH.hh:349
std::vector< char > buffer_t
Definition: XrdZipUtils.hh:54
uint16_t generalBitFlag
Definition: XrdZipCDFH.hh:327
uint16_t time
Definition: XrdZipUtils.hh:130
CDFH(const char *buffer)
Definition: XrdZipCDFH.hh:193
static uint64_t GetOffset(const CDFH &cdfh)
Definition: XrdZipCDFH.hh:223
static void copy_bytes(const INT value, buffer_t &buffer)
Definition: XrdZipUtils.hh:60
uint16_t commentLength
Definition: XrdZipCDFH.hh:335
static const uint16_t flag
Definition: XrdZipDataDescriptor.hh:41
uint16_t filenameLength
Definition: XrdZipCDFH.hh:333
void Serialize(buffer_t &buffer)
Serialize the object into a buffer.
Definition: XrdZipCDFH.hh:282
static const uint32_t cdfhSign
Definition: XrdZipCDFH.hh:348
static size_t CalcSize(const cdvec_t &cdvec, uint32_t orgcdsz, uint32_t orgcdcnt)
Definition: XrdZipCDFH.hh:130
uint32_t uncompressedSize
Definition: XrdZipCDFH.hh:332
uint16_t extraLength
Definition: XrdZipCDFH.hh:334
uint32_t offset
Definition: XrdZipCDFH.hh:339
std::unique_ptr< Extra > extra
Definition: XrdZipCDFH.hh:341
uint32_t compressedSize
Definition: XrdZipCDFH.hh:331
uint16_t cdfhSize
Definition: XrdZipCDFH.hh:343
dos_timestmp timestmp
Definition: XrdZipCDFH.hh:329
std::unordered_map< std::string, std::unique_ptr< CDFH > > cdrecs_t
Definition: XrdZipCDFH.hh:59
static void Serialize(uint32_t orgcdcnt, const buffer_t &orgcdbuf, const cdvec_t &cdvec, buffer_t &buffer)
Definition: XrdZipCDFH.hh:142
Definition: XrdZipCDFH.hh:64
std::string comment
Definition: XrdZipCDFH.hh:342
A data structure representing ZIP Local File Header.
Definition: XrdZipLFH.hh:41
auto get(const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.key())
Definition: XrdOucJson.hh:4497
uint16_t nbDisk
Definition: XrdZipCDFH.hh:336
static std::tuple< cdvec_t, cdmap_t > Parse(const char *buffer, uint32_t bufferSize, uint16_t nbCdRecords)
Definition: XrdZipCDFH.hh:73
uint32_t ZCRC32
Definition: XrdZipCDFH.hh:330
Definition: XrdZipUtils.hh:46
std::unordered_map< std::string, size_t > cdmap_t
Definition: XrdZipCDFH.hh:54
Definition: XrdZipUtils.hh:40
bool IsZIP64() const
Definition: XrdZipCDFH.hh:312
uint16_t compressionMethod
Definition: XrdZipCDFH.hh:328
Definition: XrdZipUtils.hh:92
void ParseExtra(const char *buffer, uint16_t length)
Definition: XrdZipCDFH.hh:233
uint32_t externAttr
Definition: XrdZipCDFH.hh:338
bool HasDataDescriptor()
Definition: XrdZipCDFH.hh:320
std::vector< std::unique_ptr< CDFH > > cdvec_t
Definition: XrdZipCDFH.hh:44
uint16_t date
Definition: XrdZipUtils.hh:143
uint16_t minZipVersion
Definition: XrdZipCDFH.hh:326
uint16_t zipVersion
Definition: XrdZipCDFH.hh:325
CDFH(LFH *lfh, mode_t mode, uint64_t lfhOffset)
Definition: XrdZipCDFH.hh:159
std::string filename
Definition: XrdZipCDFH.hh:340
static std::tuple< cdvec_t, cdmap_t > Parse(const char *&buffer, uint32_t bufferSize)
Definition: XrdZipCDFH.hh:103