2008-03-08 08:52:38 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: tarstrm.h
|
2008-03-10 11:24:38 -04:00
|
|
|
// Purpose: interface of wxTarInputStream
|
2008-03-08 08:52:38 -05:00
|
|
|
// Author: wxWidgets team
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Licence: wxWindows license
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/**
|
|
|
|
@class wxTarInputStream
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
Input stream for reading tar files.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
wxTarInputStream::GetNextEntry returns an
|
|
|
|
wxTarEntry object containing the meta-data
|
|
|
|
for the next entry in the tar (and gives away ownership). Reading from
|
|
|
|
the wxTarInputStream then returns the entry's data. Eof() becomes @true
|
|
|
|
after an attempt has been made to read past the end of the entry's data.
|
|
|
|
When there are no more entries, GetNextEntry() returns @NULL and sets Eof().
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
Tar entries are seekable if the parent stream is seekable. In practice this
|
|
|
|
usually means they are only seekable if the tar is stored as a local file and
|
|
|
|
is not compressed.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@library{wxbase}
|
|
|
|
@category{streams}
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
@see @ref overview_wxarcbyname "Looking up an archive entry by name"
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
|
|
|
class wxTarInputStream : public wxArchiveInputStream
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
//@{
|
|
|
|
/**
|
2008-03-09 08:33:59 -04:00
|
|
|
Constructor. In a Unicode build the second parameter @a conv is
|
2008-03-08 08:52:38 -05:00
|
|
|
used to translate fields from the standard tar header into Unicode. It has
|
2008-03-09 08:33:59 -04:00
|
|
|
no effect on the stream's data. @a conv is only used for the standard
|
2008-03-08 08:52:38 -05:00
|
|
|
tar headers, any pax extended headers are always UTF-8 encoded.
|
|
|
|
If the parent stream is passed as a pointer then the new filter stream
|
|
|
|
takes ownership of it. If it is passed by reference then it does not.
|
|
|
|
*/
|
|
|
|
wxTarInputStream(wxInputStream& stream,
|
|
|
|
wxMBConv& conv = wxConvLocal);
|
2008-03-08 09:43:31 -05:00
|
|
|
wxTarInputStream(wxInputStream* stream,
|
|
|
|
wxMBConv& conv = wxConvLocal);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Closes the current entry. On a non-seekable stream reads to the end of
|
|
|
|
the current entry first.
|
|
|
|
*/
|
|
|
|
bool CloseEntry();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Closes the current entry if one is open, then reads the meta-data for
|
|
|
|
the next entry and returns it in a wxTarEntry
|
|
|
|
object, giving away ownership. The stream is then open and can be read.
|
|
|
|
*/
|
|
|
|
wxTarEntry* GetNextEntry();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Closes the current entry if one is open, then opens the entry specified
|
2008-03-09 08:33:59 -04:00
|
|
|
by the @a entry object.
|
|
|
|
@a entry should be from the same tar file, and the tar should
|
2008-03-08 08:52:38 -05:00
|
|
|
be on a seekable stream.
|
|
|
|
*/
|
|
|
|
bool OpenEntry(wxTarEntry& entry);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
/**
|
|
|
|
@class wxTarClassFactory
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
Class factory for the tar archive format. See the base class
|
|
|
|
for details.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@library{wxbase}
|
|
|
|
@category{FIXME}
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
@see @ref overview_wxarc "Archive formats such as zip", @ref
|
|
|
|
overview_wxarcgeneric "Generic archive programming", wxTarEntry, wxTarInputStream, wxTarOutputStream
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
|
|
|
class wxTarClassFactory : public wxArchiveClassFactory
|
|
|
|
{
|
|
|
|
public:
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
/**
|
|
|
|
@class wxTarOutputStream
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
Output stream for writing tar files.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
wxTarOutputStream::PutNextEntry is used to create
|
|
|
|
a new entry in the output tar, then the entry's data is written to the
|
|
|
|
wxTarOutputStream. Another call to PutNextEntry() closes the current
|
|
|
|
entry and begins the next.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@library{wxbase}
|
|
|
|
@category{streams}
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
@see @ref overview_wxarc "Archive formats such as zip", wxTarEntry,
|
|
|
|
wxTarInputStream
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
|
|
|
class wxTarOutputStream : public wxArchiveOutputStream
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
If the parent stream is passed as a pointer then the new filter stream
|
|
|
|
takes ownership of it. If it is passed by reference then it does not.
|
2008-03-09 08:33:59 -04:00
|
|
|
In a Unicode build the third parameter @a conv is used to translate the
|
2008-03-08 08:52:38 -05:00
|
|
|
headers fields into an 8-bit encoding. It has no effect on the stream's data.
|
2008-03-09 08:33:59 -04:00
|
|
|
When the @a format is @e wxTAR_PAX, pax extended headers are generated
|
2008-03-08 08:52:38 -05:00
|
|
|
when any header field will not fit the standard tar header block or if it
|
|
|
|
uses any non-ascii characters.
|
|
|
|
Extended headers are stored as extra 'files' within the tar, and will be
|
|
|
|
extracted as such by any other tar program that does not understand them.
|
2008-03-09 08:33:59 -04:00
|
|
|
The @a conv parameter only affect the standard tar headers, the extended
|
2008-03-08 08:52:38 -05:00
|
|
|
headers are always UTF-8 encoded.
|
2008-03-09 08:33:59 -04:00
|
|
|
When the @a format is @e wxTAR_USTAR, no extended headers are
|
2008-03-08 08:52:38 -05:00
|
|
|
generated, and instead a warning message is logged if any header field
|
|
|
|
overflows.
|
|
|
|
*/
|
|
|
|
wxTarOutputStream(wxOutputStream& stream,
|
|
|
|
wxTarFormat format = wxTAR_PAX,
|
|
|
|
wxMBConv& conv = wxConvLocal);
|
2008-03-08 09:43:31 -05:00
|
|
|
wxTarOutputStream(wxOutputStream* stream,
|
|
|
|
wxTarFormat format = wxTAR_PAX,
|
|
|
|
wxMBConv& conv = wxConvLocal);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
The destructor calls Close() to finish
|
|
|
|
writing the tar if it has not been called already.
|
|
|
|
*/
|
2008-09-27 07:21:10 -04:00
|
|
|
virtual ~wxTarOutputStream();
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Finishes writing the tar, returning @true if successful.
|
|
|
|
Called by the destructor if not called explicitly.
|
|
|
|
*/
|
|
|
|
bool Close();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Close the current entry. It is called implicitly whenever another new
|
|
|
|
entry is created with CopyEntry()
|
|
|
|
or PutNextEntry(), or
|
|
|
|
when the tar is closed.
|
|
|
|
*/
|
|
|
|
bool CloseEntry();
|
|
|
|
|
|
|
|
/**
|
|
|
|
See wxArchiveOutputStream::CopyArchiveMetaData.
|
|
|
|
For the tar format this function does nothing.
|
|
|
|
*/
|
|
|
|
bool CopyArchiveMetaData(wxTarInputStream& s);
|
|
|
|
|
|
|
|
/**
|
2008-03-09 08:33:59 -04:00
|
|
|
Takes ownership of @a entry and uses it to create a new entry
|
|
|
|
in the tar. @a entry is then opened in @a inputStream and its contents
|
2008-03-08 08:52:38 -05:00
|
|
|
copied to this stream.
|
|
|
|
For some other archive formats CopyEntry() is much more efficient than
|
|
|
|
transferring the data using Read() and Write() since it will copy them
|
|
|
|
without decompressing and recompressing them. For tar however it makes
|
|
|
|
no difference.
|
2008-03-09 08:33:59 -04:00
|
|
|
For tars on seekable streams, @a entry must be from the same tar file
|
|
|
|
as @e stream. For non-seekable streams, @a entry must also be the
|
2008-03-08 08:52:38 -05:00
|
|
|
last thing read from @e inputStream.
|
|
|
|
*/
|
|
|
|
bool CopyEntry(wxTarEntry* entry, wxTarInputStream& inputStream);
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
The tar is zero padded to round its size up to @e BlockingFactor * 512 bytes.
|
|
|
|
Defaults to 10 for @e wxTAR_PAX and 20 for @e wxTAR_USTAR
|
|
|
|
(see the @ref wxtaroutputstream() constructor), as
|
|
|
|
specified in the POSIX standards.
|
|
|
|
*/
|
|
|
|
int GetBlockingFactor();
|
2008-03-09 12:24:26 -04:00
|
|
|
const void SetBlockingFactor(int factor);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
)
|
|
|
|
Create a new directory entry
|
|
|
|
(see wxArchiveEntry::IsDir)
|
|
|
|
with the given name and timestamp.
|
|
|
|
PutNextEntry() can
|
|
|
|
also be used to create directory entries, by supplying a name with
|
|
|
|
a trailing path separator.
|
|
|
|
*/
|
|
|
|
bool PutNextDirEntry(const wxString& name);
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
, @b wxFileOffset@e size = wxInvalidOffset)
|
|
|
|
Create a new entry with the given name, timestamp and size.
|
|
|
|
*/
|
|
|
|
bool PutNextEntry(wxTarEntry* entry);
|
2008-03-08 09:43:31 -05:00
|
|
|
bool PutNextEntry(const wxString& name);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
/**
|
|
|
|
@class wxTarEntry
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
Holds the meta-data for an entry in a tar.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@library{wxbase}
|
|
|
|
@category{FIXME}
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
@see @ref overview_wxarc "Archive formats such as zip", wxTarInputStream,
|
2008-03-08 08:52:38 -05:00
|
|
|
wxTarOutputStream
|
|
|
|
*/
|
|
|
|
class wxTarEntry : public wxArchiveEntry
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Copy constructor.
|
|
|
|
*/
|
|
|
|
wxTarEntry(const wxString& name = wxEmptyString);
|
2008-03-08 09:43:31 -05:00
|
|
|
wxTarEntry(const wxTarEntry& entry);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
The entry's access time stamp. See also
|
|
|
|
wxArchiveEntry::Get/SetDateTime.
|
|
|
|
*/
|
|
|
|
wxDateTime GetAccessTime();
|
2008-03-09 12:24:26 -04:00
|
|
|
const void SetAccessTime(const wxDateTime& dt);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
The entry's creation time stamp. See also
|
|
|
|
wxArchiveEntry::Get/SetDateTime.
|
|
|
|
*/
|
|
|
|
wxDateTime GetCreateTime();
|
2008-03-09 12:24:26 -04:00
|
|
|
const void SetCreateTime(const wxDateTime& dt);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
OS specific IDs defining a device, these are only meaningful when
|
|
|
|
TypeFlag() is set to @e wxTAR_CHRTYPE
|
|
|
|
or @e wxTAR_BLKTYPE.
|
|
|
|
*/
|
|
|
|
int GetDevMajor();
|
2008-03-09 12:24:26 -04:00
|
|
|
const int GetDevMinor();
|
|
|
|
const void SetDevMajor(int dev);
|
2008-03-08 09:43:31 -05:00
|
|
|
void SetDevMinor(int dev);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
The user ID and group ID that has @ref mode() permissions over
|
|
|
|
this entry. These values aren't usually useful unless the file will only be
|
|
|
|
restored to the same system it originated from. @ref unamegname()
|
|
|
|
"Get/SetGroupName and
|
|
|
|
Get/SetUserName" can be used instead.
|
|
|
|
*/
|
|
|
|
int GetGroupId();
|
2008-03-09 12:24:26 -04:00
|
|
|
const int GetUserId();
|
|
|
|
const void SetGroupId(int id);
|
2008-03-08 09:43:31 -05:00
|
|
|
void SetUserId(int id);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
The names of the user and group that has @ref mode() permissions
|
|
|
|
over this entry. These are not present in very old tars.
|
|
|
|
*/
|
|
|
|
wxString GetGroupName();
|
2008-03-09 12:24:26 -04:00
|
|
|
const wxString GetUserName();
|
|
|
|
const void SetGroupName(const wxString& group);
|
2008-03-08 09:43:31 -05:00
|
|
|
void SetUserName(const wxString& user);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
The filename of a previous entry in the tar that this entry is a link to.
|
|
|
|
Only meaningful when TypeFlag() is set
|
|
|
|
to @e wxTAR_LNKTYPE or @e wxTAR_SYMTYPE.
|
|
|
|
*/
|
|
|
|
wxString GetLinkName();
|
2008-03-09 12:24:26 -04:00
|
|
|
const void SetLinkName(const wxString& link);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
UNIX permission bits for this entry. Giving read, write and execute permissions
|
|
|
|
to the file's @ref unamegname() "User and Group" and to others.
|
|
|
|
Symbols are defined for them in wx/file.h.
|
|
|
|
*/
|
|
|
|
int GetMode();
|
2008-03-09 12:24:26 -04:00
|
|
|
const void SetMode(int mode);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
The size of the entry's data in bytes.
|
|
|
|
The tar archive format stores the entry's size ahead of the entry's data.
|
|
|
|
Therefore when creating an archive on a non-seekable stream it is necessary to
|
|
|
|
supply the correct size when each entry is created. For seekable streams this
|
|
|
|
is not necessary as wxTarOutputStream will attempt
|
|
|
|
to seek back and fix the entry's header when the entry is closed, though it is
|
|
|
|
still more efficient if the size is given beforehand.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
void SetSize(wxFileOffset size) const;
|
|
|
|
wxFileOffset GetSize() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Returns the type of the entry. It should be one of the following:
|
2008-03-20 09:45:17 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
When creating archives use just these values. When reading archives
|
|
|
|
any other values should be treated as @e wxTAR_REGTYPE.
|
|
|
|
*/
|
|
|
|
int GetTypeFlag();
|
2008-03-09 12:24:26 -04:00
|
|
|
const void SetTypeFlag(int type);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
A static member that translates a filename into the internal format used
|
|
|
|
within the archive. If the third parameter is provided, the bool pointed
|
|
|
|
to is set to indicate whether the name looks like a directory name
|
|
|
|
(i.e. has a trailing path separator).
|
|
|
|
*/
|
|
|
|
wxString GetInternalName();
|
2008-03-09 12:24:26 -04:00
|
|
|
const wxString GetInternalName(const wxString& name,
|
|
|
|
wxPathFormat format = wxPATH_NATIVE,
|
|
|
|
bool* pIsDir = NULL);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator.
|
|
|
|
*/
|
|
|
|
wxTarEntry& operator operator=(const wxTarEntry& entry);
|
|
|
|
};
|
2008-03-10 11:24:38 -04:00
|
|
|
|