diff --git a/source/detail/zip.cpp b/source/detail/zip.cpp index b5f121bb..2f8cfdad 100644 --- a/source/detail/zip.cpp +++ b/source/detail/zip.cpp @@ -66,86 +66,73 @@ inline void write_int(std::ostream &stream, T value) stream.write(reinterpret_cast(&value), sizeof(T)); } -struct zip_file_header +zip_file_header::zip_file_header() { - std::uint16_t version = 20; - std::uint16_t flags = 0; - std::uint16_t compression_type = 8; - std::uint16_t stamp_date,stamp_time = 0; - std::uint32_t crc = 0; - std::uint32_t compressed_size = 0; - std::uint32_t uncompressed_size = 0; - std::string filename; - std::string comment; - std::vector extra; - std::uint32_t header_offset = 0; // local header offset +} - zip_file_header() +bool zip_file_header::read(std::istream& istream,const bool global) +{ + auto sig = read_int(istream); + + // read and check for local/global magic + if(global) { - } - - bool read(std::istream& istream,const bool global) - { - auto sig = read_int(istream); - - // read and check for local/global magic - if(global) + if(sig!=0x02014b50) { - if(sig!=0x02014b50) - { - std::cerr<<"Did not find global header signature"<(istream); - } - else if(sig!=0x04034b50) - { - std::cerr<<"Did not find local header signature"<(istream); - flags = read_int(istream); - compression_type = read_int(istream); - stamp_date = read_int(istream); - stamp_time = read_int(istream); - crc = read_int(istream); - compressed_size = read_int(istream); - uncompressed_size = read_int(istream); - - auto filename_length = read_int(istream); - auto extra_length = read_int(istream); - - std::uint16_t comment_length = 0; - - if(global) - { - comment_length = read_int(istream); - /*std::uint16_t disk_number_start = */read_int(istream); - /*std::uint16_t int_file_attrib = */read_int(istream); - /*std::uint32_t ext_file_attrib = */read_int(istream); - header_offset = read_int(istream); - } - - filename.resize(filename_length, '\0'); - istream.read(&filename[0], filename_length); - - extra.resize(extra_length, 0); - istream.read(reinterpret_cast(extra.data()), extra_length); - - if (global) - { - comment.resize(comment_length, '\0'); - istream.read(&comment[0], comment_length); - } - - return true; + } + else if(sig!=0x04034b50) + { + std::cerr<<"Did not find local header signature"<(istream); + flags = read_int(istream); + compression_type = read_int(istream); + stamp_date = read_int(istream); + stamp_time = read_int(istream); + crc = read_int(istream); + compressed_size = read_int(istream); + uncompressed_size = read_int(istream); + + auto filename_length = read_int(istream); + auto extra_length = read_int(istream); + + std::uint16_t comment_length = 0; + + if(global) + { + comment_length = read_int(istream); + /*std::uint16_t disk_number_start = */read_int(istream); + /*std::uint16_t int_file_attrib = */read_int(istream); + /*std::uint32_t ext_file_attrib = */read_int(istream); + header_offset = read_int(istream); + } + + filename.resize(filename_length, '\0'); + istream.read(&filename[0], filename_length); + + extra.resize(extra_length, 0); + istream.read(reinterpret_cast(extra.data()), extra_length); + + if (global) + { + comment.resize(comment_length, '\0'); + istream.read(&comment[0], comment_length); + } + + return true; +} + +void zip_file_header::Write(std::ostream& ostream,const bool global) const +{ + if(global){ write_int(ostream,(unsigned int)0x02014b50); // header sig write_int(ostream,(unsigned short)00);} // version made by else write_int(ostream,(unsigned int)0x04034b50); @@ -165,8 +152,8 @@ struct zip_file_header write_int(ostream,(unsigned short)0); // internal file write_int(ostream,(unsigned int)0); // ext final write_int(ostream,(unsigned int)header_offset);} // rel offset - for(unsigned int i=0;i extra; + std::uint32_t header_offset = 0; + + zip_file_header(); + + bool read(std::istream& istream, const bool global); + void Write(std::ostream& ostream, const bool global) const; +}; class ZipFileWriter {