]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxArchiveFSHandler.
authorMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 22:10:19 +0000 (22:10 +0000)
committerMichael Wetherell <mike.wetherell@ntlworld.com>
Fri, 27 Oct 2006 22:10:19 +0000 (22:10 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42544 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

14 files changed:
Makefile.in
build/bakefiles/files.bkl
build/msw/makefile.bcc
build/msw/makefile.gcc
build/msw/makefile.vc
build/msw/makefile.wat
build/msw/wx_base.dsp
docs/changes.txt
include/wx/fs_arc.h
src/common/fs_arc.cpp
src/wxWindows.dsp
wxGTK.spec
wxMotif.spec
wxX11.spec

index 16ddf54e76d6ae99759226cf48e5e4dd1b010fc4..d0e0729e4f97d1f60045f0cc0f26f38fbb888ba5 100644 (file)
@@ -259,6 +259,7 @@ ALL_BASE_HEADERS =  \
        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 \
@@ -393,6 +394,7 @@ ALL_PORTS_BASE_HEADERS =  \
        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 \
@@ -550,6 +552,7 @@ ALL_BASE_SOURCES =  \
        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 \
@@ -705,6 +708,7 @@ MONODLL_OBJECTS =  \
        monodll_filtall.o \
        monodll_filtfind.o \
        monodll_fmapbase.o \
+       monodll_fs_arc.o \
        monodll_fs_filter.o \
        monodll_fs_zip.o \
        monodll_hash.o \
@@ -804,6 +808,7 @@ MONOLIB_OBJECTS =  \
        monolib_filtall.o \
        monolib_filtfind.o \
        monolib_fmapbase.o \
+       monolib_fs_arc.o \
        monolib_fs_filter.o \
        monolib_fs_zip.o \
        monolib_hash.o \
@@ -905,6 +910,7 @@ BASEDLL_OBJECTS =  \
        basedll_filtall.o \
        basedll_filtfind.o \
        basedll_fmapbase.o \
+       basedll_fs_arc.o \
        basedll_fs_filter.o \
        basedll_fs_zip.o \
        basedll_hash.o \
@@ -989,6 +995,7 @@ BASELIB_OBJECTS =  \
        baselib_filtall.o \
        baselib_filtfind.o \
        baselib_fmapbase.o \
+       baselib_fs_arc.o \
        baselib_fs_filter.o \
        baselib_fs_zip.o \
        baselib_hash.o \
@@ -12225,6 +12232,9 @@ monodll_filtfind.o: $(srcdir)/src/common/filtfind.cpp $(MONODLL_ODEP)
 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
 
@@ -16317,6 +16327,9 @@ monolib_filtfind.o: $(srcdir)/src/common/filtfind.cpp $(MONOLIB_ODEP)
 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
 
@@ -20412,6 +20425,9 @@ basedll_filtfind.o: $(srcdir)/src/common/filtfind.cpp $(BASEDLL_ODEP)
 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
 
@@ -20997,6 +21013,9 @@ baselib_filtfind.o: $(srcdir)/src/common/filtfind.cpp $(BASELIB_ODEP)
 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
 
index a9221ee003c62969915de841703b702f15cff24b..368797cd92b64070ddaa80e2ac2f888d678f9ec5 100644 (file)
@@ -314,6 +314,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     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
@@ -401,6 +402,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this 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
index 62e84e34430ae6bae31d604170eb3ae55c2bcac0..b300fd09d9e2e97a626055129e0197a3d5f21938 100644 (file)
@@ -228,6 +228,7 @@ MONODLL_OBJECTS =  \
        $(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 \
@@ -348,6 +349,7 @@ MONOLIB_OBJECTS =  \
        $(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 \
@@ -469,6 +471,7 @@ BASEDLL_OBJECTS =  \
        $(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 \
@@ -574,6 +577,7 @@ BASELIB_OBJECTS =  \
        $(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 \
@@ -4575,6 +4579,9 @@ $(OBJS)\monodll_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
@@ -6551,6 +6558,9 @@ $(OBJS)\monolib_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
@@ -8530,6 +8540,9 @@ $(OBJS)\basedll_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
@@ -8797,6 +8810,9 @@ $(OBJS)\baselib_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
index 6b9525e615a079f46ade5935230b8f906f80d374..fc57f0e27bb97e6cd17a131555c020d57cfaed00 100644 (file)
@@ -214,6 +214,7 @@ MONODLL_OBJECTS =  \
        $(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 \
@@ -334,6 +335,7 @@ MONOLIB_OBJECTS =  \
        $(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 \
@@ -456,6 +458,7 @@ BASEDLL_OBJECTS =  \
        $(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 \
@@ -561,6 +564,7 @@ BASELIB_OBJECTS =  \
        $(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 \
@@ -4692,6 +4696,9 @@ $(OBJS)\monodll_filtfind.o: ../../src/common/filtfind.cpp
 $(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) $<
 
@@ -6768,6 +6775,9 @@ $(OBJS)\monolib_filtfind.o: ../../src/common/filtfind.cpp
 $(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) $<
 
@@ -8847,6 +8857,9 @@ $(OBJS)\basedll_filtfind.o: ../../src/common/filtfind.cpp
 $(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) $<
 
@@ -9114,6 +9127,9 @@ $(OBJS)\baselib_filtfind.o: ../../src/common/filtfind.cpp
 $(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) $<
 
index 7c87a574b6d0aeda01521cd508134e8ceb9922d4..bcaa7a50797c1216f0a132a7e669a9edcd0c68f0 100644 (file)
@@ -229,6 +229,7 @@ MONODLL_OBJECTS =  \
        $(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 \
@@ -354,6 +355,7 @@ MONOLIB_OBJECTS =  \
        $(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 \
@@ -481,6 +483,7 @@ BASEDLL_OBJECTS =  \
        $(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 \
@@ -592,6 +595,7 @@ BASELIB_OBJECTS =  \
        $(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 \
@@ -4908,6 +4912,9 @@ $(OBJS)\monodll_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
@@ -6884,6 +6891,9 @@ $(OBJS)\monolib_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
@@ -8863,6 +8873,9 @@ $(OBJS)\basedll_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
@@ -9130,6 +9143,9 @@ $(OBJS)\baselib_filtfind.obj: ..\..\src\common\filtfind.cpp
 $(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) $**
 
index e80969e7ec6247b40168d201c143e8c44fb5f436..2947cde991b1dad482dc20f04799051a8a250a13 100644 (file)
@@ -2933,6 +2933,7 @@ MONODLL_OBJECTS =  &
        $(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 &
@@ -3053,6 +3054,7 @@ MONOLIB_OBJECTS =  &
        $(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 &
@@ -3175,6 +3177,7 @@ BASEDLL_OBJECTS =  &
        $(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 &
@@ -3281,6 +3284,7 @@ BASELIB_OBJECTS =  &
        $(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 &
@@ -4920,6 +4924,9 @@ $(OBJS)\monodll_filtfind.obj :  .AUTODEPEND ..\..\src\common\filtfind.cpp
 $(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) $<
 
@@ -6996,6 +7003,9 @@ $(OBJS)\monolib_filtfind.obj :  .AUTODEPEND ..\..\src\common\filtfind.cpp
 $(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) $<
 
@@ -9075,6 +9085,9 @@ $(OBJS)\basedll_filtfind.obj :  .AUTODEPEND ..\..\src\common\filtfind.cpp
 $(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) $<
 
@@ -9342,6 +9355,9 @@ $(OBJS)\baselib_filtfind.obj :  .AUTODEPEND ..\..\src\common\filtfind.cpp
 $(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) $<
 
index 1dfe7eee7c2e12f5d2c2e560f0432c9b864e8451..588b08dafd775345676303dd914ff53085c4d9ac 100644 (file)
@@ -567,6 +567,10 @@ SOURCE=..\..\src\common\fmapbase.cpp
 # 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
@@ -1555,6 +1559,10 @@ SOURCE=..\..\include\wx\fontmap.h
 # 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
index 2e92d4a879e5ccec438291ea889600877afaf89c..52b01af0f9de3032d5386c5a854d8f5352bf3efb 100644 (file)
@@ -69,7 +69,8 @@ All:
 - 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): 
 
index e98b3f82ad48f02b262ed7a2d276e37648613a09..748f523b9290d0dd1f400d77a769127be29f63b4 100644 (file)
@@ -1,56 +1,56 @@
 /////////////////////////////////////////////////////////////////////////////
-// 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_
index f96f1b8ee3111565e0a847f7cb06eeaa4eab3ff4..5df4232e85e38b36b03db03cb4acc8842a955901 100644 (file)
@@ -1,8 +1,8 @@
 /////////////////////////////////////////////////////////////////////////////
-// 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("./")))
     {
@@ -100,65 +358,84 @@ wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& l
 
     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:
@@ -169,11 +446,7 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
             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('/'));
@@ -185,7 +458,7 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
         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;
         }
@@ -194,32 +467,28 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
     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)
         {
@@ -233,7 +502,7 @@ wxString wxZipFSHandler::DoFind()
                     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
@@ -244,13 +513,10 @@ wxString wxZipFSHandler::DoFind()
         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
index cd4065de3ebb4e4b6bde5f47f88c12b4895401aa..5cba9fbd7c21e17768f7d62fa8e9a762d0ca74ea 100644 (file)
@@ -591,6 +591,10 @@ SOURCE=.\common\framecmn.cpp
 # 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
@@ -2695,6 +2699,10 @@ SOURCE=..\include\wx\frame.h
 # 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
index 06a4e9729579dde25b1715916aaa71aaad446fc2..f671637436c5c19475aa23d377e0c17ed492f51b 100644 (file)
@@ -247,6 +247,7 @@ wx/filename.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
index 62953c3bd090c1ca5bca019e25b75c39435355cf..bcc90cdfb34fa57c7f986136897871a9f2b2d038 100644 (file)
@@ -150,6 +150,7 @@ wx/filename.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
index c6176eac95dbe088806791d37485274002f60014..4f0baaff8a99c98541d349ec8a01fb7c06ec8ef3 100644 (file)
@@ -175,6 +175,7 @@ wx/filename.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