1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: interface of wxZipNotifier
4 // Author: wxWidgets team
6 // Licence: wxWindows licence
7 /////////////////////////////////////////////////////////////////////////////
11 /// Compression Method, only 0 (store) and 8 (deflate) are supported here
21 wxZIP_METHOD_TOKENIZE
,
23 wxZIP_METHOD_DEFLATE64
,
24 wxZIP_METHOD_BZIP2
= 12,
25 wxZIP_METHOD_DEFAULT
= 0xffff
28 /// Originating File-System.
30 /// These are Pkware's values. Note that Info-zip disagree on some of them,
31 /// most notably NTFS.
39 wxZIP_SYSTEM_ATARI_ST
,
40 wxZIP_SYSTEM_OS2_HPFS
,
41 wxZIP_SYSTEM_MACINTOSH
,
42 wxZIP_SYSTEM_Z_SYSTEM
,
44 wxZIP_SYSTEM_WINDOWS_NTFS
,
47 wxZIP_SYSTEM_ACORN_RISC
,
49 wxZIP_SYSTEM_ALTERNATE_MVS
,
55 /// Dos/Win file attributes
58 wxZIP_A_RDONLY
= 0x01,
59 wxZIP_A_HIDDEN
= 0x02,
60 wxZIP_A_SYSTEM
= 0x04,
61 wxZIP_A_SUBDIR
= 0x10,
67 /// Values for the flags field in the zip headers
70 wxZIP_ENCRYPTED
= 0x0001,
71 wxZIP_DEFLATE_NORMAL
= 0x0000, // normal compression
72 wxZIP_DEFLATE_EXTRA
= 0x0002, // extra compression
73 wxZIP_DEFLATE_FAST
= 0x0004, // fast compression
74 wxZIP_DEFLATE_SUPERFAST
= 0x0006, // superfast compression
75 wxZIP_DEFLATE_MASK
= 0x0006,
76 wxZIP_SUMS_FOLLOW
= 0x0008, // crc and sizes come after the data
77 wxZIP_ENHANCED
= 0x0010,
79 wxZIP_STRONG_ENC
= 0x0040,
80 wxZIP_UNUSED
= 0x0F80,
81 wxZIP_RESERVED
= 0xF000
88 If you need to know when a wxZipInputStream updates a wxZipEntry,
89 you can create a notifier by deriving from this abstract base class,
90 overriding wxZipNotifier::OnEntryUpdated().
92 An instance of your notifier class can then be assigned to wxZipEntry
93 objects, using wxZipEntry::SetNotifier().
95 Setting a notifier is not usually necessary. It is used to handle
96 certain cases when modifying an zip in a pipeline (i.e. between
97 non-seekable streams).
98 See @ref overview_archive_noseek.
101 @category{archive,streams}
103 @see @ref overview_archive_noseek, wxZipEntry, wxZipInputStream, wxZipOutputStream
109 Override this to receive notifications when an wxZipEntry object changes.
111 virtual void OnEntryUpdated(wxZipEntry
& entry
) = 0;
119 Holds the meta-data for an entry in a zip.
121 @section zipentry_avail Field availability
123 When reading a zip from a stream that is seekable, wxZipEntry::GetNextEntry()
124 returns a fully populated wxZipEntry object except for wxZipEntry::GetLocalExtra().
125 wxZipEntry::GetLocalExtra() becomes available when the entry is opened, either by
126 calling wxZipInputStream::OpenEntry() or by making an attempt to read the entry's data.
128 For zips on non-seekable streams, the following fields are always available
129 when wxZipEntry::GetNextEntry() returns:
130 - wxZipEntry::GetDateTime
131 - wxZipEntry::GetInternalFormat
132 - wxZipEntry::GetInternalName
133 - wxZipEntry::GetFlags
134 - wxZipEntry::GetLocalExtra
135 - wxZipEntry::GetMethod
136 - wxZipEntry::GetName
137 - wxZipEntry::GetOffset
140 The following fields are also usually available when GetNextEntry() returns,
141 however, if the zip was also written to a non-seekable stream the zipper is
142 permitted to store them after the entry's data. In that case they become
143 available when the entry's data has been read to Eof(), or CloseEntry()
144 has been called. (GetFlags() & wxZIP_SUMS_FOLLOW) != 0 indicates that
145 one or more of these come after the data:
146 - wxZipEntry::GetCompressedSize
148 - wxZipEntry::GetSize
150 The following are stored at the end of the zip, and become available when the
151 end of the zip has been reached, i.e. after GetNextEntry() returns @NULL
153 - wxZipEntry::GetComment
154 - wxZipEntry::GetExternalAttributes
155 - wxZipEntry::GetExtra
156 - wxZipEntry::GetMode
157 - wxZipEntry::GetSystemMadeBy
158 - wxZipEntry::IsReadOnly
159 - wxZipEntry::IsMadeByUnix
163 @category{archive,streams}
165 @see @ref overview_archive, wxZipInputStream, wxZipOutputStream, wxZipNotifier
167 class wxZipEntry
: public wxArchiveEntry
170 wxZipEntry(const wxString
& name
= wxEmptyString
,
171 const wxDateTime
& dt
= Now(),
172 wxFileOffset size
= wxInvalidOffset
);
177 wxZipEntry(const wxZipEntry
& entry
);
180 Make a copy of this entry.
182 wxZipEntry
* Clone() const;
186 Gets and sets the short comment for this entry.
188 wxString
GetComment() const;
189 void SetComment(const wxString
& comment
);
194 The low 8 bits are always the DOS/Windows file attributes for this entry.
195 The values of these attributes are given in the enumeration ::wxZipAttributes.
197 The remaining bits can store platform specific permission bits or
198 attributes, and their meaning depends on the value of SetSystemMadeBy().
199 If IsMadeByUnix() is @true then the high 16 bits are unix mode bits.
201 The following other accessors access these bits:
202 - IsReadOnly() / SetIsReadOnly()
203 - IsDir() / SetIsDir()
204 - GetMode() / SetMode()
206 wxUint32
GetExternalAttributes() const;
207 void SetExternalAttributes(wxUint32 attr
);
212 The extra field from the entry's central directory record.
214 The extra field is used to store platform or application specific
215 data. See Pkware's document 'appnote.txt' for information on its format.
217 const char* GetExtra() const;
218 size_t GetExtraLen() const;
219 void SetExtra(const char* extra
, size_t len
);
224 The extra field from the entry's local record.
226 The extra field is used to store platform or application specific
227 data. See Pkware's document 'appnote.txt' for information on its format.
229 const char* GetLocalExtra() const;
230 size_t GetLocalExtraLen() const;
231 void SetLocalExtra(const char* extra
, size_t len
);
236 The compression method.
237 The enumeration ::wxZipMethod lists the possible values.
239 The default constructor sets this to @c wxZIP_METHOD_DEFAULT,
240 which allows wxZipOutputStream to choose the method when writing the entry.
242 int GetMethod() const;
243 void SetMethod(int method
);
248 If IsMadeByUnix() is true then returns the unix permission bits stored
249 in GetExternalAttributes(). Otherwise synthesises them from the DOS attributes.
254 Sets the DOS attributes in GetExternalAttributes() to be consistent with
257 If IsMadeByUnix() is @true then also stores @a mode in GetExternalAttributes().
258 Note that the default constructor sets GetSystemMadeBy() to
259 @c wxZIP_SYSTEM_MSDOS by default. So to be able to store unix
260 permissions when creating zips, call SetSystemMadeBy(wxZIP_SYSTEM_UNIX).
262 void SetMode(int mode
);
267 The originating file-system.
269 The default constructor sets this to @c wxZIP_SYSTEM_MSDOS.
270 Set it to @c wxZIP_SYSTEM_UNIX in order to be able to store unix
271 permissions using SetMode().
273 int GetSystemMadeBy() const;
274 void SetSystemMadeBy(int system
);
278 The compressed size of this entry in bytes.
280 wxFileOffset
GetCompressedSize() const;
283 CRC32 for this entry's data.
285 wxUint32
GetCrc() const;
288 Returns a combination of the bits flags in the enumeration @c wxZipFlags.
290 int GetFlags() const;
294 A static member that translates a filename into the internal format used
295 within the archive. If the third parameter is provided, the bool pointed
296 to is set to indicate whether the name looks like a directory name
297 (i.e. has a trailing path separator).
299 @see @ref overview_archive_byname
301 wxString
GetInternalName(const wxString
& name
,
302 wxPathFormat format
= wxPATH_NATIVE
,
303 bool* pIsDir
= NULL
);
305 Returns the entry's filename in the internal format used within the archive.
306 The name can include directory components, i.e. it can be a full path.
308 The names of directory entries are returned without any trailing path separator.
309 This gives a canonical name that can be used in comparisons.
311 wxString
GetInternalName() const;
315 Returns @true if GetSystemMadeBy() is a flavour of unix.
317 bool IsMadeByUnix() const;
321 Indicates that this entry's data is text in an 8-bit encoding.
324 void SetIsText(bool isText
= true);
329 Sets the notifier (see wxZipNotifier) for this entry.
330 Whenever the wxZipInputStream updates this entry, it will then invoke
331 the associated notifier's wxZipNotifier::OnEntryUpdated() method.
333 Setting a notifier is not usually necessary. It is used to handle
334 certain cases when modifying an zip in a pipeline (i.e. between
335 non-seekable streams).
337 @see @ref overview_archive_noseek, wxZipNotifier
339 void SetNotifier(wxZipNotifier
& notifier
);
340 void UnsetNotifier();
346 wxZipEntry
& operator=(const wxZipEntry
& entry
);
351 @class wxZipInputStream
353 Input stream for reading zip files.
355 wxZipInputStream::GetNextEntry() returns a wxZipEntry object containing the
356 meta-data for the next entry in the zip (and gives away ownership).
357 Reading from the wxZipInputStream then returns the entry's data.
358 Eof() becomes @true after an attempt has been made to read past the end of
360 When there are no more entries, GetNextEntry() returns @NULL and sets Eof().
362 Note that in general zip entries are not seekable, and
363 wxZipInputStream::SeekI() always returns ::wxInvalidOffset.
366 @category{archive,streams}
368 @see @ref overview_archive, wxZipEntry, wxZipOutputStream
370 class wxZipInputStream
: public wxArchiveInputStream
376 Constructor. In a Unicode build the second parameter @a conv is used to
377 translate the filename and comment fields into Unicode.
378 It has no effect on the stream's data.
379 If the parent stream is passed as a pointer then the new filter stream
380 takes ownership of it. If it is passed by reference then it does not.
382 wxZipInputStream(wxInputStream
& stream
,
383 wxMBConv
& conv
= wxConvLocal
);
384 wxZipInputStream(wxInputStream
* stream
,
385 wxMBConv
& conv
= wxConvLocal
);
390 Compatibility constructor (requires WXWIN_COMPATIBILITY_2_6).
391 When this constructor is used, an emulation of seeking is
392 switched on for compatibility with previous versions. Note however,
393 that it is deprecated.
395 wxZipInputStream(const wxString
& archive
,
396 const wxString
& file
);
399 Closes the current entry.
400 On a non-seekable stream reads to the end of the current entry first.
405 Returns the zip comment.
407 This is stored at the end of the zip, therefore when reading a zip
408 from a non-seekable stream, it returns the empty string until the end
409 of the zip has been reached, i.e. when GetNextEntry() returns @NULL.
411 wxString
GetComment();
414 Closes the current entry if one is open, then reads the meta-data for
415 the next entry and returns it in a wxZipEntry object, giving away ownership.
416 The stream is then open and can be read.
418 wxZipEntry
* GetNextEntry();
421 For a zip on a seekable stream returns the total number of entries in
422 the zip. For zips on non-seekable streams returns the number of entries
423 returned so far by GetNextEntry().
425 int GetTotalEntries();
428 Closes the current entry if one is open, then opens the entry specified
429 by the @a entry object.
431 @a entry should be from the same zip file, and the zip should
432 be on a seekable stream.
434 @see overview_archive_byname
436 bool OpenEntry(wxZipEntry
& entry
);
442 @class wxZipClassFactory
444 Class factory for the zip archive format.
445 See the base class for details.
448 @category{archive,streams}
450 @see @ref overview_archive,
451 @ref overview_archive_generic,
452 wxZipEntry, wxZipInputStream, wxZipOutputStream
454 class wxZipClassFactory
: public wxArchiveClassFactory
463 @class wxZipOutputStream
465 Output stream for writing zip files.
467 wxZipOutputStream::PutNextEntry() is used to create a new entry in the
468 output zip, then the entry's data is written to the wxZipOutputStream.
469 Another call to wxZipOutputStream::PutNextEntry() closes the current
470 entry and begins the next.
473 @category{archive,streams}
475 @see @ref overview_archive, wxZipEntry, wxZipInputStream
477 class wxZipOutputStream
: public wxArchiveOutputStream
484 @a level is the compression level to use.
485 It can be a value between 0 and 9 or -1 to use the default value
486 which currently is equivalent to 6.
488 If the parent stream is passed as a pointer then the new filter stream
489 takes ownership of it. If it is passed by reference then it does not.
490 In a Unicode build the third parameter @a conv is used to translate
491 the filename and comment fields to an 8-bit encoding.
492 It has no effect on the stream's data.
494 wxZipOutputStream(wxOutputStream
& stream
, int level
= -1,
495 wxMBConv
& conv
= wxConvLocal
);
496 wxZipOutputStream(wxOutputStream
* stream
, int level
= -1,
497 wxMBConv
& conv
= wxConvLocal
);
501 The destructor calls Close() to finish writing the zip if it has
502 not been called already.
504 virtual ~wxZipOutputStream();
507 Finishes writing the zip, returning @true if successful.
508 Called by the destructor if not called explicitly.
513 Close the current entry.
514 It is called implicitly whenever another new entry is created with CopyEntry()
515 or PutNextEntry(), or when the zip is closed.
520 Transfers the zip comment from the wxZipInputStream
521 to this output stream.
523 bool CopyArchiveMetaData(wxZipInputStream
& inputStream
);
526 Takes ownership of @a entry and uses it to create a new entry
527 in the zip. @a entry is then opened in @a inputStream and its contents
528 copied to this stream.
530 CopyEntry() is much more efficient than transferring the data using
531 Read() and Write() since it will copy them without decompressing and
534 For zips on seekable streams, @a entry must be from the same zip file
535 as @a inputStream. For non-seekable streams, @a entry must also be the
536 last thing read from @a inputStream.
538 bool CopyEntry(wxZipEntry
* entry
, wxZipInputStream
& inputStream
);
542 Set the compression level that will be used the next time an entry is
545 It can be a value between 0 and 9 or -1 to use the default value
546 which currently is equivalent to 6.
548 int GetLevel() const;
549 void SetLevel(int level
);
553 Create a new directory entry (see wxArchiveEntry::IsDir) with the given
556 PutNextEntry() can also be used to create directory entries, by supplying
557 a name with a trailing path separator.
559 bool PutNextDirEntry(const wxString
& name
,
560 const wxDateTime
& dt
= wxDateTime::Now());
564 Takes ownership of @a entry and uses it to create a new entry in the zip.
566 bool PutNextEntry(wxZipEntry
* entry
);
569 Create a new entry with the given name, timestamp and size.
571 bool PutNextEntry(const wxString
& name
,
572 const wxDateTime
& dt
= wxDateTime::Now(),
573 wxFileOffset size
= wxInvalidOffset
);
577 Sets a comment for the zip as a whole.
578 It is written at the end of the zip.
580 void SetComment(const wxString
& comment
);