]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement new features for finding class factories. Put seek inside 2.6 compat ifdef.
authorMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 09:54:39 +0000 (09:54 +0000)
committerMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 09:54:39 +0000 (09:54 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42509 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/zipstrm.h
src/common/fs_zip.cpp
src/common/zipstrm.cpp

index c2963a9e6b8e3deb3bca54c467f65e163fc451ed..37abe860c13324e70b302413db6d64a41fddecf3 100644 (file)
@@ -270,7 +270,7 @@ private:
 /////////////////////////////////////////////////////////////////////////////
 // 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
 {
@@ -278,6 +278,9 @@ public:
     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); }
@@ -316,6 +319,8 @@ protected:
         { 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);
@@ -329,7 +334,7 @@ private:
     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;
@@ -356,8 +361,9 @@ public:
     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
@@ -378,7 +384,7 @@ protected:
     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
 
@@ -389,7 +395,9 @@ protected:
 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(); }
 
@@ -414,7 +422,6 @@ private:
     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;
@@ -434,7 +441,7 @@ private:
     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
@@ -468,17 +475,26 @@ public:
     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(); }
@@ -486,6 +502,10 @@ protected:
         { 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)
index b8ef9b69f9abecca8f7595c3117465f4445843ce..f96f1b8ee3111565e0a847f7cb06eeaa4eab3ff4 100644 (file)
@@ -38,7 +38,7 @@ class wxZipFSInputStream : public wxZipInputStream
                : wxZipInputStream(*file->GetStream())
        {
             m_file = file;
-#if 1 //WXWIN_COMPATIBILITY_2_6
+#if WXWIN_COMPATIBILITY_2_6
             m_allowSeeking = true;
 #endif
        }
index 6116b8e0c54fe2993986badb58f452813870c8cb..83c3cfbeabfe183eeb9bfbcdcf8e5e968ab6126d 100644 (file)
@@ -29,7 +29,6 @@
 #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)
@@ -77,8 +76,6 @@ enum {
 IMPLEMENT_DYNAMIC_CLASS(wxZipEntry, wxArchiveEntry)
 IMPLEMENT_DYNAMIC_CLASS(wxZipClassFactory, wxArchiveClassFactory)
 
-wxFORCE_LINK_THIS_MODULE(zipstrm)
-
 
 /////////////////////////////////////////////////////////////////////////////
 // Helpers
@@ -139,6 +136,34 @@ static wxFileOffset QuietSeek(wxInputStream& stream, wxFileOffset pos)
 }
 
 
+/////////////////////////////////////////////////////////////////////////////
+// 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
 
@@ -614,7 +639,7 @@ static void Unique(wxZipMemory*& zm, size_t size)
 // Collection of weak references to entries
 
 WX_DECLARE_HASH_MAP(long, wxZipEntry*, wxIntegerHash,
-                    wxIntegerEqual, wx__OffsetZipEntryMap);
+                    wxIntegerEqual, wxOffsetZipEntryMap_);
 
 class wxZipWeakLinks
 {
@@ -635,10 +660,10 @@ public:
 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)
 };
@@ -652,7 +677,7 @@ wxZipWeakLinks *wxZipWeakLinks::AddEntry(wxZipEntry *entry, wxFileOffset key)
 
 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;
 }
@@ -1279,8 +1304,8 @@ private:
 // 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
 //
@@ -1291,7 +1316,14 @@ wxZipInputStream::wxZipInputStream(wxInputStream& stream,
     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
@@ -1302,10 +1334,11 @@ void wxZipInputStream::Init(const wxString& file)
     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());
         }
@@ -1316,13 +1349,13 @@ void wxZipInputStream::Init(const wxString& file)
         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()
 {
@@ -1340,8 +1373,7 @@ 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
 }
@@ -1353,7 +1385,6 @@ wxZipInputStream::~wxZipInputStream()
     delete m_store;
     delete m_inflate;
     delete m_rawin;
-    delete m_ffile;
 
     m_weaklinks->Release(this);
 
@@ -1524,7 +1555,7 @@ wxZipEntry *wxZipInputStream::GetNextEntry()
     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();
 }
@@ -1851,7 +1882,7 @@ size_t wxZipInputStream::OnSysRead(void *buffer, size_t size)
     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
 //
@@ -1916,39 +1947,52 @@ wxFileOffset wxZipInputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode)
     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;
@@ -1977,7 +2021,7 @@ bool wxZipOutputStream::PutNextDirEntry(
 bool wxZipOutputStream::CopyEntry(wxZipEntry *entry,
                                   wxZipInputStream& inputStream)
 {
-    wx__ZipEntryPtr e(entry);
+    wxZipEntryPtr_ e(entry);
 
     return
         inputStream.DoOpen(e.get(), true) &&
@@ -2147,7 +2191,7 @@ bool wxZipOutputStream::CloseCompressor(wxOutputStream *comp)
 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[] = {
@@ -2188,7 +2232,7 @@ void wxZipOutputStream::CreatePendingEntry(const void *buffer, size_t size)
 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;
 
@@ -2242,8 +2286,10 @@ bool wxZipOutputStream::Close()
 {
     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;
 
@@ -2252,7 +2298,7 @@ bool wxZipOutputStream::Close()
     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) {
@@ -2265,7 +2311,8 @@ bool wxZipOutputStream::Close()
     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;