]> git.saurik.com Git - wxWidgets.git/blob - interface/wx/tarstrm.h
Add wxVectorSort function for sorting wxVector<T> containers. Closes #11889
[wxWidgets.git] / interface / wx / tarstrm.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: tarstrm.h
3 // Purpose: interface of wxTar* classes
4 // Author: wxWidgets team
5 // RCS-ID: $Id$
6 // Licence: wxWindows license
7 /////////////////////////////////////////////////////////////////////////////
8
9
10 /** wxTarEntry::GetTypeFlag() values */
11 enum wxTarType
12 {
13 wxTAR_REGTYPE = '0', //!< regular file
14 wxTAR_LNKTYPE = '1', //!< hard link
15 wxTAR_SYMTYPE = '2', //!< symbolic link
16 wxTAR_CHRTYPE = '3', //!< character special
17 wxTAR_BLKTYPE = '4', //!< block special
18 wxTAR_DIRTYPE = '5', //!< directory
19 wxTAR_FIFOTYPE = '6', //!< named pipe
20 wxTAR_CONTTYPE = '7' //!< contiguous file
21 };
22
23 /** Archive Formats (use wxTAR_PAX, it's backward compatible) used by wxTarEntry */
24 enum wxTarFormat
25 {
26 wxTAR_USTAR, //!< POSIX.1-1990 tar format
27 wxTAR_PAX //!< POSIX.1-2001 tar format
28 };
29
30
31 /**
32 @class wxTarInputStream
33
34 Input stream for reading tar files.
35
36 wxTarInputStream::GetNextEntry() returns a wxTarEntry object containing the
37 meta-data for the next entry in the tar (and gives away ownership).
38 Reading from the wxTarInputStream then returns the entry's data.
39 wxTarInputStream::Eof() becomes @true after an attempt has been made to read
40 past the end of the entry's data.
41
42 When there are no more entries, wxTarInputStream::GetNextEntry() returns @NULL
43 and sets wxTarInputStream::Eof().
44
45 Tar entries are seekable if the parent stream is seekable. In practice this
46 usually means they are only seekable if the tar is stored as a local file and
47 is not compressed.
48
49 @library{wxbase}
50 @category{archive,streams}
51
52 @see @ref overview_archive_byname
53 */
54 class wxTarInputStream : public wxArchiveInputStream
55 {
56 public:
57 //@{
58 /**
59 Constructor. In a Unicode build the second parameter @a conv is
60 used to translate fields from the standard tar header into Unicode.
61
62 It has no effect on the stream's data. @a conv is only used for the standard
63 tar headers, any pax extended headers are always UTF-8 encoded.
64
65 If the parent stream is passed as a pointer then the new filter stream
66 takes ownership of it. If it is passed by reference then it does not.
67 */
68 wxTarInputStream(wxInputStream& stream,
69 wxMBConv& conv = wxConvLocal);
70 wxTarInputStream(wxInputStream* stream,
71 wxMBConv& conv = wxConvLocal);
72 //@}
73
74 /**
75 Closes the current entry.
76 On a non-seekable stream reads to the end of the current entry first.
77 */
78 bool CloseEntry();
79
80 /**
81 Closes the current entry if one is open, then reads the meta-data for
82 the next entry and returns it in a wxTarEntry object, giving away ownership.
83 The stream is then open and can be read.
84 */
85 wxTarEntry* GetNextEntry();
86
87 /**
88 Closes the current entry if one is open, then opens the entry specified
89 by the @a entry object.
90
91 @a entry should be from the same tar file, and the tar should be on a
92 seekable stream.
93 */
94 bool OpenEntry(wxTarEntry& entry);
95 };
96
97
98
99 /**
100 @class wxTarClassFactory
101
102 Class factory for the tar archive format.
103 See the base class for details.
104
105 @library{wxbase}
106 @category{archive,streams}
107
108 @see @ref overview_archive, @ref overview_archive_generic,
109 wxTarEntry, wxTarInputStream, wxTarOutputStream
110 */
111 class wxTarClassFactory : public wxArchiveClassFactory
112 {
113 public:
114
115 };
116
117
118
119 /**
120 @class wxTarOutputStream
121
122 Output stream for writing tar files.
123
124 wxTarOutputStream::PutNextEntry() is used to create a new entry in the output tar,
125 then the entry's data is written to the wxTarOutputStream.
126 Another call to wxTarOutputStream::PutNextEntry() closes the current entry
127 and begins the next.
128
129 @library{wxbase}
130 @category{streams}
131
132 @see @ref overview_archive, wxTarEntry, wxTarInputStream
133 */
134 class wxTarOutputStream : public wxArchiveOutputStream
135 {
136 public:
137 //@{
138 /**
139 If the parent stream is passed as a pointer then the new filter stream
140 takes ownership of it. If it is passed by reference then it does not.
141
142 In a Unicode build the third parameter @a conv is used to translate the
143 headers fields into an 8-bit encoding. It has no effect on the stream's data.
144
145 When the @a format is @e wxTAR_PAX, pax extended headers are generated
146 when any header field will not fit the standard tar header block or if it
147 uses any non-ascii characters.
148
149 Extended headers are stored as extra 'files' within the tar, and will be
150 extracted as such by any other tar program that does not understand them.
151 The @a conv parameter only affect the standard tar headers, the extended
152 headers are always UTF-8 encoded.
153
154 When the @a format is @e wxTAR_USTAR, no extended headers are generated,
155 and instead a warning message is logged if any header field overflows.
156 */
157 wxTarOutputStream(wxOutputStream& stream,
158 wxTarFormat format = wxTAR_PAX,
159 wxMBConv& conv = wxConvLocal);
160 wxTarOutputStream(wxOutputStream* stream,
161 wxTarFormat format = wxTAR_PAX,
162 wxMBConv& conv = wxConvLocal);
163 //@}
164
165 /**
166 The destructor calls Close() to finish writing the tar if it has
167 not been called already.
168 */
169 virtual ~wxTarOutputStream();
170
171 /**
172 Finishes writing the tar, returning @true if successful.
173 Called by the destructor if not called explicitly.
174 */
175 bool Close();
176
177 /**
178 Close the current entry.
179
180 It is called implicitly whenever another new entry is created with
181 CopyEntry() or PutNextEntry(), or when the tar is closed.
182 */
183 bool CloseEntry();
184
185 /**
186 See wxArchiveOutputStream::CopyArchiveMetaData().
187 For the tar format this function does nothing.
188 */
189 bool CopyArchiveMetaData(wxTarInputStream& s);
190
191 /**
192 Takes ownership of @a entry and uses it to create a new entry in the tar.
193 @a entry is then opened in @a inputStream and its contents copied to this stream.
194
195 For some other archive formats CopyEntry() is much more efficient than
196 transferring the data using Read() and Write() since it will copy them
197 without decompressing and recompressing them.
198 For tar however it makes no difference.
199
200 For tars on seekable streams, @a entry must be from the same tar file
201 as @a inputStream. For non-seekable streams, @a entry must also be the
202 last thing read from @a inputStream.
203 */
204 bool CopyEntry(wxTarEntry* entry, wxTarInputStream& inputStream);
205
206 //@{
207 /**
208 The tar is zero padded to round its size up to @e BlockingFactor * 512 bytes.
209
210 The blocking factor defaults to 10 for @e wxTAR_PAX and 20 for @e wxTAR_USTAR
211 (see wxTarOutputStream()), as specified in the POSIX standards.
212 */
213 int GetBlockingFactor() const;
214 void SetBlockingFactor(int factor);
215 //@}
216
217 /**
218 Create a new directory entry (see wxArchiveEntry::IsDir()) with the given
219 name and timestamp.
220
221 PutNextEntry() can also be used to create directory entries, by supplying
222 a name with a trailing path separator.
223 */
224 bool PutNextDirEntry(const wxString& name, const wxDateTime& dt = wxDateTime::Now());
225
226 /**
227 Takes ownership of entry and uses it to create a new entry in the tar.
228 */
229 bool PutNextEntry(wxTarEntry* entry);
230
231 /**
232 Create a new entry with the given name, timestamp and size.
233 */
234 bool PutNextEntry(const wxString& name, const wxDateTime& dt = wxDateTime::Now(),
235 wxFileOffset size = wxInvalidOffset);
236 };
237
238
239
240 /**
241 @class wxTarEntry
242
243 Holds the meta-data for an entry in a tar.
244
245 @section tarentry_fields Field availability
246
247 The tar format stores all the meta-data for an entry ahead of its data,
248 therefore GetNextEntry() always returns a fully populated wxTarEntry object,
249 both when reading from seekable and non-seekable streams.
250
251 @library{wxbase}
252 @category{archive,streams}
253
254 @see @ref overview_archive, wxTarInputStream, wxTarOutputStream
255 */
256 class wxTarEntry : public wxArchiveEntry
257 {
258 public:
259 /**
260 Constructor.
261
262 The tar archive format stores the entry's size ahead of the entry's data.
263 Therefore when creating an archive on a non-seekable stream it is necessary
264 to supply the correct size when each entry is created.
265 */
266 wxTarEntry(const wxString& name = wxEmptyString,
267 const wxDateTime& dt = wxDateTime::Now(),
268 wxFileOffset size = wxInvalidOffset);
269
270 /**
271 Copy constructor.
272 */
273 wxTarEntry(const wxTarEntry& entry);
274
275 //@{
276 /**
277 Gets/sets the entry's access time stamp.
278 See also wxArchiveEntry::GetDateTime() and wxArchiveEntry::SetDateTime().
279 */
280 wxDateTime GetAccessTime() const;
281 void SetAccessTime(const wxDateTime& dt);
282 //@}
283
284 //@{
285 /**
286 The entry's creation time stamp.
287 See also wxArchiveEntry::GetDateTime() and wxArchiveEntry::SetDateTime().
288 */
289 wxDateTime GetCreateTime() const;
290 void SetCreateTime(const wxDateTime& dt);
291 //@}
292
293 //@{
294 /**
295 OS specific IDs defining a device; these are only meaningful when
296 wxTarEntry::GetTypeFlag() is @e wxTAR_CHRTYPE or @e wxTAR_BLKTYPE.
297 */
298 int GetDevMajor() const;
299 int GetDevMinor() const;
300 void SetDevMajor(int dev);
301 void SetDevMinor(int dev);
302 //@}
303
304 //@{
305 /**
306 The user ID and group ID that has permissions (see wxTarEntry::GetMode())
307 over this entry.
308
309 These values aren't usually useful unless the file will only be
310 restored to the same system it originated from.
311 wxTarEntry::GetGroupName() and wxTarEntry::GetUserName() can be used instead.
312 */
313 int GetGroupId() const;
314 int GetUserId() const;
315 void SetGroupId(int id);
316 void SetUserId(int id);
317 //@}
318
319 //@{
320 /**
321 The names of the user and group that has permissions (see wxTarEntry::GetMode())
322 over this entry. These are not present in very old tars.
323 */
324 wxString GetGroupName() const;
325 wxString GetUserName() const;
326 void SetGroupName(const wxString& group);
327 void SetUserName(const wxString& user);
328 //@}
329
330 //@{
331 /**
332 The filename of a previous entry in the tar that this entry is a link to.
333 Only meaningful when wxTarEntry::GetTypeFlag() is set to @e wxTAR_LNKTYPE
334 or @e wxTAR_SYMTYPE.
335 */
336 wxString GetLinkName() const;
337 void SetLinkName(const wxString& link);
338 //@}
339
340 //@{
341 /**
342 UNIX permission bits for this entry.
343 Giving read, write and execute permissions to the file's user and group
344 (see GetGroupName() and GetUserName()) and to others.
345
346 The integer is one or more ::wxPosixPermissions flags OR-combined.
347 */
348 int GetMode() const;
349 void SetMode(int mode);
350 //@}
351
352 //@{
353 /**
354 The size of the entry's data in bytes.
355
356 The tar archive format stores the entry's size ahead of the entry's data.
357 Therefore when creating an archive on a non-seekable stream it is necessary to
358 supply the correct size when each entry is created.
359
360 For seekable streams this is not necessary as wxTarOutputStream will attempt
361 to seek back and fix the entry's header when the entry is closed, though it is
362 still more efficient if the size is given beforehand.
363 */
364 void SetSize(wxFileOffset size);
365 wxFileOffset GetSize() const;
366 //@}
367
368 //@{
369 /**
370 Returns/Sets the type of the entry as a ::wxTarType value.
371
372 When creating archives use only one of ::wxTarType values.
373 When reading archives, GetTypeFlag() may return a value which does not
374 match any value of ::wxTarType; in this case the returned value should be
375 treated as @e wxTAR_REGTYPE.
376 */
377 int GetTypeFlag() const;
378 void SetTypeFlag(int type);
379 //@}
380
381 /**
382 Returns the entry's filename in the internal format used within the archive.
383
384 The name can include directory components, i.e. it can be a full path.
385 The names of directory entries are returned without any trailing path separator.
386 This gives a canonical name that can be used in comparisons.
387 */
388 wxString GetInternalName() const;
389
390 /**
391 A static member that translates a filename into the internal format used
392 within the archive.
393
394 If the third parameter is provided, the bool pointed to is set to indicate
395 whether the name looks like a directory name (i.e. has a trailing path separator).
396 */
397 static wxString GetInternalName(const wxString& name,
398 wxPathFormat format = wxPATH_NATIVE,
399 bool* pIsDir = NULL);
400
401 /**
402 Assignment operator.
403 */
404 wxTarEntry& operator operator=(const wxTarEntry& entry);
405 };
406