1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: interface of wxArchive* classes
4 // Author: wxWidgets team
5 // Licence: wxWindows licence
6 /////////////////////////////////////////////////////////////////////////////
9 @class wxArchiveInputStream
11 This is an abstract base class which serves as a common interface to
12 archive input streams such as wxZipInputStream.
14 wxArchiveInputStream::GetNextEntry returns an wxArchiveEntry object containing
15 the meta-data for the next entry in the archive (and gives away ownership).
17 Reading from the wxArchiveInputStream then returns the entry's data. Eof()
18 becomes @true after an attempt has been made to read past the end of the
21 When there are no more entries, GetNextEntry() returns @NULL and sets Eof().
24 @category{archive,streams}
26 @see @ref overview_archive, wxArchiveEntry, wxArchiveOutputStream
28 class wxArchiveInputStream
: public wxFilterInputStream
32 Closes the current entry. On a non-seekable stream reads to the end of
33 the current entry first.
35 virtual bool CloseEntry() = 0;
38 Closes the current entry if one is open, then reads the meta-data for
39 the next entry and returns it in a wxArchiveEntry object, giving away
40 ownership. Reading this wxArchiveInputStream then returns the entry's data.
42 wxArchiveEntry
* GetNextEntry();
45 Closes the current entry if one is open, then opens the entry specified
46 by the wxArchiveEntry object.
48 @a entry must be from the same archive file that this wxArchiveInputStream
49 is reading, and it must be reading it from a seekable stream.
51 virtual bool OpenEntry(wxArchiveEntry
& entry
) = 0;
57 @class wxArchiveOutputStream
59 This is an abstract base class which serves as a common interface to
60 archive output streams such as wxZipOutputStream.
62 wxArchiveOutputStream::PutNextEntry is used to create a new entry in the
63 output archive, then the entry's data is written to the wxArchiveOutputStream.
64 Another call to PutNextEntry() closes the current entry and begins the next.
67 @category{archive,streams}
69 @see @ref overview_archive, wxArchiveEntry, wxArchiveInputStream
71 class wxArchiveOutputStream
: public wxFilterOutputStream
75 Calls Close() if it has not already been called.
77 virtual ~wxArchiveOutputStream();
80 Closes the archive, returning @true if it was successfully written.
81 Called by the destructor if not called explicitly.
83 @see wxOutputStream::Close()
88 Close the current entry.
89 It is called implicitly whenever another new entry is created with CopyEntry()
90 or PutNextEntry(), or when the archive is closed.
92 virtual bool CloseEntry() = 0;
95 Some archive formats have additional meta-data that applies to the archive
97 For example in the case of zip there is a comment, which is stored at the end
98 of the zip file. CopyArchiveMetaData() can be used to transfer such information
99 when writing a modified copy of an archive.
101 Since the position of the meta-data can vary between the various archive
102 formats, it is best to call CopyArchiveMetaData() before transferring
103 the entries. The wxArchiveOutputStream will then hold on to the meta-data
104 and write it at the correct point in the output file.
106 When the input archive is being read from a non-seekable stream, the
107 meta-data may not be available when CopyArchiveMetaData() is called,
108 in which case the two streams set up a link and transfer the data
109 when it becomes available.
111 virtual bool CopyArchiveMetaData(wxArchiveInputStream
& stream
) = 0;
114 Takes ownership of @a entry and uses it to create a new entry in the
115 archive. @a entry is then opened in the input stream @a stream
116 and its contents copied to this stream.
118 For archive types which compress entry data, CopyEntry() is likely to be
119 much more efficient than transferring the data using Read() and Write()
120 since it will copy them without decompressing and recompressing them.
122 @a entry must be from the same archive file that @a stream is
123 accessing. For non-seekable streams, @a entry must also be the last
124 thing read from @a stream.
126 virtual bool CopyEntry(wxArchiveEntry
* entry
,
127 wxArchiveInputStream
& stream
) = 0;
130 Create a new directory entry (see wxArchiveEntry::IsDir) with the given
133 PutNextEntry() can also be used to create directory entries, by supplying
134 a name with a trailing path separator.
136 virtual bool PutNextDirEntry(const wxString
& name
,
137 const wxDateTime
& dt
= wxDateTime::Now()) = 0;
140 Takes ownership of entry and uses it to create a new entry in the archive.
141 The entry's data can then be written by writing to this wxArchiveOutputStream.
143 virtual bool PutNextEntry(wxArchiveEntry
* entry
) = 0;
146 Create a new entry with the given name, timestamp and size. The entry's
147 data can then be written by writing to this wxArchiveOutputStream.
149 virtual bool PutNextEntry(const wxString
& name
,
150 const wxDateTime
& dt
= wxDateTime::Now(),
151 wxFileOffset size
= wxInvalidOffset
) = 0;
157 @class wxArchiveEntry
159 This is an abstract base class which serves as a common interface to
160 archive entry classes such as wxZipEntry.
161 These hold the meta-data (filename, timestamp, etc.), for entries
162 in archive files such as zips and tars.
164 @section archiveentry_nonseekable About non-seekable streams
166 This information applies only when reading archives from non-seekable streams.
167 When the stream is seekable GetNextEntry() returns a fully populated wxArchiveEntry.
168 See @ref overview_archive_noseek for more information.
170 For generic programming, when the worst case must be assumed, you can rely on
171 all the fields of wxArchiveEntry being fully populated when
172 wxArchiveInputStream::GetNextEntry() returns, with the following exceptions:
174 @li GetSize(): guaranteed to be available after the entry has been read to Eof(),
175 or CloseEntry() has been called;
176 @li IsReadOnly(): guaranteed to be available after the end of the archive has
177 been reached, i.e. after GetNextEntry() returns NULL and Eof() is true.
180 @category{archive,streams}
182 @see @ref overview_archive, @ref overview_archive_generic,
183 wxArchiveInputStream, wxArchiveOutputStream, wxArchiveNotifier
185 class wxArchiveEntry
: public wxObject
189 Returns a copy of this entry object.
191 wxArchiveEntry
* Clone() const;
194 Gets the entry's timestamp.
196 virtual wxDateTime
GetDateTime() const = 0;
199 Sets the entry's timestamp.
201 virtual void SetDateTime(const wxDateTime
& dt
) = 0;
204 Returns the entry's name, by default in the native format.
205 The name can include directory components, i.e. it can be a full path.
207 If this is a directory entry, (i.e. if IsDir() is @true) then the
208 returned string is the name with a trailing path separator.
210 virtual wxString
GetName(wxPathFormat format
= wxPATH_NATIVE
) const = 0;
213 Sets the entry's name.
214 Setting a name with a trailing path separator sets IsDir().
218 virtual void SetName(const wxString
& name
,
219 wxPathFormat format
= wxPATH_NATIVE
) = 0;
222 Returns the size of the entry's data in bytes.
224 virtual wxFileOffset
GetSize() const = 0;
227 Sets the size of the entry's data in bytes.
229 virtual void SetSize(wxFileOffset size
) = 0;
232 Returns the path format used internally within the archive to store
235 virtual wxPathFormat
GetInternalFormat() const = 0;
238 Returns the entry's filename in the internal format used within the
239 archive. The name can include directory components, i.e. it can be a
242 The names of directory entries are returned without any trailing path
243 separator. This gives a canonical name that can be used in comparisons.
245 @see @ref overview_archive_byname
247 virtual wxString
GetInternalName() const = 0;
250 Returns a numeric value unique to the entry within the archive.
252 virtual wxFileOffset
GetOffset() const = 0;
255 Returns @true if this is a directory entry.
257 Directory entries are entries with no data, which are used to store
258 the meta-data of directories. They also make it possible for completely
259 empty directories to be stored.
262 The names of entries within an archive can be complete paths, and
263 unarchivers typically create whatever directories are necessary as they
264 restore files, even if the archive contains no explicit directory entries.
266 virtual bool IsDir() const = 0;
269 Marks this entry as a directory if @a isDir is @true. See IsDir() for more info.
271 virtual void SetIsDir(bool isDir
= true) = 0;
274 Returns @true if the entry is a read-only file.
276 virtual bool IsReadOnly() const = 0;
279 Sets this entry as a read-only file.
281 virtual void SetIsReadOnly(bool isReadOnly
= true) = 0;
284 Sets the notifier (see wxArchiveNotifier) for this entry.
286 Whenever the wxArchiveInputStream updates this entry, it will then invoke
287 the associated notifier's wxArchiveNotifier::OnEntryUpdated method.
289 Setting a notifier is not usually necessary. It is used to handle
290 certain cases when modifying an archive in a pipeline (i.e. between
291 non-seekable streams).
293 void SetNotifier(wxArchiveNotifier
& notifier
);
296 Unsets the notifier eventually attached to this entry.
298 virtual void UnsetNotifier();
304 @class wxArchiveClassFactory
306 Allows the creation of streams to handle archive formats such as zip and tar.
308 For example, given a filename you can search for a factory that will
309 handle it and create a stream to read it:
312 factory = wxArchiveClassFactory::Find(filename, wxSTREAM_FILEEXT);
314 stream = factory->NewStream(new wxFFileInputStream(filename));
317 wxArchiveClassFactory::Find can also search for a factory by MIME type
318 or wxFileSystem protocol.
320 The available factories can be enumerated using
321 wxArchiveClassFactory::GetFirst() and wxArchiveClassFactory::GetNext().
324 @category{archive,streams}
326 @see @ref overview_archive, @ref overview_archive_generic, wxArchiveEntry,
327 wxArchiveInputStream, wxArchiveOutputStream, wxFilterClassFactory
329 class wxArchiveClassFactory
: public wxObject
333 Returns @true if this factory can handle the given protocol, MIME type
336 When using wxSTREAM_FILEEXT for the second parameter, the first parameter
337 can be a complete filename rather than just an extension.
339 bool CanHandle(const wxString
& protocol
,
340 wxStreamProtocolType type
= wxSTREAM_PROTOCOL
) const;
343 A static member that finds a factory that can handle a given protocol, MIME
344 type or file extension. Returns a pointer to the class factory if found, or
345 @NULL otherwise. It does not give away ownership of the factory.
347 When using wxSTREAM_FILEEXT for the second parameter, the first parameter
348 can be a complete filename rather than just an extension.
350 static const wxArchiveClassFactory
* Find(const wxString
& protocol
,
351 wxStreamProtocolType type
= wxSTREAM_PROTOCOL
);
354 Returns the wxMBConv object that the created streams will use when
355 translating meta-data. The initial default, set by the constructor,
358 wxMBConv
& GetConv() const;
361 Sets the wxMBConv object that the created streams will use when
362 translating meta-data.
364 void SetConv(wxMBConv
& conv
);
368 GetFirst and GetNext can be used to enumerate the available factories.
369 For example, to list them:
373 const wxArchiveClassFactory *factory = wxArchiveClassFactory::GetFirst();
376 list << factory->GetProtocol() << wxT("\n");
377 factory = factory->GetNext();
381 GetFirst() and GetNext() return a pointer to a factory or @NULL if no more
382 are available. They do not give away ownership of the factory.
384 static const wxArchiveClassFactory
* GetFirst();
385 const wxArchiveClassFactory
* GetNext() const;
389 Calls the static GetInternalName() function for the archive entry type,
390 for example wxZipEntry::GetInternalName.
392 virtual wxString
GetInternalName(const wxString
& name
,
393 wxPathFormat format
= wxPATH_NATIVE
) const = 0;
396 Returns the wxFileSystem protocol supported by this factory.
397 Equivalent to @code wxString(*GetProtocols()) @endcode.
399 wxString
GetProtocol() const;
402 Returns the protocols, MIME types or file extensions supported by this
403 factory, as an array of null terminated strings.
405 It does not give away ownership of the array or strings.
406 For example, to list the file extensions a factory supports:
410 const wxChar *const *p;
412 for (p = factory->GetProtocols(wxSTREAM_FILEEXT); *p; p++)
413 list << *p << wxT("\n");
416 virtual const wxChar
** GetProtocols(wxStreamProtocolType type
= wxSTREAM_PROTOCOL
) const = 0;
419 Create a new wxArchiveEntry object of the appropriate type.
421 wxArchiveEntry
* NewEntry() const;
425 Create a new input or output stream to read or write an archive.
427 If the parent stream is passed as a pointer then the new archive stream
428 takes ownership of it. If it is passed by reference then it does not.
430 wxArchiveInputStream
* NewStream(wxInputStream
& stream
) const;
431 wxArchiveOutputStream
* NewStream(wxOutputStream
& stream
) const;
432 wxArchiveInputStream
* NewStream(wxInputStream
* stream
) const;
433 wxArchiveOutputStream
* NewStream(wxOutputStream
* stream
) const;
437 Adds this class factory to the list returned by GetFirst() or GetNext().
439 It is not necessary to do this to use the archive streams. It is usually
440 used when implementing streams, typically the implementation will
441 add a static instance of its factory class.
443 It can also be used to change the order of a factory already in the list,
444 bringing it to the front. This isn't a thread safe operation
445 so can't be done when other threads are running that will be using the list.
446 The list does not take ownership of the factory.
451 Removes this class factory from the list returned by GetFirst() and GetNext().
453 Removing from the list isn't a thread safe operation so can't be done when
454 other threads are running that will be using the list.
455 The list does not own the factories, so removing a factory does not delete it.
463 @class wxArchiveNotifier
465 If you need to know when a wxArchiveInputStream updates a wxArchiveEntry
466 object, you can create a notifier by deriving from this abstract base class,
467 overriding wxArchiveNotifier::OnEntryUpdated.
469 An instance of your notifier class can then be assigned to the wxArchiveEntry
470 object using wxArchiveEntry::SetNotifier.
471 Your OnEntryUpdated() method will then be invoked whenever the input
472 stream updates the entry.
474 Setting a notifier is not usually necessary. It is used to handle
475 certain cases when modifying an archive in a pipeline (i.e. between
476 non-seekable streams).
477 See @ref overview_archive_noseek.
480 @category{archive,streams}
482 @see @ref overview_archive_noseek, wxArchiveEntry, wxArchiveInputStream,
483 wxArchiveOutputStream
485 class wxArchiveNotifier
489 This method must be overridden in your derived class.
491 virtual void OnEntryUpdated(wxArchiveEntry
& entry
) = 0;
497 @class wxArchiveIterator
499 An input iterator template class that can be used to transfer an archive's
500 catalogue to a container. It is only available if wxUSE_STL is set to 1
501 in setup.h, and the uses for it outlined below require a compiler which
502 supports member templates.
505 template<class Arc, class T = typename Arc::entry_type*>
506 class wxArchiveIterator
508 // this constructor creates an 'end of sequence' object
511 // template parameter 'Arc' should be the type of an archive input stream
512 wxArchiveIterator(Arc& arc) {
518 The first template parameter should be the type of archive input stream
519 (e.g. wxArchiveInputStream) and the second can either be a pointer to an entry
520 (e.g. wxArchiveEntry*), or a string/pointer pair
521 (e.g. std::pair<wxString,wxArchiveEntry*>).
523 The @c wx/archive.h header defines the following typedefs:
526 typedef wxArchiveIterator<wxArchiveInputStream> wxArchiveIter;
528 typedef wxArchiveIterator<wxArchiveInputStream,
529 std::pair<wxString, wxArchiveEntry*> > wxArchivePairIter;
532 The header for any implementation of this interface should define similar
533 typedefs for its types, for example in @c wx/zipstrm.h there is:
536 typedef wxArchiveIterator<wxZipInputStream> wxZipIter;
538 typedef wxArchiveIterator<wxZipInputStream,
539 std::pair<wxString, wxZipEntry*> > wxZipPairIter;
542 Transferring the catalogue of an archive @e arc to a vector @e cat,
543 can then be done something like this:
546 std::vector<wxArchiveEntry*> cat((wxArchiveIter)arc, wxArchiveIter());
549 When the iterator is dereferenced, it gives away ownership of an entry
550 object. So in the above example, when you have finished with @e cat
551 you must delete the pointers it contains.
553 If you have smart pointers with normal copy semantics (i.e. not auto_ptr
554 or wxScopedPtr), then you can create an iterator which uses them instead.
556 For example, with a smart pointer class for zip entries @e ZipEntryPtr:
559 typedef std::vector<ZipEntryPtr> ZipCatalog;
560 typedef wxArchiveIterator<wxZipInputStream, ZipEntryPtr> ZipIter;
561 ZipCatalog cat((ZipIter)zip, ZipIter());
564 Iterators that return std::pair objects can be used to populate a std::multimap,
565 to allow entries to be looked up by name.
566 The string is initialised using the wxArchiveEntry object's
567 wxArchiveEntry::GetInternalName function.
570 typedef std::multimap<wxString, wxZipEntry*> ZipCatalog;
571 ZipCatalog cat((wxZipPairIter)zip, wxZipPairIter());
574 Note that this iterator also gives away ownership of an entry
575 object each time it is dereferenced. So in the above example, when
576 you have finished with @e cat you must delete the pointers it contains.
578 Or if you have them, a pair containing a smart pointer can be used
579 (again @e ZipEntryPtr), no worries about ownership:
582 typedef std::multimap<wxString, ZipEntryPtr> ZipCatalog;
583 typedef wxArchiveIterator<wxZipInputStream,
584 std::pair<wxString, ZipEntryPtr> > ZipPairIter;
585 ZipCatalog cat((ZipPairIter)zip, ZipPairIter());
589 @category{archive,streams}
591 @see wxArchiveEntry, wxArchiveInputStream, wxArchiveOutputStream
593 class wxArchiveIterator
602 Construct the iterator that returns all the entries in the archive input
605 wxArchiveIterator(Arc
& arc
);
608 Returns an entry object from the archive input stream, giving away
611 const T
operator*() const;
615 Position the input iterator at the next entry in the archive input stream.
617 wxArchiveIterator
operator++();
618 wxArchiveIterator
operator++(int);