25 #ifndef SRC_XRDZIP_XRDZIPCDFH_HH_
26 #define SRC_XRDZIP_XRDZIPCDFH_HH_
34 #include <unordered_map>
48 typedef std::vector<std::unique_ptr<CDFH>>
cdvec_t;
53 typedef std::unordered_map<std::string, size_t>
cdmap_t;
58 typedef std::unordered_map<std::string, std::unique_ptr<CDFH>>
cdrecs_t;
72 inline static std::tuple<cdvec_t, cdmap_t>
Parse(
const char *buffer, uint32_t bufferSize, uint16_t nbCdRecords )
77 cdvec.reserve( nbCdRecords );
79 for(
size_t i = 0; i < nbCdRecords; ++i )
83 uint32_t signature = to<uint32_t>( buffer +
offset );
86 std::unique_ptr<CDFH> cdfh(
new CDFH( buffer + offset ) );
87 offset += cdfh->cdfhSize;
88 bufferSize -= cdfh->cdfhSize;
89 cdmap[cdfh->filename] = i;
90 cdvec.push_back( std::move( cdfh ) );
93 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
102 inline static std::tuple<cdvec_t, cdmap_t>
Parse(
const char *&buffer, uint32_t bufferSize )
107 while( bufferSize > 0 )
109 if( bufferSize <
sizeof( uint32_t ) )
throw bad_data();
111 uint32_t signature = to<uint32_t>( buffer );
113 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
115 std::unique_ptr<CDFH> cdfh(
new CDFH( buffer ) );
117 buffer += cdfh->cdfhSize;
118 bufferSize -= cdfh->cdfhSize;
119 cdmap[cdfh->filename] = i++;
120 cdvec.push_back( std::move( cdfh ) );
123 return std::make_tuple( std::move( cdvec ), std::move( cdmap ) );
129 inline static size_t CalcSize(
const cdvec_t &cdvec, uint32_t orgcdsz, uint32_t orgcdcnt )
132 auto itr = cdvec.begin() + orgcdcnt;
133 for( ; itr != cdvec.end() ; ++itr )
135 CDFH *cdfh = itr->get();
138 return size + orgcdsz;
146 std::copy( orgcdbuf.begin(), orgcdbuf.end(), std::back_inserter( buffer ) );
147 auto itr = cdvec.begin() + orgcdcnt;
148 for( ; itr != cdvec.end() ; ++itr )
150 CDFH *cdfh = itr->get();
158 CDFH(
LFH *lfh, mode_t mode, uint64_t lfhOffset ):
194 zipVersion = *
reinterpret_cast<const uint16_t*
>( buffer + 4 );
195 minZipVersion = *
reinterpret_cast<const uint16_t*
>( buffer + 6 );
196 generalBitFlag = *
reinterpret_cast<const uint16_t*
>( buffer + 8 );
198 timestmp.
time = *
reinterpret_cast<const uint16_t*
>( buffer + 12 );
199 timestmp.
date = *
reinterpret_cast<const uint16_t*
>( buffer + 14 );
200 ZCRC32 = *
reinterpret_cast<const uint32_t*
>( buffer + 16 );
201 compressedSize = *
reinterpret_cast<const uint32_t*
>( buffer + 20 );
203 filenameLength = *
reinterpret_cast<const uint16_t*
>( buffer + 28 );
204 extraLength = *
reinterpret_cast<const uint16_t*
>( buffer + 30 );
205 commentLength = *
reinterpret_cast<const uint16_t*
>( buffer + 32 );
206 nbDisk = *
reinterpret_cast<const uint16_t*
>( buffer + 34 );
207 internAttr = *
reinterpret_cast<const uint16_t*
>( buffer + 36 );
208 externAttr = *
reinterpret_cast<const uint32_t*
>( buffer + 38 );
209 offset = *
reinterpret_cast<const uint32_t*
>( buffer + 42 );
226 return cdfh.
extra->offset;
241 exsize +=
sizeof( uint64_t );
248 exsize +=
sizeof( uint64_t );
255 exsize +=
sizeof( uint64_t );
262 exsize +=
sizeof( uint32_t );
267 if( exsize == 0 )
return;
274 extra->FromBuffer( buffer, exsize, ovrflws );
299 std::copy(
filename.begin(),
filename.end(), std::back_inserter( buffer ) );
301 extra->Serialize( buffer );
304 std::copy(
comment.begin(),
comment.end(), std::back_inserter( buffer ) );
uint16_t internAttr
Definition: XrdZipCDFH.hh:319
static const uint16_t cdfhBaseSize
Definition: XrdZipCDFH.hh:331
std::vector< char > buffer_t
Definition: XrdZipUtils.hh:54
uint16_t generalBitFlag
Definition: XrdZipCDFH.hh:309
uint16_t time
Definition: XrdZipUtils.hh:130
CDFH(const char *buffer)
Definition: XrdZipCDFH.hh:192
static uint64_t GetOffset(const CDFH &cdfh)
Definition: XrdZipCDFH.hh:222
static void copy_bytes(const INT value, buffer_t &buffer)
Definition: XrdZipUtils.hh:60
uint16_t commentLength
Definition: XrdZipCDFH.hh:317
uint16_t filenameLength
Definition: XrdZipCDFH.hh:315
void Serialize(buffer_t &buffer)
Serialize the object into a buffer.
Definition: XrdZipCDFH.hh:280
static const uint32_t cdfhSign
Definition: XrdZipCDFH.hh:330
static size_t CalcSize(const cdvec_t &cdvec, uint32_t orgcdsz, uint32_t orgcdcnt)
Definition: XrdZipCDFH.hh:129
uint32_t uncompressedSize
Definition: XrdZipCDFH.hh:314
uint16_t extraLength
Definition: XrdZipCDFH.hh:316
uint32_t offset
Definition: XrdZipCDFH.hh:321
std::unique_ptr< Extra > extra
Definition: XrdZipCDFH.hh:323
uint32_t compressedSize
Definition: XrdZipCDFH.hh:313
uint16_t cdfhSize
Definition: XrdZipCDFH.hh:325
dos_timestmp timestmp
Definition: XrdZipCDFH.hh:311
std::unordered_map< std::string, std::unique_ptr< CDFH > > cdrecs_t
Definition: XrdZipCDFH.hh:58
static void Serialize(uint32_t orgcdcnt, const buffer_t &orgcdbuf, const cdvec_t &cdvec, buffer_t &buffer)
Definition: XrdZipCDFH.hh:141
Definition: XrdZipCDFH.hh:63
std::string comment
Definition: XrdZipCDFH.hh:324
A data structure representing ZIP Local File Header.
Definition: XrdZipLFH.hh:41
uint16_t nbDisk
Definition: XrdZipCDFH.hh:318
static std::tuple< cdvec_t, cdmap_t > Parse(const char *buffer, uint32_t bufferSize, uint16_t nbCdRecords)
Definition: XrdZipCDFH.hh:72
uint32_t ZCRC32
Definition: XrdZipCDFH.hh:312
Definition: XrdZipUtils.hh:46
std::unordered_map< std::string, size_t > cdmap_t
Definition: XrdZipCDFH.hh:53
Definition: XrdZipUtils.hh:40
uint16_t compressionMethod
Definition: XrdZipCDFH.hh:310
Definition: XrdZipUtils.hh:92
void ParseExtra(const char *buffer, uint16_t length)
Definition: XrdZipCDFH.hh:232
uint32_t externAttr
Definition: XrdZipCDFH.hh:320
std::vector< std::unique_ptr< CDFH > > cdvec_t
Definition: XrdZipCDFH.hh:43
uint16_t date
Definition: XrdZipUtils.hh:143
uint16_t minZipVersion
Definition: XrdZipCDFH.hh:308
uint16_t zipVersion
Definition: XrdZipCDFH.hh:307
CDFH(LFH *lfh, mode_t mode, uint64_t lfhOffset)
Definition: XrdZipCDFH.hh:158
std::string filename
Definition: XrdZipCDFH.hh:322
static std::tuple< cdvec_t, cdmap_t > Parse(const char *&buffer, uint32_t bufferSize)
Definition: XrdZipCDFH.hh:102