wx/filesys.h \
wx/fontenc.h \
wx/fontmap.h \
+ wx/fs_arc.h \
wx/fs_filter.h \
wx/fs_mem.h \
wx/fs_zip.h \
wx/filesys.h \
wx/fontenc.h \
wx/fontmap.h \
+ wx/fs_arc.h \
wx/fs_filter.h \
wx/fs_mem.h \
wx/fs_zip.h \
src/common/filtall.cpp \
src/common/filtfind.cpp \
src/common/fmapbase.cpp \
+ src/common/fs_arc.cpp \
src/common/fs_filter.cpp \
src/common/fs_zip.cpp \
src/common/hash.cpp \
monodll_filtall.o \
monodll_filtfind.o \
monodll_fmapbase.o \
+ monodll_fs_arc.o \
monodll_fs_filter.o \
monodll_fs_zip.o \
monodll_hash.o \
monolib_filtall.o \
monolib_filtfind.o \
monolib_fmapbase.o \
+ monolib_fs_arc.o \
monolib_fs_filter.o \
monolib_fs_zip.o \
monolib_hash.o \
basedll_filtall.o \
basedll_filtfind.o \
basedll_fmapbase.o \
+ basedll_fs_arc.o \
basedll_fs_filter.o \
basedll_fs_zip.o \
basedll_hash.o \
baselib_filtall.o \
baselib_filtfind.o \
baselib_fmapbase.o \
+ baselib_fs_arc.o \
baselib_fs_filter.o \
baselib_fs_zip.o \
baselib_hash.o \
monodll_fmapbase.o: $(srcdir)/src/common/fmapbase.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/fmapbase.cpp
+monodll_fs_arc.o: $(srcdir)/src/common/fs_arc.cpp $(MONODLL_ODEP)
+ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/fs_arc.cpp
+
monodll_fs_filter.o: $(srcdir)/src/common/fs_filter.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/fs_filter.cpp
monolib_fmapbase.o: $(srcdir)/src/common/fmapbase.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/fmapbase.cpp
+monolib_fs_arc.o: $(srcdir)/src/common/fs_arc.cpp $(MONOLIB_ODEP)
+ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/fs_arc.cpp
+
monolib_fs_filter.o: $(srcdir)/src/common/fs_filter.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/fs_filter.cpp
basedll_fmapbase.o: $(srcdir)/src/common/fmapbase.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/fmapbase.cpp
+basedll_fs_arc.o: $(srcdir)/src/common/fs_arc.cpp $(BASEDLL_ODEP)
+ $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/fs_arc.cpp
+
basedll_fs_filter.o: $(srcdir)/src/common/fs_filter.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/fs_filter.cpp
baselib_fmapbase.o: $(srcdir)/src/common/fmapbase.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/fmapbase.cpp
+baselib_fs_arc.o: $(srcdir)/src/common/fs_arc.cpp $(BASELIB_ODEP)
+ $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/fs_arc.cpp
+
baselib_fs_filter.o: $(srcdir)/src/common/fs_filter.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/fs_filter.cpp
src/common/filtall.cpp
src/common/filtfind.cpp
src/common/fmapbase.cpp
+ src/common/fs_arc.cpp
src/common/fs_filter.cpp
src/common/fs_zip.cpp
src/common/hash.cpp
wx/filesys.h
wx/fontenc.h
wx/fontmap.h
+ wx/fs_arc.h
wx/fs_filter.h
wx/fs_mem.h
wx/fs_zip.h
$(OBJS)\monodll_filtall.obj \
$(OBJS)\monodll_filtfind.obj \
$(OBJS)\monodll_fmapbase.obj \
+ $(OBJS)\monodll_fs_arc.obj \
$(OBJS)\monodll_fs_filter.obj \
$(OBJS)\monodll_fs_zip.obj \
$(OBJS)\monodll_hash.obj \
$(OBJS)\monolib_filtall.obj \
$(OBJS)\monolib_filtfind.obj \
$(OBJS)\monolib_fmapbase.obj \
+ $(OBJS)\monolib_fs_arc.obj \
$(OBJS)\monolib_fs_filter.obj \
$(OBJS)\monolib_fs_zip.obj \
$(OBJS)\monolib_hash.obj \
$(OBJS)\basedll_filtall.obj \
$(OBJS)\basedll_filtfind.obj \
$(OBJS)\basedll_fmapbase.obj \
+ $(OBJS)\basedll_fs_arc.obj \
$(OBJS)\basedll_fs_filter.obj \
$(OBJS)\basedll_fs_zip.obj \
$(OBJS)\basedll_hash.obj \
$(OBJS)\baselib_filtall.obj \
$(OBJS)\baselib_filtfind.obj \
$(OBJS)\baselib_fmapbase.obj \
+ $(OBJS)\baselib_fs_arc.obj \
$(OBJS)\baselib_fs_filter.obj \
$(OBJS)\baselib_fs_zip.obj \
$(OBJS)\baselib_hash.obj \
$(OBJS)\monodll_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+$(OBJS)\monodll_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+
$(OBJS)\monodll_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
$(OBJS)\monolib_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+$(OBJS)\monolib_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+
$(OBJS)\monolib_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
$(OBJS)\basedll_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) $**
+$(OBJS)\basedll_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) $**
+
$(OBJS)\basedll_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) $**
$(OBJS)\baselib_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) $**
+$(OBJS)\baselib_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) $**
+
$(OBJS)\baselib_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) $**
$(OBJS)\monodll_filtall.o \
$(OBJS)\monodll_filtfind.o \
$(OBJS)\monodll_fmapbase.o \
+ $(OBJS)\monodll_fs_arc.o \
$(OBJS)\monodll_fs_filter.o \
$(OBJS)\monodll_fs_zip.o \
$(OBJS)\monodll_hash.o \
$(OBJS)\monolib_filtall.o \
$(OBJS)\monolib_filtfind.o \
$(OBJS)\monolib_fmapbase.o \
+ $(OBJS)\monolib_fs_arc.o \
$(OBJS)\monolib_fs_filter.o \
$(OBJS)\monolib_fs_zip.o \
$(OBJS)\monolib_hash.o \
$(OBJS)\basedll_filtall.o \
$(OBJS)\basedll_filtfind.o \
$(OBJS)\basedll_fmapbase.o \
+ $(OBJS)\basedll_fs_arc.o \
$(OBJS)\basedll_fs_filter.o \
$(OBJS)\basedll_fs_zip.o \
$(OBJS)\basedll_hash.o \
$(OBJS)\baselib_filtall.o \
$(OBJS)\baselib_filtfind.o \
$(OBJS)\baselib_fmapbase.o \
+ $(OBJS)\baselib_fs_arc.o \
$(OBJS)\baselib_fs_filter.o \
$(OBJS)\baselib_fs_zip.o \
$(OBJS)\baselib_hash.o \
$(OBJS)\monodll_fmapbase.o: ../../src/common/fmapbase.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\monodll_fs_arc.o: ../../src/common/fs_arc.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\monodll_fs_filter.o: ../../src/common/fs_filter.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\monolib_fmapbase.o: ../../src/common/fmapbase.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\monolib_fs_arc.o: ../../src/common/fs_arc.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\monolib_fs_filter.o: ../../src/common/fs_filter.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\basedll_fmapbase.o: ../../src/common/fmapbase.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\basedll_fs_arc.o: ../../src/common/fs_arc.cpp
+ $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\basedll_fs_filter.o: ../../src/common/fs_filter.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\baselib_fmapbase.o: ../../src/common/fmapbase.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\baselib_fs_arc.o: ../../src/common/fs_arc.cpp
+ $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\baselib_fs_filter.o: ../../src/common/fs_filter.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\monodll_filtall.obj \
$(OBJS)\monodll_filtfind.obj \
$(OBJS)\monodll_fmapbase.obj \
+ $(OBJS)\monodll_fs_arc.obj \
$(OBJS)\monodll_fs_filter.obj \
$(OBJS)\monodll_fs_zip.obj \
$(OBJS)\monodll_hash.obj \
$(OBJS)\monolib_filtall.obj \
$(OBJS)\monolib_filtfind.obj \
$(OBJS)\monolib_fmapbase.obj \
+ $(OBJS)\monolib_fs_arc.obj \
$(OBJS)\monolib_fs_filter.obj \
$(OBJS)\monolib_fs_zip.obj \
$(OBJS)\monolib_hash.obj \
$(OBJS)\basedll_filtall.obj \
$(OBJS)\basedll_filtfind.obj \
$(OBJS)\basedll_fmapbase.obj \
+ $(OBJS)\basedll_fs_arc.obj \
$(OBJS)\basedll_fs_filter.obj \
$(OBJS)\basedll_fs_zip.obj \
$(OBJS)\basedll_hash.obj \
$(OBJS)\baselib_filtall.obj \
$(OBJS)\baselib_filtfind.obj \
$(OBJS)\baselib_fmapbase.obj \
+ $(OBJS)\baselib_fs_arc.obj \
$(OBJS)\baselib_fs_filter.obj \
$(OBJS)\baselib_fs_zip.obj \
$(OBJS)\baselib_hash.obj \
$(OBJS)\monodll_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+$(OBJS)\monodll_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+
$(OBJS)\monodll_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
$(OBJS)\monolib_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+$(OBJS)\monolib_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+
$(OBJS)\monolib_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
$(OBJS)\basedll_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) $**
+$(OBJS)\basedll_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) $**
+
$(OBJS)\basedll_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) $**
$(OBJS)\baselib_fmapbase.obj: ..\..\src\common\fmapbase.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) $**
+$(OBJS)\baselib_fs_arc.obj: ..\..\src\common\fs_arc.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) $**
+
$(OBJS)\baselib_fs_filter.obj: ..\..\src\common\fs_filter.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) $**
$(OBJS)\monodll_filtall.obj &
$(OBJS)\monodll_filtfind.obj &
$(OBJS)\monodll_fmapbase.obj &
+ $(OBJS)\monodll_fs_arc.obj &
$(OBJS)\monodll_fs_filter.obj &
$(OBJS)\monodll_fs_zip.obj &
$(OBJS)\monodll_hash.obj &
$(OBJS)\monolib_filtall.obj &
$(OBJS)\monolib_filtfind.obj &
$(OBJS)\monolib_fmapbase.obj &
+ $(OBJS)\monolib_fs_arc.obj &
$(OBJS)\monolib_fs_filter.obj &
$(OBJS)\monolib_fs_zip.obj &
$(OBJS)\monolib_hash.obj &
$(OBJS)\basedll_filtall.obj &
$(OBJS)\basedll_filtfind.obj &
$(OBJS)\basedll_fmapbase.obj &
+ $(OBJS)\basedll_fs_arc.obj &
$(OBJS)\basedll_fs_filter.obj &
$(OBJS)\basedll_fs_zip.obj &
$(OBJS)\basedll_hash.obj &
$(OBJS)\baselib_filtall.obj &
$(OBJS)\baselib_filtfind.obj &
$(OBJS)\baselib_fmapbase.obj &
+ $(OBJS)\baselib_fs_arc.obj &
$(OBJS)\baselib_fs_filter.obj &
$(OBJS)\baselib_fs_zip.obj &
$(OBJS)\baselib_hash.obj &
$(OBJS)\monodll_fmapbase.obj : .AUTODEPEND ..\..\src\common\fmapbase.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+$(OBJS)\monodll_fs_arc.obj : .AUTODEPEND ..\..\src\common\fs_arc.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+
$(OBJS)\monodll_fs_filter.obj : .AUTODEPEND ..\..\src\common\fs_filter.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
$(OBJS)\monolib_fmapbase.obj : .AUTODEPEND ..\..\src\common\fmapbase.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+$(OBJS)\monolib_fs_arc.obj : .AUTODEPEND ..\..\src\common\fs_arc.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+
$(OBJS)\monolib_fs_filter.obj : .AUTODEPEND ..\..\src\common\fs_filter.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
$(OBJS)\basedll_fmapbase.obj : .AUTODEPEND ..\..\src\common\fmapbase.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<
+$(OBJS)\basedll_fs_arc.obj : .AUTODEPEND ..\..\src\common\fs_arc.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<
+
$(OBJS)\basedll_fs_filter.obj : .AUTODEPEND ..\..\src\common\fs_filter.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<
$(OBJS)\baselib_fmapbase.obj : .AUTODEPEND ..\..\src\common\fmapbase.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<
+$(OBJS)\baselib_fs_arc.obj : .AUTODEPEND ..\..\src\common\fs_arc.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<
+
$(OBJS)\baselib_fs_filter.obj : .AUTODEPEND ..\..\src\common\fs_filter.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<
# End Source File
# Begin Source File
+SOURCE=..\..\src\common\fs_arc.cpp
+# End Source File
+# Begin Source File
+
SOURCE=..\..\src\common\fs_filter.cpp
# End Source File
# Begin Source File
# End Source File
# Begin Source File
+SOURCE=..\..\include\wx\fs_arc.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\include\wx\fs_filter.h
# End Source File
# Begin Source File
- Added wxFFile overload to wxFileName::CreateTemporaryFileName().
- Added wxBackingFile and wxBackedInputStream.
- Added GetTempDir() to wxFileName and wxStandardPaths.
-- Added wxFilterFSHandler.
+- Added wxTar streams.
+- Added wxFilterFSHandler and wxArchiveFSHandler.
All (GUI):
/////////////////////////////////////////////////////////////////////////////
-// Name: fs_zip.h
-// Purpose: ZIP file system
-// Author: Vaclav Slavik
-// Copyright: (c) 1999 Vaclav Slavik
+// Name: fs_arc.h
+// Purpose: Archive file system
+// Author: Vaclav Slavik, Mike Wetherell
+// Copyright: (c) 1999 Vaclav Slavik, (c) 2006 Mike Wetherell
// CVS-ID: $Id$
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifndef _WX_FS_ZIP_H_
-#define _WX_FS_ZIP_H_
+#ifndef _WX_FS_ARC_H_
+#define _WX_FS_ARC_H_
#include "wx/defs.h"
-#if wxUSE_FILESYSTEM && wxUSE_FS_ZIP && wxUSE_STREAMS
+#if wxUSE_FS_ARCHIVE
#include "wx/filesys.h"
#include "wx/hashmap.h"
-
-WX_DECLARE_STRING_HASH_MAP(int, wxZipFilenameHashMap);
-
+WX_DECLARE_STRING_HASH_MAP(int, wxArchiveFilenameHashMap);
//---------------------------------------------------------------------------
-// wxZipFSHandler
+// wxArchiveFSHandler
//---------------------------------------------------------------------------
-class WXDLLIMPEXP_BASE wxZipFSHandler : public wxFileSystemHandler
+class WXDLLIMPEXP_BASE wxArchiveFSHandler : public wxFileSystemHandler
{
- public:
- wxZipFSHandler();
- virtual bool CanOpen(const wxString& location);
- virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location);
- virtual wxString FindFirst(const wxString& spec, int flags = 0);
- virtual wxString FindNext();
- void Cleanup();
- virtual ~wxZipFSHandler();
-
- private:
- // these vars are used by FindFirst/Next:
- class wxZipInputStream *m_Archive;
- wxString m_Pattern, m_BaseDir, m_ZipFile;
- bool m_AllowDirs, m_AllowFiles;
- wxZipFilenameHashMap *m_DirsFound;
-
- wxString DoFind();
-
- DECLARE_NO_COPY_CLASS(wxZipFSHandler)
+public:
+ wxArchiveFSHandler();
+ virtual bool CanOpen(const wxString& location);
+ virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location);
+ virtual wxString FindFirst(const wxString& spec, int flags = 0);
+ virtual wxString FindNext();
+ void Cleanup();
+ virtual ~wxArchiveFSHandler();
+
+private:
+ class wxArchiveFSCache *m_cache;
+ wxFileSystem m_fs;
+
+ // these vars are used by FindFirst/Next:
+ class wxArchiveFSCacheData *m_Archive;
+ class wxArchiveFSEntry *m_FindEntry;
+ wxString m_Pattern, m_BaseDir, m_ZipFile;
+ bool m_AllowDirs, m_AllowFiles;
+ wxArchiveFilenameHashMap *m_DirsFound;
+
+ wxString DoFind();
+
+ DECLARE_NO_COPY_CLASS(wxArchiveFSHandler)
+ DECLARE_DYNAMIC_CLASS(wxArchiveFSHandler)
};
+#endif // wxUSE_FS_ARCHIVE
-#endif
- // wxUSE_FILESYSTEM && wxUSE_FS_ZIP && wxUSE_STREAMS
-
-#endif // _WX_FS_ZIP_H_
-
+#endif // _WX_FS_ARC_H_
/////////////////////////////////////////////////////////////////////////////
-// Name: fs_zip.cpp
-// Purpose: ZIP file system
-// Author: Vaclav Slavik
-// Copyright: (c) 1999 Vaclav Slavik
+// Name: fs_arc.cpp
+// Purpose: wxArchive file system
+// Author: Vaclav Slavik, Mike Wetherell
+// Copyright: (c) 1999 Vaclav Slavik, (c) 2006 Mike Wetherell
// CVS-ID: $Id$
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#pragma hdrstop
#endif
-#if wxUSE_FILESYSTEM && wxUSE_FS_ZIP && wxUSE_ZIPSTREAM && wxUSE_ZLIB
+#if wxUSE_FS_ARCHIVE
+
+#include "wx/fs_arc.h"
#ifndef WXPRECOMP
#include "wx/intl.h"
#include "wx/log.h"
#endif
-#include "wx/filesys.h"
-#include "wx/wfstream.h"
-#include "wx/zipstrm.h"
-#include "wx/fs_zip.h"
+#include "wx/archive.h"
+#include "wx/fileback.h"
+#include "wx/thread.h"
+
+//---------------------------------------------------------------------------
+// wxArchiveFSCacheDataImpl
+//
+// Holds the catalog of an archive file, and if it is being read from a
+// non-seekable stream, a copy of its backing file.
+//
+// This class is actually the reference counted implementation for the
+// wxArchiveFSCacheData class below. It was done that way to allow sharing
+// between instances of wxFileSystem, though that's a feature not used in this
+// version.
+//---------------------------------------------------------------------------
+
+WX_DECLARE_STRING_HASH_MAP(wxArchiveEntry*, wxArchiveFSEntryHash);
+
+struct wxArchiveFSEntry
+{
+ wxArchiveEntry *entry;
+ wxArchiveFSEntry *next;
+};
+
+class wxArchiveFSCacheDataImpl
+{
+public:
+ wxArchiveFSCacheDataImpl(const wxArchiveClassFactory& factory,
+ const wxBackingFile& backer);
+ wxArchiveFSCacheDataImpl(const wxArchiveClassFactory& factory,
+ wxInputStream *stream);
+
+ ~wxArchiveFSCacheDataImpl();
+
+ void Release() { if (--m_refcount == 0) delete this; }
+ wxArchiveFSCacheDataImpl *AddRef() { m_refcount++; return this; }
+
+ wxArchiveEntry *Get(const wxString& name);
+ wxInputStream *NewStream() const;
+
+ wxArchiveFSEntry *GetNext(wxArchiveFSEntry *fse);
+private:
+ wxArchiveFSEntry *AddToCache(wxArchiveEntry *entry);
+ void CloseStreams();
+
+ int m_refcount;
+
+ wxArchiveFSEntryHash m_hash;
+ wxArchiveFSEntry *m_begin;
+ wxArchiveFSEntry **m_endptr;
+
+ wxBackingFile m_backer;
+ wxInputStream *m_stream;
+ wxArchiveInputStream *m_archive;
+};
+
+wxArchiveFSCacheDataImpl::wxArchiveFSCacheDataImpl(
+ const wxArchiveClassFactory& factory,
+ const wxBackingFile& backer)
+ : m_refcount(1),
+ m_begin(NULL),
+ m_endptr(&m_begin),
+ m_backer(backer),
+ m_stream(new wxBackedInputStream(backer)),
+ m_archive(factory.NewStream(*m_stream))
+{
+}
+
+wxArchiveFSCacheDataImpl::wxArchiveFSCacheDataImpl(
+ const wxArchiveClassFactory& factory,
+ wxInputStream *stream)
+ : m_refcount(1),
+ m_begin(NULL),
+ m_endptr(&m_begin),
+ m_stream(stream),
+ m_archive(factory.NewStream(*m_stream))
+{
+}
+
+wxArchiveFSCacheDataImpl::~wxArchiveFSCacheDataImpl()
+{
+ WX_CLEAR_HASH_MAP(wxArchiveFSEntryHash, m_hash);
+
+ wxArchiveFSEntry *entry = m_begin;
+
+ while (entry)
+ {
+ wxArchiveFSEntry *next = entry->next;
+ delete entry;
+ entry = next;
+ }
+
+ CloseStreams();
+}
+
+wxArchiveFSEntry *wxArchiveFSCacheDataImpl::AddToCache(wxArchiveEntry *entry)
+{
+ m_hash[entry->GetName()] = entry;
+ wxArchiveFSEntry *fse = new wxArchiveFSEntry;
+ *m_endptr = fse;
+ (*m_endptr)->entry = entry;
+ (*m_endptr)->next = NULL;
+ m_endptr = &(*m_endptr)->next;
+ return fse;
+}
+
+void wxArchiveFSCacheDataImpl::CloseStreams()
+{
+ delete m_archive;
+ m_archive = NULL;
+ delete m_stream;
+ m_stream = NULL;
+}
+
+wxArchiveEntry *wxArchiveFSCacheDataImpl::Get(const wxString& name)
+{
+ wxArchiveFSEntryHash::iterator it = m_hash.find(name);
+
+ if (it != m_hash.end())
+ return it->second;
+
+ if (!m_archive)
+ return NULL;
+
+ wxArchiveEntry *entry;
+
+ while ((entry = m_archive->GetNextEntry()) != NULL)
+ {
+ AddToCache(entry);
+
+ if (entry->GetName() == name)
+ return entry;
+ }
+
+ CloseStreams();
+
+ return NULL;
+}
+
+wxInputStream* wxArchiveFSCacheDataImpl::NewStream() const
+{
+ if (m_backer)
+ return new wxBackedInputStream(m_backer);
+ else
+ return NULL;
+}
+
+wxArchiveFSEntry *wxArchiveFSCacheDataImpl::GetNext(wxArchiveFSEntry *fse)
+{
+ wxArchiveFSEntry *next = fse ? fse->next : m_begin;
+
+ if (!next && m_archive)
+ {
+ wxArchiveEntry *entry = m_archive->GetNextEntry();
+
+ if (entry)
+ next = AddToCache(entry);
+ else
+ CloseStreams();
+ }
+
+ return next;
+}
//---------------------------------------------------------------------------
-// wxZipFSInputStream
+// wxArchiveFSCacheData
+//
+// This is the inteface for wxArchiveFSCacheDataImpl above. Holds the catalog
+// of an archive file, and if it is being read from a non-seekable stream, a
+// copy of its backing file.
//---------------------------------------------------------------------------
-// Helper class for wxZipFSHandler
-class wxZipFSInputStream : public wxZipInputStream
+class wxArchiveFSCacheData
{
- public:
- wxZipFSInputStream(wxFSFile *file)
- : wxZipInputStream(*file->GetStream())
- {
- m_file = file;
-#if WXWIN_COMPATIBILITY_2_6
- m_allowSeeking = true;
-#endif
- }
+public:
+ wxArchiveFSCacheData() : m_impl(NULL) { }
+ wxArchiveFSCacheData(const wxArchiveClassFactory& factory,
+ const wxBackingFile& backer);
+ wxArchiveFSCacheData(const wxArchiveClassFactory& factory,
+ wxInputStream *stream);
+
+ wxArchiveFSCacheData(const wxArchiveFSCacheData& data);
+ wxArchiveFSCacheData& operator=(const wxArchiveFSCacheData& data);
+
+ ~wxArchiveFSCacheData() { if (m_impl) m_impl->Release(); }
+
+ wxArchiveEntry *Get(const wxString& name) { return m_impl->Get(name); }
+ wxInputStream *NewStream() const { return m_impl->NewStream(); }
+ wxArchiveFSEntry *GetNext(wxArchiveFSEntry *fse)
+ { return m_impl->GetNext(fse); }
+
+private:
+ wxArchiveFSCacheDataImpl *m_impl;
+};
- virtual ~wxZipFSInputStream() { delete m_file; }
+wxArchiveFSCacheData::wxArchiveFSCacheData(
+ const wxArchiveClassFactory& factory,
+ const wxBackingFile& backer)
+ : m_impl(new wxArchiveFSCacheDataImpl(factory, backer))
+{
+}
+
+wxArchiveFSCacheData::wxArchiveFSCacheData(
+ const wxArchiveClassFactory& factory,
+ wxInputStream *stream)
+ : m_impl(new wxArchiveFSCacheDataImpl(factory, stream))
+{
+}
+
+wxArchiveFSCacheData::wxArchiveFSCacheData(const wxArchiveFSCacheData& data)
+ : m_impl(data.m_impl ? data.m_impl->AddRef() : NULL)
+{
+}
+
+wxArchiveFSCacheData& wxArchiveFSCacheData::operator=(
+ const wxArchiveFSCacheData& data)
+{
+ if (data.m_impl != m_impl)
+ {
+ if (m_impl)
+ m_impl->Release();
+
+ m_impl = data.m_impl;
+
+ if (m_impl)
+ m_impl->AddRef();
+ }
- private:
- wxFSFile *m_file;
+ return *this;
+}
+
+//---------------------------------------------------------------------------
+// wxArchiveFSCache
+//
+// wxArchiveFSCacheData caches a single archive, and this class holds a
+// collection of them to cache all the archives accessed by this instance
+// of wxFileSystem.
+//---------------------------------------------------------------------------
+
+WX_DECLARE_STRING_HASH_MAP(wxArchiveFSCacheData, wxArchiveFSCacheDataHash);
+
+class wxArchiveFSCache
+{
+public:
+ wxArchiveFSCache() { }
+ ~wxArchiveFSCache() { }
+
+ wxArchiveFSCacheData* Add(const wxString& name,
+ const wxArchiveClassFactory& factory,
+ wxInputStream *stream);
+
+ wxArchiveFSCacheData *Get(const wxString& name);
+
+private:
+ wxArchiveFSCacheDataHash m_hash;
};
+wxArchiveFSCacheData* wxArchiveFSCache::Add(
+ const wxString& name,
+ const wxArchiveClassFactory& factory,
+ wxInputStream *stream)
+{
+ wxArchiveFSCacheData& data(m_hash[name]);
+
+ if (stream->IsSeekable())
+ data = wxArchiveFSCacheData(factory, stream);
+ else
+ data = wxArchiveFSCacheData(factory, wxBackingFile(stream));
+
+ return &data;
+}
+
+wxArchiveFSCacheData *wxArchiveFSCache::Get(const wxString& name)
+{
+ wxArchiveFSCacheDataHash::iterator it;
+
+ if ((it = m_hash.find(name)) != m_hash.end())
+ return &it->second;
+
+ return NULL;
+}
+
//----------------------------------------------------------------------------
-// wxZipFSHandler
+// wxArchiveFSHandler
//----------------------------------------------------------------------------
-wxZipFSHandler::wxZipFSHandler() : wxFileSystemHandler()
+IMPLEMENT_DYNAMIC_CLASS(wxArchiveFSHandler, wxFileSystemHandler)
+
+wxArchiveFSHandler::wxArchiveFSHandler()
+ : wxFileSystemHandler()
{
m_Archive = NULL;
+ m_FindEntry = NULL;
m_ZipFile = m_Pattern = m_BaseDir = wxEmptyString;
m_AllowDirs = m_AllowFiles = true;
m_DirsFound = NULL;
+ m_cache = NULL;
}
-
-
-wxZipFSHandler::~wxZipFSHandler()
+wxArchiveFSHandler::~wxArchiveFSHandler()
{
Cleanup();
+ delete m_cache;
}
-
-void wxZipFSHandler::Cleanup()
+void wxArchiveFSHandler::Cleanup()
{
- wxDELETE(m_Archive);
wxDELETE(m_DirsFound);
}
-
-
-bool wxZipFSHandler::CanOpen(const wxString& location)
+bool wxArchiveFSHandler::CanOpen(const wxString& location)
{
wxString p = GetProtocol(location);
- return (p == wxT("zip"));
+ return wxArchiveClassFactory::Find(p) != NULL;
}
-
-wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location)
+wxFSFile* wxArchiveFSHandler::OpenFile(
+ wxFileSystem& WXUNUSED(fs),
+ const wxString& location)
{
wxString right = GetRightLocation(location);
wxString left = GetLeftLocation(location);
- wxZipInputStream *s;
+ wxString protocol = GetProtocol(location);
+ wxString key = left + wxT("#") + protocol + wxT(":");
if (right.Contains(wxT("./")))
{
if (right.GetChar(0) == wxT('/')) right = right.Mid(1);
- // a new wxFileSystem object is needed here to avoid infinite recursion
- wxFSFile *leftFile = wxFileSystem().OpenFile(left);
- if (!leftFile)
- return NULL;
+ if (!m_cache)
+ m_cache = new wxArchiveFSCache;
- s = new wxZipFSInputStream(leftFile);
- if (s && s->IsOk())
+ const wxArchiveClassFactory *factory;
+ factory = wxArchiveClassFactory::Find(protocol);
+ if (!factory)
+ return NULL;
+
+ wxArchiveFSCacheData *cached = m_cache->Get(key);
+ if (!cached)
{
-#if wxUSE_DATETIME
- wxDateTime dtMod;
-#endif // wxUSE_DATETIME
+ wxFSFile *leftFile = m_fs.OpenFile(left);
+ if (!leftFile)
+ return NULL;
+ cached = m_cache->Add(key, *factory, leftFile->DetachStream());
+ delete leftFile;
+ }
+
+ wxArchiveEntry *entry = cached->Get(right);
+ if (!entry)
+ return NULL;
+
+ wxInputStream *leftStream = cached->NewStream();
+ if (!leftStream)
+ {
+ wxFSFile *leftFile = m_fs.OpenFile(left);
+ if (!leftFile)
+ return NULL;
+ leftStream = leftFile->DetachStream();
+ delete leftFile;
+ }
- bool found = false;
- while (!found)
- {
- wxZipEntry *ent = s->GetNextEntry();
- if (!ent)
- break;
-
- if (ent->GetInternalName() == right)
- {
- found = true;
- dtMod = ent->GetDateTime();
- }
-
- delete ent;
- }
- if (found)
- {
- return new wxFSFile(s,
- left + wxT("#zip:") + right,
+ wxArchiveInputStream *s = factory->NewStream(leftStream);
+ s->OpenEntry(*entry);
+
+ if (s && s->IsOk())
+ return new wxFSFile(s,
+ key + right,
GetMimeTypeFromExt(location),
GetAnchor(location)
#if wxUSE_DATETIME
- , dtMod
+ , entry->GetDateTime()
#endif // wxUSE_DATETIME
);
- }
- }
delete s;
return NULL;
}
-
-
-wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
+wxString wxArchiveFSHandler::FindFirst(const wxString& spec, int flags)
{
wxString right = GetRightLocation(spec);
wxString left = GetLeftLocation(spec);
+ wxString protocol = GetProtocol(spec);
+ wxString key = left + wxT("#") + protocol + wxT(":");
if (!right.empty() && right.Last() == wxT('/')) right.RemoveLast();
- if (m_Archive)
+ if (!m_cache)
+ m_cache = new wxArchiveFSCache;
+
+ const wxArchiveClassFactory *factory;
+ factory = wxArchiveClassFactory::Find(protocol);
+ if (!factory)
+ return wxEmptyString;
+
+ m_Archive = m_cache->Get(key);
+ if (!m_Archive)
{
- delete m_Archive;
- m_Archive = NULL;
+ wxFSFile *leftFile = m_fs.OpenFile(left);
+ if (!leftFile)
+ return wxEmptyString;
+ m_Archive = m_cache->Add(key, *factory, leftFile->DetachStream());
+ delete leftFile;
}
+ m_FindEntry = NULL;
+
switch (flags)
{
case wxFILE:
m_AllowDirs = m_AllowFiles = true; break;
}
- m_ZipFile = left;
-
- wxFSFile *leftFile = wxFileSystem().OpenFile(left);
- if (leftFile)
- m_Archive = new wxZipFSInputStream(leftFile);
+ m_ZipFile = key;
m_Pattern = right.AfterLast(wxT('/'));
m_BaseDir = right.BeforeLast(wxT('/'));
if (m_AllowDirs)
{
delete m_DirsFound;
- m_DirsFound = new wxZipFilenameHashMap();
+ m_DirsFound = new wxArchiveFilenameHashMap();
if (right.empty()) // allow "/" to match the archive root
return spec;
}
return wxEmptyString;
}
-
-
-wxString wxZipFSHandler::FindNext()
+wxString wxArchiveFSHandler::FindNext()
{
if (!m_Archive) return wxEmptyString;
return DoFind();
}
-
-
-wxString wxZipFSHandler::DoFind()
+wxString wxArchiveFSHandler::DoFind()
{
wxString namestr, dir, filename;
wxString match = wxEmptyString;
while (match == wxEmptyString)
{
- wxZipEntry *entry = m_Archive->GetNextEntry();
- if (!entry)
+ m_FindEntry = m_Archive->GetNext(m_FindEntry);
+
+ if (!m_FindEntry)
{
- delete m_Archive;
m_Archive = NULL;
+ m_FindEntry = NULL;
break;
}
- namestr = entry->GetName(wxPATH_UNIX);
- delete entry;
+ namestr = m_FindEntry->entry->GetName(wxPATH_UNIX);
if (m_AllowDirs)
{
dir = dir.BeforeLast(wxT('/'));
if (!filename.empty() && m_BaseDir == dir &&
wxMatchWild(m_Pattern, filename, false))
- match = m_ZipFile + wxT("#zip:") + dir + wxT("/") + filename;
+ match = m_ZipFile + dir + wxT("/") + filename;
}
else
break; // already tranversed
dir = namestr.BeforeLast(wxT('/'));
if (m_AllowFiles && !filename.empty() && m_BaseDir == dir &&
wxMatchWild(m_Pattern, filename, false))
- match = m_ZipFile + wxT("#zip:") + namestr;
+ match = m_ZipFile + namestr;
}
return match;
}
-
-
-#endif
- //wxUSE_FILESYSTEM && wxUSE_FS_ZIP && wxUSE_ZIPSTREAM
+#endif // wxUSE_FS_ARCHIVE
# End Source File
# Begin Source File
+SOURCE=.\common\fs_arc.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\common\fs_filter.cpp
# End Source File
# Begin Source File
# End Source File
# Begin Source File
+SOURCE=..\include\wx\fs_arc.h
+# End Source File
+# Begin Source File
+
SOURCE=..\include\wx\fs_filter.h
# End Source File
# Begin Source File
wx/filesys.h
wx/fontenc.h
wx/fontmap.h
+wx/fs_arc.h
wx/fs_filter.h
wx/fs_mem.h
wx/fs_zip.h
wx/filesys.h
wx/fontenc.h
wx/fontmap.h
+wx/fs_arc.h
wx/fs_filter.h
wx/fs_mem.h
wx/fs_zip.h
wx/filesys.h
wx/fontenc.h
wx/fontmap.h
+wx/fs_arc.h
wx/fs_filter.h
wx/fs_mem.h
wx/fs_zip.h