/////////////////////////////////////////////////////////////////////////////
// wxZipOutputStream
-WX_DECLARE_LIST_WITH_DECL(wxZipEntry, wx__ZipEntryList, class WXDLLIMPEXP_BASE);
+WX_DECLARE_LIST_WITH_DECL(wxZipEntry, wxZipEntryList_, class WXDLLIMPEXP_BASE);
class WXDLLIMPEXP_BASE wxZipOutputStream : public wxArchiveOutputStream
{
wxZipOutputStream(wxOutputStream& stream,
int level = -1,
wxMBConv& conv = wxConvLocal);
+ wxZipOutputStream(wxOutputStream *stream,
+ int level = -1,
+ wxMBConv& conv = wxConvLocal);
virtual WXZIPFIX ~wxZipOutputStream();
bool PutNextEntry(wxZipEntry *entry) { return DoCreate(entry); }
{ return m_offsetAdjustment != wxInvalidOffset; }
private:
+ void Init(int level);
+
bool WXZIPFIX PutNextEntry(wxArchiveEntry *entry);
bool WXZIPFIX CopyEntry(wxArchiveEntry *entry, wxArchiveInputStream& stream);
bool WXZIPFIX CopyArchiveMetaData(wxArchiveInputStream& stream);
class wxStoredOutputStream *m_store;
class wxZlibOutputStream2 *m_deflate;
class wxZipStreamLink *m_backlink;
- wx__ZipEntryList m_entries;
+ wxZipEntryList_ m_entries;
char *m_initialData;
size_t m_initialSize;
wxZipEntry *m_pending;
typedef wxZipEntry entry_type;
wxZipInputStream(wxInputStream& stream, wxMBConv& conv = wxConvLocal);
+ wxZipInputStream(wxInputStream *stream, wxMBConv& conv = wxConvLocal);
-#if 1 //WXWIN_COMPATIBILITY_2_6
+#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
wxZipInputStream(const wxString& archive, const wxString& file)
: wxArchiveInputStream(OpenFile(archive), wxConvLocal) { Init(file); }
#endif
size_t WXZIPFIX OnSysRead(void *buffer, size_t size);
wxFileOffset OnSysTell() const { return m_decomp ? m_decomp->TellI() : 0; }
-#if 1 //WXWIN_COMPATIBILITY_2_6
+#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
wxFileOffset WXZIPFIX OnSysSeek(wxFileOffset seek, wxSeekMode mode);
#endif
private:
void Init();
void Init(const wxString& file);
- wxInputStream& OpenFile(const wxString& archive);
+#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
+ static wxInputStream *OpenFile(const wxString& archive);
+#endif
wxArchiveEntry *DoGetNextEntry() { return GetNextEntry(); }
class wxStoredInputStream *m_store;
class wxZlibInputStream2 *m_inflate;
class wxRawInputStream *m_rawin;
- class wxFFileInputStream *m_ffile;
wxZipEntry m_entry;
bool m_raw;
size_t m_headerSize;
friend bool wxZipOutputStream::CopyArchiveMetaData(
wxZipInputStream& inputStream);
-#if 1 //WXWIN_COMPATIBILITY_2_6
+#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
bool m_allowSeeking;
friend class wxZipFSInputStream;
#endif
typedef wxZipPairIter pairiter_type;
#endif
+ wxZipClassFactory();
+
wxZipEntry *NewEntry() const
{ return new wxZipEntry; }
wxZipInputStream *NewStream(wxInputStream& stream) const
{ return new wxZipInputStream(stream, GetConv()); }
wxZipOutputStream *NewStream(wxOutputStream& stream) const
{ return new wxZipOutputStream(stream, -1, GetConv()); }
+ wxZipInputStream *NewStream(wxInputStream *stream) const
+ { return new wxZipInputStream(stream, GetConv()); }
+ wxZipOutputStream *NewStream(wxOutputStream *stream) const
+ { return new wxZipOutputStream(stream, -1, GetConv()); }
wxString GetInternalName(const wxString& name,
wxPathFormat format = wxPATH_NATIVE) const
{ return wxZipEntry::GetInternalName(name, format); }
+ const wxChar * const *GetProtocols(wxStreamProtocolType type
+ = wxSTREAM_PROTOCOL) const;
+
protected:
wxArchiveEntry *DoNewEntry() const
{ return NewEntry(); }
{ 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(wxZipClassFactory)
#include "wx/buffer.h"
#include "wx/ptr_scpd.h"
#include "wx/wfstream.h"
-#include "wx/link.h"
#include "zlib.h"
// value for the 'version needed to extract' field (20 means 2.0)
IMPLEMENT_DYNAMIC_CLASS(wxZipEntry, wxArchiveEntry)
IMPLEMENT_DYNAMIC_CLASS(wxZipClassFactory, wxArchiveClassFactory)
-wxFORCE_LINK_THIS_MODULE(zipstrm)
-
/////////////////////////////////////////////////////////////////////////////
// Helpers
}
+/////////////////////////////////////////////////////////////////////////////
+// Class factory
+
+wxZipClassFactory g_wxZipClassFactory;
+
+wxZipClassFactory::wxZipClassFactory()
+{
+ if (this == &g_wxZipClassFactory)
+ PushFront();
+}
+
+const wxChar * const *
+wxZipClassFactory::GetProtocols(wxStreamProtocolType type) const
+{
+ static const wxChar *protocols[] = { _T("zip"), NULL };
+ static const wxChar *mimetypes[] = { _T("application/zip"), NULL };
+ static const wxChar *fileexts[] = { _T(".zip"), _T(".htb"), NULL };
+ static const wxChar *empty[] = { NULL };
+
+ switch (type) {
+ case wxSTREAM_PROTOCOL: return protocols;
+ case wxSTREAM_MIMETYPE: return mimetypes;
+ case wxSTREAM_FILEEXTENSION: return fileexts;
+ default: return empty;
+ }
+}
+
+
/////////////////////////////////////////////////////////////////////////////
// Read a zip header
// Collection of weak references to entries
WX_DECLARE_HASH_MAP(long, wxZipEntry*, wxIntegerHash,
- wxIntegerEqual, wx__OffsetZipEntryMap);
+ wxIntegerEqual, wxOffsetZipEntryMap_);
class wxZipWeakLinks
{
private:
~wxZipWeakLinks() { wxASSERT(IsEmpty()); }
- typedef wx__OffsetZipEntryMap::key_type key_type;
+ typedef wxOffsetZipEntryMap_::key_type key_type;
int m_ref;
- wx__OffsetZipEntryMap m_entries;
+ wxOffsetZipEntryMap_ m_entries;
wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(wxZipWeakLinks)
};
wxZipEntry *wxZipWeakLinks::GetEntry(wxFileOffset key) const
{
- wx__OffsetZipEntryMap::const_iterator it =
+ wxOffsetZipEntryMap_::const_iterator it =
m_entries.find(wx_truncate_cast(key_type, key));
return it != m_entries.end() ? it->second : NULL;
}
// Input stream
// leave the default wxZipEntryPtr free for users
-wxDECLARE_SCOPED_PTR(wxZipEntry, wx__ZipEntryPtr)
-wxDEFINE_SCOPED_PTR (wxZipEntry, wx__ZipEntryPtr)
+wxDECLARE_SCOPED_PTR(wxZipEntry, wxZipEntryPtr_)
+wxDEFINE_SCOPED_PTR (wxZipEntry, wxZipEntryPtr_)
// constructor
//
Init();
}
-#if 1 //WXWIN_COMPATIBILITY_2_6
+wxZipInputStream::wxZipInputStream(wxInputStream *stream,
+ wxMBConv& conv /*=wxConvLocal*/)
+ : wxArchiveInputStream(stream, conv)
+{
+ Init();
+}
+
+#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
// Part of the compatibility constructor, which has been made inline to
// avoid a problem with it not being exported by mingw 3.2.3
wxLogNull nolog;
Init();
m_allowSeeking = true;
- m_ffile = wx_static_cast(wxFFileInputStream*, m_parent_i_stream);
- wx__ZipEntryPtr entry;
+ wxFFileInputStream *ffile;
+ ffile = wx_static_cast(wxFFileInputStream*, m_parent_i_stream);
+ wxZipEntryPtr_ entry;
- if (m_ffile->Ok()) {
+ if (ffile->Ok()) {
do {
entry.reset(GetNextEntry());
}
m_lasterror = wxSTREAM_READ_ERROR;
}
-wxInputStream& wxZipInputStream::OpenFile(const wxString& archive)
+wxInputStream* wxZipInputStream::OpenFile(const wxString& archive)
{
wxLogNull nolog;
- return *new wxFFileInputStream(archive);
+ return new wxFFileInputStream(archive);
}
-#endif // WXWIN_COMPATIBILITY_2_6
+#endif // WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
void wxZipInputStream::Init()
{
m_signature = 0;
m_TotalEntries = 0;
m_lasterror = m_parent_i_stream->GetLastError();
- m_ffile = NULL;
-#if 1 //WXWIN_COMPATIBILITY_2_6
+#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
m_allowSeeking = false;
#endif
}
delete m_store;
delete m_inflate;
delete m_rawin;
- delete m_ffile;
m_weaklinks->Release(this);
if (!IsOk())
return NULL;
- wx__ZipEntryPtr entry(new wxZipEntry(m_entry));
+ wxZipEntryPtr_ entry(new wxZipEntry(m_entry));
entry->m_backlink = m_weaklinks->AddEntry(entry.get(), entry->GetKey());
return entry.release();
}
return count;
}
-#if 1 //WXWIN_COMPATIBILITY_2_6
+#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
// Borrowed from VS's zip stream (c) 1999 Vaclav Slavik
//
return pos;
}
-#endif // WXWIN_COMPATIBILITY_2_6
+#endif // WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE
/////////////////////////////////////////////////////////////////////////////
// Output stream
#include "wx/listimpl.cpp"
-WX_DEFINE_LIST(wx__ZipEntryList)
+WX_DEFINE_LIST(wxZipEntryList_)
wxZipOutputStream::wxZipOutputStream(wxOutputStream& stream,
int level /*=-1*/,
wxMBConv& conv /*=wxConvLocal*/)
- : wxArchiveOutputStream(stream, conv),
- m_store(new wxStoredOutputStream(stream)),
- m_deflate(NULL),
- m_backlink(NULL),
- m_initialData(new char[OUTPUT_LATENCY]),
- m_initialSize(0),
- m_pending(NULL),
- m_raw(false),
- m_headerOffset(0),
- m_headerSize(0),
- m_entrySize(0),
- m_comp(NULL),
- m_level(level),
- m_offsetAdjustment(wxInvalidOffset)
+ : wxArchiveOutputStream(stream, conv)
{
+ Init(level);
+}
+
+wxZipOutputStream::wxZipOutputStream(wxOutputStream *stream,
+ int level /*=-1*/,
+ wxMBConv& conv /*=wxConvLocal*/)
+ : wxArchiveOutputStream(stream, conv)
+{
+ Init(level);
+}
+
+void wxZipOutputStream::Init(int level)
+{
+ m_store = new wxStoredOutputStream(*m_parent_o_stream);
+ m_deflate = NULL;
+ m_backlink = NULL;
+ m_initialData = new char[OUTPUT_LATENCY];
+ m_initialSize = 0;
+ m_pending = NULL;
+ m_raw = false;
+ m_headerOffset = 0;
+ m_headerSize = 0;
+ m_entrySize = 0;
+ m_comp = NULL;
+ m_level = level;
+ m_offsetAdjustment = wxInvalidOffset;
}
wxZipOutputStream::~wxZipOutputStream()
{
Close();
- WX_CLEAR_LIST(wx__ZipEntryList, m_entries);
+ WX_CLEAR_LIST(wxZipEntryList_, m_entries);
delete m_store;
delete m_deflate;
delete m_pending;
bool wxZipOutputStream::CopyEntry(wxZipEntry *entry,
wxZipInputStream& inputStream)
{
- wx__ZipEntryPtr e(entry);
+ wxZipEntryPtr_ e(entry);
return
inputStream.DoOpen(e.get(), true) &&
void wxZipOutputStream::CreatePendingEntry(const void *buffer, size_t size)
{
wxASSERT(IsOk() && m_pending && !m_comp);
- wx__ZipEntryPtr spPending(m_pending);
+ wxZipEntryPtr_ spPending(m_pending);
m_pending = NULL;
Buffer bufs[] = {
void wxZipOutputStream::CreatePendingEntry()
{
wxASSERT(IsOk() && m_pending && !m_comp);
- wx__ZipEntryPtr spPending(m_pending);
+ wxZipEntryPtr_ spPending(m_pending);
m_pending = NULL;
m_lasterror = wxSTREAM_WRITE_ERROR;
{
CloseEntry();
- if (m_lasterror == wxSTREAM_WRITE_ERROR || m_entries.size() == 0)
+ if (m_lasterror == wxSTREAM_WRITE_ERROR || m_entries.size() == 0) {
+ wxFilterOutputStream::Close();
return false;
+ }
wxZipEndRec endrec;
endrec.SetOffset(m_headerOffset);
endrec.SetComment(m_Comment);
- wx__ZipEntryList::iterator it;
+ wxZipEntryList_::iterator it;
wxFileOffset size = 0;
for (it = m_entries.begin(); it != m_entries.end(); ++it) {
endrec.Write(*m_parent_o_stream, GetConv());
m_lasterror = m_parent_o_stream->GetLastError();
- if (!IsOk())
+
+ if (!wxFilterOutputStream::Close() || !IsOk())
return false;
m_lasterror = wxSTREAM_EOF;
return true;