LibPkg
zipfile.h
Go to the documentation of this file.
1 // This file is part of LibPkg.
2 // Copyright © 2003-2005 Graham Shaw.
3 // Distribution and use are subject to the GNU Lesser General Public License,
4 // a copy of which may be found in the file !LibPkg.Copyright.
5 
6 #ifndef LIBPKG_ZIPFILE
7 #define LIBPKG_ZIPFILE
8 
9 #include <vector>
10 #include <map>
11 #include <string>
12 #include <fstream>
13 #include <stdexcept>
14 
15 namespace pkg {
16 
17 using std::string;
18 
20 class zipfile
21 {
22 public:
23  class file_info;
24  class extra_info;
25  class riscos_info;
26 
28  typedef unsigned short uint16;
29 
31  typedef unsigned long uint32;
32 
33  class not_found;
35  class zlib_error;
36 private:
38  string _pathname;
39 
41  mutable std::fstream _zfs;
42 
46  std::vector<file_info*> _directory;
47 public:
51  zipfile(const string& pathname);
52 private:
57  zipfile(const zipfile&);
58 public:
60  ~zipfile();
61 private:
66  zipfile& operator=(const zipfile&);
67 public:
71  unsigned int size() const;
72 
77  const file_info& operator[](unsigned int index) const;
78 
84  const file_info* find(const string& pathname) const;
85 
91  void extract(const string& src_pathname,const string& dst_pathname) const;
92 };
93 
96 {
97 private:
99  uint32 _offset;
100 
102  uint16 _xversion;
103 
105  uint16 _gpbits;
106 
108  uint16 _method;
109 
111  uint16 _modtime;
112 
114  uint16 _moddate;
115 
117  uint32 _crc32;
118 
120  uint32 _csize;
121 
123  uint32 _usize;
124 
126  string _pathname;
127 
129  std::map<uint16,extra_info*> _extra;
130 public:
132  file_info();
133 
137  file_info(std::istream& in);
138 
142  file_info(const file_info&);
143 
145  ~file_info();
146 
150  file_info& operator=(const file_info&);
151 
155  uint32 offset() const
156  { return _offset; }
157 
161  uint16 method() const
162  { return _method; }
163 
167  uint32 csize() const
168  { return _csize; }
169 
173  uint32 usize() const
174  { return _usize; }
175 
181  const string& pathname() const
182  { return _pathname; }
183 
187  template<class extra_type>
188  extra_type* create_extra();
189 
193  template<class extra_type>
194  const extra_type* find_extra() const;
195 private:
199  void read(std::istream& in);
200 
205  void read_extra(std::istream& in,int length);
206 };
207 
210 {
211 public:
213  extra_info();
214 
216  virtual ~extra_info();
217 };
218 
221  public zipfile::extra_info
222 {
223 private:
225  uint32 _sig;
226 
228  uint32 _loadaddr;
229 
231  uint32 _execaddr;
232 
234  uint32 _attr;
235 public:
237  riscos_info();
238 
242  riscos_info(std::istream& in);
243 
245  virtual ~riscos_info();
246 
251  bool valid() const
252  { return _sig==0x30435241; }
253 
257  uint32 loadaddr() const
258  { return _loadaddr; }
259 
263  uint32 execaddr() const
264  { return _execaddr; }
265 
269  uint32 attr() const
270  { return _attr; }
271 private:
275  void read(std::istream& in);
276 public:
281  static uint16 tag()
282  { return 0x4341; }
283 };
284 
285 template<class extra_type>
287 {
288  extra_info*& einfo=_extra[extra_type::tag()];
289  if (!einfo) einfo=new extra_type();
290  return dynamic_cast<extra_type*>(einfo);
291 }
292 
293 template<class extra_type>
294 const extra_type* zipfile::file_info::find_extra() const
295 {
296  std::map<uint16,extra_info*>::const_iterator f=
297  _extra.find(extra_type::tag());
298  return (f!=_extra.end())?dynamic_cast<const extra_type*>(f->second):0;
299 }
300 
303  public std::runtime_error
304 {
305 public:
309  not_found(const string& pathname);
310 };
311 
314  public std::runtime_error
315 {
316 public:
320  unsupported_compression_method(unsigned int method);
321 };
322 
325  public std::runtime_error
326 {
327 public:
331  zlib_error(int code);
332 
337  static const char* make_message(int code);
338 };
339 
340 }; /* namespace pkg */
341 
342 #endif
static uint16 tag()
Get tag.
Definition: zipfile.h:281
const string & pathname() const
Get pathname.
Definition: zipfile.h:181
An exception class for reporting not found errors.
Definition: zipfile.h:302
extra_type * create_extra()
Create extra information record.
Definition: zipfile.h:286
zipfile(const string &pathname)
Construct zip file object.
Definition: zipfile.cc:89
unsigned long uint32
A type to represent an unsigned 32-bit integer.
Definition: zipfile.h:31
A class to represent a file information record from a zip file.
Definition: zipfile.h:95
void extract(const string &src_pathname, const string &dst_pathname) const
Extract file from zip file.
Definition: zipfile.cc:138
virtual ~extra_info()
Destroy extra information record.
Definition: zipfile.cc:322
A base class to represent an extra information record from a zip file.
Definition: zipfile.h:209
~zipfile()
Destroy zip file object.
Definition: zipfile.cc:111
uint32 csize() const
Get compressed file size.
Definition: zipfile.h:167
unsigned short uint16
A type to represent an unsigned 16-bit integer.
Definition: zipfile.h:25
bool valid() const
Determine whether extra information record is valid.
Definition: zipfile.h:251
unsigned int size() const
Get number of file information records.
Definition: zipfile.cc:133
extra_info()
Construct extra information record.
Definition: zipfile.cc:319
An exception class for reporting errors in zlib.
Definition: zipfile.h:324
uint32 loadaddr() const
Get RISC OS load address.
Definition: zipfile.h:257
uint32 attr() const
Get RISC OS attributes.
Definition: zipfile.h:269
~file_info()
Destroy file information record.
Definition: zipfile.cc:268
uint32 execaddr() const
Get RISC OS execution address.
Definition: zipfile.h:263
A class to represent a RISC OS extra information record from a zip file.
Definition: zipfile.h:220
file_info & operator=(const file_info &)
Assign file information record.
const file_info * find(const string &pathname) const
Find const file information record for pathname.
Definition: zipfile.cc:126
const char * dst_pathname
Definition: path_table.cc:20
riscos_info()
Construct RISC OS extra information record.
Definition: zipfile.cc:325
const extra_type * find_extra() const
Find extra information record.
Definition: zipfile.h:294
uint16 method() const
Get compression method.
Definition: zipfile.h:161
virtual ~riscos_info()
Destroy RISC OS extra information record.
Definition: zipfile.cc:337
file_info()
Construct file information record.
Definition: zipfile.cc:251
const char * src_pathname
Definition: path_table.cc:19
An exception class for reporting unsupported compression method errors.
Definition: zipfile.h:313
uint32 offset() const
Get offset to file data.
Definition: zipfile.h:155
An interface class to represent a zip file.
Definition: zipfile.h:20
const file_info & operator[](unsigned int index) const
Get const file information record at index.
Definition: zipfile.cc:121
uint32 usize() const
Get uncompressed file size.
Definition: zipfile.h:173

Reference Manual LibPkg Version 0.6.1 (28 Jan 2015)