| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/tarstrm.h
- // Purpose: Streams for Tar files
- // Author: Mike Wetherell
- // Copyright: (c) 2004 Mike Wetherell
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_WXTARSTREAM_H__
- #define _WX_WXTARSTREAM_H__
- #include "wx/defs.h"
- #if wxUSE_TARSTREAM
- #include "wx/archive.h"
- #include "wx/hashmap.h"
- /////////////////////////////////////////////////////////////////////////////
- // Constants
- // TypeFlag values
- enum wxTarType
- {
- wxTAR_REGTYPE = '0', // regular file
- wxTAR_LNKTYPE = '1', // hard link
- wxTAR_SYMTYPE = '2', // symbolic link
- wxTAR_CHRTYPE = '3', // character special
- wxTAR_BLKTYPE = '4', // block special
- wxTAR_DIRTYPE = '5', // directory
- wxTAR_FIFOTYPE = '6', // named pipe
- wxTAR_CONTTYPE = '7' // contiguous file
- };
- // Archive Formats (use wxTAR_PAX, it's backward compatible)
- enum wxTarFormat
- {
- wxTAR_USTAR, // POSIX.1-1990 tar format
- wxTAR_PAX // POSIX.1-2001 tar format
- };
- /////////////////////////////////////////////////////////////////////////////
- // wxTarNotifier
- class WXDLLIMPEXP_BASE wxTarNotifier
- {
- public:
- virtual ~wxTarNotifier() { }
- virtual void OnEntryUpdated(class wxTarEntry& entry) = 0;
- };
- /////////////////////////////////////////////////////////////////////////////
- // Tar Entry - hold the meta data for a file in the tar
- class WXDLLIMPEXP_BASE wxTarEntry : public wxArchiveEntry
- {
- public:
- wxTarEntry(const wxString& name = wxEmptyString,
- const wxDateTime& dt = wxDateTime::Now(),
- wxFileOffset size = wxInvalidOffset);
- virtual ~wxTarEntry();
- wxTarEntry(const wxTarEntry& entry);
- wxTarEntry& operator=(const wxTarEntry& entry);
- // Get accessors
- wxString GetName(wxPathFormat format = wxPATH_NATIVE) const;
- wxString GetInternalName() const { return m_Name; }
- wxPathFormat GetInternalFormat() const { return wxPATH_UNIX; }
- int GetMode() const;
- int GetUserId() const { return m_UserId; }
- int GetGroupId() const { return m_GroupId; }
- wxFileOffset GetSize() const { return m_Size; }
- wxFileOffset GetOffset() const { return m_Offset; }
- wxDateTime GetDateTime() const { return m_ModifyTime; }
- wxDateTime GetAccessTime() const { return m_AccessTime; }
- wxDateTime GetCreateTime() const { return m_CreateTime; }
- int GetTypeFlag() const { return m_TypeFlag; }
- wxString GetLinkName() const { return m_LinkName; }
- wxString GetUserName() const { return m_UserName; }
- wxString GetGroupName() const { return m_GroupName; }
- int GetDevMajor() const { return m_DevMajor; }
- int GetDevMinor() const { return m_DevMinor; }
- // is accessors
- bool IsDir() const;
- bool IsReadOnly() const { return !(m_Mode & 0222); }
- // set accessors
- void SetName(const wxString& name, wxPathFormat format = wxPATH_NATIVE);
- void SetUserId(int id) { m_UserId = id; }
- void SetGroupId(int id) { m_GroupId = id; }
- void SetMode(int mode);
- void SetSize(wxFileOffset size) { m_Size = size; }
- void SetDateTime(const wxDateTime& dt) { m_ModifyTime = dt; }
- void SetAccessTime(const wxDateTime& dt) { m_AccessTime = dt; }
- void SetCreateTime(const wxDateTime& dt) { m_CreateTime = dt; }
- void SetTypeFlag(int type) { m_TypeFlag = type; }
- void SetLinkName(const wxString& link) { m_LinkName = link; }
- void SetUserName(const wxString& user) { m_UserName = user; }
- void SetGroupName(const wxString& group) { m_GroupName = group; }
- void SetDevMajor(int dev) { m_DevMajor = dev; }
- void SetDevMinor(int dev) { m_DevMinor = dev; }
- // set is accessors
- void SetIsDir(bool isDir = true);
- void SetIsReadOnly(bool isReadOnly = true);
- static wxString GetInternalName(const wxString& name,
- wxPathFormat format = wxPATH_NATIVE,
- bool *pIsDir = NULL);
- wxTarEntry *Clone() const { return new wxTarEntry(*this); }
- void SetNotifier(wxTarNotifier& WXUNUSED(notifier)) { }
- private:
- void SetOffset(wxFileOffset offset) { m_Offset = offset; }
- virtual wxArchiveEntry* DoClone() const { return Clone(); }
- wxString m_Name;
- int m_Mode;
- bool m_IsModeSet;
- int m_UserId;
- int m_GroupId;
- wxFileOffset m_Size;
- wxFileOffset m_Offset;
- wxDateTime m_ModifyTime;
- wxDateTime m_AccessTime;
- wxDateTime m_CreateTime;
- int m_TypeFlag;
- wxString m_LinkName;
- wxString m_UserName;
- wxString m_GroupName;
- int m_DevMajor;
- int m_DevMinor;
- friend class wxTarInputStream;
- DECLARE_DYNAMIC_CLASS(wxTarEntry)
- };
- /////////////////////////////////////////////////////////////////////////////
- // wxTarInputStream
- WX_DECLARE_STRING_HASH_MAP(wxString, wxTarHeaderRecords);
- class WXDLLIMPEXP_BASE wxTarInputStream : public wxArchiveInputStream
- {
- public:
- typedef wxTarEntry entry_type;
- wxTarInputStream(wxInputStream& stream, wxMBConv& conv = wxConvLocal);
- wxTarInputStream(wxInputStream *stream, wxMBConv& conv = wxConvLocal);
- virtual ~wxTarInputStream();
- bool OpenEntry(wxTarEntry& entry);
- bool CloseEntry();
- wxTarEntry *GetNextEntry();
- wxFileOffset GetLength() const { return m_size; }
- bool IsSeekable() const { return m_parent_i_stream->IsSeekable(); }
- protected:
- size_t OnSysRead(void *buffer, size_t size);
- wxFileOffset OnSysTell() const { return m_pos; }
- wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode);
- private:
- void Init();
- wxArchiveEntry *DoGetNextEntry() { return GetNextEntry(); }
- bool OpenEntry(wxArchiveEntry& entry);
- bool IsOpened() const { return m_pos != wxInvalidOffset; }
- wxStreamError ReadHeaders();
- bool ReadExtendedHeader(wxTarHeaderRecords*& recs);
- wxString GetExtendedHeader(const wxString& key) const;
- wxString GetHeaderPath() const;
- wxFileOffset GetHeaderNumber(int id) const;
- wxString GetHeaderString(int id) const;
- wxDateTime GetHeaderDate(const wxString& key) const;
- wxFileOffset m_pos; // position within the current entry
- wxFileOffset m_offset; // offset to the start of the entry's data
- wxFileOffset m_size; // size of the current entry's data
- int m_sumType;
- int m_tarType;
- class wxTarHeaderBlock *m_hdr;
- wxTarHeaderRecords *m_HeaderRecs;
- wxTarHeaderRecords *m_GlobalHeaderRecs;
- wxDECLARE_NO_COPY_CLASS(wxTarInputStream);
- };
- /////////////////////////////////////////////////////////////////////////////
- // wxTarOutputStream
- class WXDLLIMPEXP_BASE wxTarOutputStream : public wxArchiveOutputStream
- {
- public:
- wxTarOutputStream(wxOutputStream& stream,
- wxTarFormat format = wxTAR_PAX,
- wxMBConv& conv = wxConvLocal);
- wxTarOutputStream(wxOutputStream *stream,
- wxTarFormat format = wxTAR_PAX,
- wxMBConv& conv = wxConvLocal);
- virtual ~wxTarOutputStream();
- bool PutNextEntry(wxTarEntry *entry);
- bool PutNextEntry(const wxString& name,
- const wxDateTime& dt = wxDateTime::Now(),
- wxFileOffset size = wxInvalidOffset);
- bool PutNextDirEntry(const wxString& name,
- const wxDateTime& dt = wxDateTime::Now());
- bool CopyEntry(wxTarEntry *entry, wxTarInputStream& inputStream);
- bool CopyArchiveMetaData(wxTarInputStream& WXUNUSED(s)) { return true; }
- void Sync();
- bool CloseEntry();
- bool Close();
- bool IsSeekable() const { return m_parent_o_stream->IsSeekable(); }
- void SetBlockingFactor(int factor) { m_BlockingFactor = factor; }
- int GetBlockingFactor() const { return m_BlockingFactor; }
- protected:
- size_t OnSysWrite(const void *buffer, size_t size);
- wxFileOffset OnSysTell() const { return m_pos; }
- wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
- private:
- void Init(wxTarFormat format);
- bool PutNextEntry(wxArchiveEntry *entry);
- bool CopyEntry(wxArchiveEntry *entry, wxArchiveInputStream& stream);
- bool CopyArchiveMetaData(wxArchiveInputStream& WXUNUSED(s)) { return true; }
- bool IsOpened() const { return m_pos != wxInvalidOffset; }
- bool WriteHeaders(wxTarEntry& entry);
- bool ModifyHeader();
- wxString PaxHeaderPath(const wxString& format, const wxString& path);
- void SetExtendedHeader(const wxString& key, const wxString& value);
- void SetHeaderPath(const wxString& name);
- bool SetHeaderNumber(int id, wxFileOffset n);
- void SetHeaderString(int id, const wxString& str);
- void SetHeaderDate(const wxString& key, const wxDateTime& datetime);
- wxFileOffset m_pos; // position within the current entry
- wxFileOffset m_maxpos; // max pos written
- wxFileOffset m_size; // expected entry size
- wxFileOffset m_headpos; // offset within the file to the entry's header
- wxFileOffset m_datapos; // offset within the file to the entry's data
- wxFileOffset m_tarstart;// offset within the file to the tar
- wxFileOffset m_tarsize; // size of tar so far
- bool m_pax;
- int m_BlockingFactor;
- wxUint32 m_chksum;
- bool m_large;
- class wxTarHeaderBlock *m_hdr;
- class wxTarHeaderBlock *m_hdr2;
- char *m_extendedHdr;
- size_t m_extendedSize;
- wxString m_badfit;
- bool m_endrecWritten;
- wxDECLARE_NO_COPY_CLASS(wxTarOutputStream);
- };
- /////////////////////////////////////////////////////////////////////////////
- // Iterators
- #if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR
- typedef wxArchiveIterator<wxTarInputStream> wxTarIter;
- typedef wxArchiveIterator<wxTarInputStream,
- std::pair<wxString, wxTarEntry*> > wxTarPairIter;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // wxTarClassFactory
- class WXDLLIMPEXP_BASE wxTarClassFactory : public wxArchiveClassFactory
- {
- public:
- typedef wxTarEntry entry_type;
- typedef wxTarInputStream instream_type;
- typedef wxTarOutputStream outstream_type;
- typedef wxTarNotifier notifier_type;
- #if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR
- typedef wxTarIter iter_type;
- typedef wxTarPairIter pairiter_type;
- #endif
- wxTarClassFactory();
- wxTarEntry *NewEntry() const
- { return new wxTarEntry; }
- wxTarInputStream *NewStream(wxInputStream& stream) const
- { return new wxTarInputStream(stream, GetConv()); }
- wxTarOutputStream *NewStream(wxOutputStream& stream) const
- { return new wxTarOutputStream(stream, wxTAR_PAX, GetConv()); }
- wxTarInputStream *NewStream(wxInputStream *stream) const
- { return new wxTarInputStream(stream, GetConv()); }
- wxTarOutputStream *NewStream(wxOutputStream *stream) const
- { return new wxTarOutputStream(stream, wxTAR_PAX, GetConv()); }
- wxString GetInternalName(const wxString& name,
- wxPathFormat format = wxPATH_NATIVE) const
- { return wxTarEntry::GetInternalName(name, format); }
- const wxChar * const *GetProtocols(wxStreamProtocolType type
- = wxSTREAM_PROTOCOL) const;
- protected:
- wxArchiveEntry *DoNewEntry() const
- { return NewEntry(); }
- wxArchiveInputStream *DoNewStream(wxInputStream& stream) const
- { return NewStream(stream); }
- wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const
- { return NewStream(stream); }
- wxArchiveInputStream *DoNewStream(wxInputStream *stream) const
- { return NewStream(stream); }
- wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const
- { return NewStream(stream); }
- private:
- DECLARE_DYNAMIC_CLASS(wxTarClassFactory)
- };
- #endif // wxUSE_TARSTREAM
- #endif // _WX_WXTARSTREAM_H__
|