Guitar
zipinternal.h
Go to the documentation of this file.
1 #ifndef ZIPINTERNAL_H
2 #define ZIPINTERNAL_H
3 
4 #include <string>
5 #include <vector>
6 #include <list>
7 #include <cstdint>
8 
9 namespace zip {
10 
11 #pragma pack(push, 1)
12 
14  uint32_t local_file_header_signature; // 4_bytes (0x04034b50)
15  uint16_t version_needed_to_extract; // 2_bytes
16  uint16_t general_purpose_bit_flag; // 2_bytes
17  uint16_t compression_method; // 2_bytes
18  uint16_t last_mod_file_time; // 2_bytes
19  uint16_t last_mod_file_date; // 2_bytes
20  uint32_t crc_32; // 4_bytes
21  uint32_t compressed_size; // 4_bytes
22  uint32_t uncompressed_size; // 4_bytes
23  uint16_t file_name_length; // 2_bytes
24  uint16_t extra_field_length; // 2_bytes
25 };
26 
28  uint32_t central_file_header_signature; // 4_bytes (0x02014b50)
29  uint16_t version_made_by; // 2_bytes
30  uint16_t version_needed_to_extract; // 2_bytes
31  uint16_t general_purpose_bit_flag; // 2_bytes
32  uint16_t compression_method; // 2_bytes
33  uint16_t last_mod_file_time; // 2_bytes
34  uint16_t last_mod_file_date; // 2_bytes
35  uint32_t crc_32; // 4_bytes
36  uint32_t compressed_size; // 4_bytes
37  uint32_t uncompressed_size; // 4_bytes
38  uint16_t file_name_length; // 2_bytes
39  uint16_t extra_field_length; // 2_bytes
40  uint16_t file_comment_length; // 2_bytes
41  uint16_t disk_number_start; // 2_bytes
42  uint16_t internal_file_attributes; // 2_bytes
43  uint32_t external_file_attributes; // 4_bytes
44  uint32_t relative_offset_of_local_header; // 4_bytes
45 };
46 
48  uint32_t end_of_central_dir_signature; // 4_bytes (0x06054b50)
49  uint16_t number_of_this_disk; // 2_bytes
53  uint32_t size_of_the_central_directory; // 4_bytes
55  uint16_t comment_length; // 2_bytes
56 };
57 
58 #pragma pack(pop)
59 
60 struct failed_t {
61  std::string message;
62  failed_t(std::string const &message)
63  : message(message)
64  {
65  }
66 };
67 
68 inline uint16_t msdos_date_format(int year, int month, int day)
69 {
70  return ((year - 1980) << 9) | (month << 5) | day;
71 }
72 
73 inline uint16_t msdos_time_format(int hour, int minute, int second)
74 {
75  return (hour << 11) | (minute << 5) | (second / 2);
76 }
77 
78 
79 struct Item {
80  std::string name;
82  bool isdir() const
83  {
84  return cd.external_file_attributes & 0x10;
85  }
86 };
87 
88 class ZipInternal {
89 private:
90  struct {
91  char const *begin;
92  char const *end;
93  } data;
94  std::list<Item> _items;
95 
96  static bool inflate(char *zptr, size_t zlen, std::vector<char> *out);
97 
98 public:
99  ZipInternal() = default;
101  {
102  close();
103  }
104  bool attach(char const *begin, char const *end);
105  void close();
106  bool extract_file(zip_file_header_t const *cd, std::vector<char> *out, zip_local_file_header_t *header = 0);
107  bool extract_file(char const *path, std::vector<char> *out, zip_local_file_header_t *header = 0);
108  std::list<Item> const *get_item_list() const
109  {
110  return &_items;
111  }
112  size_t size() const
113  {
114  return _items.size();
115  }
116 
117 };
118 
119 struct file_entry_t {
120  enum Kind {
123  };
125  std::vector<unsigned char> data;
126  std::string src;
127  std::string dst;
128  time_t time;
130  : kind(File)
131  {
132  }
133  file_entry_t(std::string const &dst, unsigned char const *begin, unsigned char const *end, time_t time = -1)
134  : kind(Data)
135  , dst(dst)
136  , time(time)
137  {
138  data.insert(data.end(), begin, end);
139  }
140  file_entry_t(std::string const &dst, std::vector<unsigned char> const *vec, time_t time = -1)
141  : kind(Data)
142  , dst(dst)
143  , time(time)
144  {
145  data = *vec;
146  }
147  file_entry_t(std::string const &dst, std::string const &src, time_t time = -1)
148  : kind(File)
149  , src(src)
150  , dst(dst)
151  , time(time)
152  {
153  }
154 };
155 
156 void archive(int fd, std::list<file_entry_t> const *filelist);
157 void archive(char const *zipfile, std::list<file_entry_t> const *filelist);
158 
159 } // namespace zip
160 
161 #endif
Definition: zipinternal.h:88
bool attach(char const *begin, char const *end)
Definition: zipextract.cpp:59
char const * end
Definition: zipinternal.h:92
static bool inflate(char *zptr, size_t zlen, std::vector< char > *out)
Definition: zipextract.cpp:18
std::list< Item > _items
Definition: zipinternal.h:94
struct zip::ZipInternal::@17 data
char const * begin
Definition: zipinternal.h:91
~ZipInternal()
Definition: zipinternal.h:100
std::list< Item > const * get_item_list() const
Definition: zipinternal.h:108
bool extract_file(zip_file_header_t const *cd, std::vector< char > *out, zip_local_file_header_t *header=0)
Definition: zipextract.cpp:116
void close()
Definition: zipextract.cpp:111
size_t size() const
Definition: zipinternal.h:112
ZipInternal()=default
Definition: zip.cpp:21
void archive(int fd, std::list< file_entry_t > const *filelist)
Definition: ziparchive.cpp:53
uint16_t msdos_date_format(int year, int month, int day)
Definition: zipinternal.h:68
uint16_t msdos_time_format(int hour, int minute, int second)
Definition: zipinternal.h:73
Definition: zipinternal.h:79
bool isdir() const
Definition: zipinternal.h:82
std::string name
Definition: zipinternal.h:80
zip_file_header_t cd
Definition: zipinternal.h:81
Definition: zipinternal.h:60
std::string message
Definition: zipinternal.h:61
failed_t(std::string const &message)
Definition: zipinternal.h:62
Definition: zipinternal.h:119
file_entry_t(std::string const &dst, std::string const &src, time_t time=-1)
Definition: zipinternal.h:147
std::vector< unsigned char > data
Definition: zipinternal.h:125
time_t time
Definition: zipinternal.h:128
Kind
Definition: zipinternal.h:120
@ Data
Definition: zipinternal.h:121
@ File
Definition: zipinternal.h:122
std::string src
Definition: zipinternal.h:126
file_entry_t(std::string const &dst, unsigned char const *begin, unsigned char const *end, time_t time=-1)
Definition: zipinternal.h:133
Kind kind
Definition: zipinternal.h:124
std::string dst
Definition: zipinternal.h:127
file_entry_t(std::string const &dst, std::vector< unsigned char > const *vec, time_t time=-1)
Definition: zipinternal.h:140
file_entry_t()
Definition: zipinternal.h:129
Definition: zipinternal.h:47
uint16_t number_of_the_disk_with_the_start_of_the_central_directory
Definition: zipinternal.h:50
uint16_t comment_length
Definition: zipinternal.h:55
uint16_t total_number_of_entries_in_the_central_directory
Definition: zipinternal.h:52
uint32_t end_of_central_dir_signature
Definition: zipinternal.h:48
uint16_t number_of_this_disk
Definition: zipinternal.h:49
uint32_t offset_of_start_of_central_directory_with_respect_to_the_starting_disk_number
Definition: zipinternal.h:54
uint16_t total_number_of_entries_in_the_central_directory_on_this_disk
Definition: zipinternal.h:51
uint32_t size_of_the_central_directory
Definition: zipinternal.h:53
Definition: zipinternal.h:27
uint32_t central_file_header_signature
Definition: zipinternal.h:28
uint16_t file_name_length
Definition: zipinternal.h:38
uint16_t disk_number_start
Definition: zipinternal.h:41
uint16_t version_needed_to_extract
Definition: zipinternal.h:30
uint32_t crc_32
Definition: zipinternal.h:35
uint16_t compression_method
Definition: zipinternal.h:32
uint32_t external_file_attributes
Definition: zipinternal.h:43
uint16_t last_mod_file_date
Definition: zipinternal.h:34
uint16_t general_purpose_bit_flag
Definition: zipinternal.h:31
uint32_t relative_offset_of_local_header
Definition: zipinternal.h:44
uint16_t last_mod_file_time
Definition: zipinternal.h:33
uint16_t extra_field_length
Definition: zipinternal.h:39
uint32_t compressed_size
Definition: zipinternal.h:36
uint16_t file_comment_length
Definition: zipinternal.h:40
uint32_t uncompressed_size
Definition: zipinternal.h:37
uint16_t version_made_by
Definition: zipinternal.h:29
uint16_t internal_file_attributes
Definition: zipinternal.h:42
Definition: zipinternal.h:13
uint16_t version_needed_to_extract
Definition: zipinternal.h:15
uint16_t extra_field_length
Definition: zipinternal.h:24
uint16_t last_mod_file_date
Definition: zipinternal.h:19
uint16_t last_mod_file_time
Definition: zipinternal.h:18
uint16_t general_purpose_bit_flag
Definition: zipinternal.h:16
uint32_t compressed_size
Definition: zipinternal.h:21
uint32_t local_file_header_signature
Definition: zipinternal.h:14
uint16_t file_name_length
Definition: zipinternal.h:23
uint32_t crc_32
Definition: zipinternal.h:20
uint16_t compression_method
Definition: zipinternal.h:17
uint32_t uncompressed_size
Definition: zipinternal.h:22