]>
git.saurik.com Git - wxWidgets.git/blob - src/common/fs_zip.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: ZIP file system
4 // Author: Vaclav Slavik
5 // Copyright: (c) 1999 Vaclav Slavik
6 // Licence: wxWindows Licence
7 /////////////////////////////////////////////////////////////////////////////
11 #pragma implementation
14 #include "wx/wxprec.h"
20 #if wxUSE_FILESYSTEM && wxUSE_FS_ZIP && wxUSE_ZIPSTREAM
26 #include "wx/filesys.h"
27 #include "wx/zipstrm.h"
28 #include "wx/fs_zip.h"
30 /* Not the right solution (paths in makefiles) but... */
32 #include "../common/unzip.h"
38 //--------------------------------------------------------------------------------
40 //--------------------------------------------------------------------------------
44 wxZipFSHandler::wxZipFSHandler() : wxFileSystemHandler()
47 m_ZipFile
= m_Pattern
= m_BaseDir
= wxEmptyString
;
48 m_AllowDirs
= m_AllowFiles
= TRUE
;
53 wxZipFSHandler::~wxZipFSHandler()
56 unzClose((unzFile
)m_Archive
);
61 bool wxZipFSHandler::CanOpen(const wxString
& location
)
63 wxString p
= GetProtocol(location
);
64 return (p
== wxT("zip"));
70 wxFSFile
* wxZipFSHandler::OpenFile(wxFileSystem
& WXUNUSED(fs
), const wxString
& location
)
72 wxString right
= GetRightLocation(location
);
73 wxString left
= GetLeftLocation(location
);
76 if (GetProtocol(left
) != wxT("file"))
78 wxLogError(_("ZIP handler currently supports only local files!"));
82 s
= new wxZipInputStream(left
, right
);
83 if (s
&& (s
->LastError() == wxStream_NOERROR
))
85 return new wxFSFile(s
,
86 left
+ wxT("#zip:") + right
,
87 GetMimeTypeFromExt(location
),
89 wxDateTime(wxFileModificationTime(left
)));
98 wxString
wxZipFSHandler::FindFirst(const wxString
& spec
, int flags
)
100 wxString right
= GetRightLocation(spec
);
101 wxString left
= GetLeftLocation(spec
);
103 if (right
.Last() == wxT('/')) right
.RemoveLast();
107 unzClose((unzFile
)m_Archive
);
111 if (GetProtocol(left
) != wxT("file"))
112 return wxEmptyString
;
117 m_AllowDirs
= FALSE
, m_AllowFiles
= TRUE
; break;
119 m_AllowDirs
= TRUE
, m_AllowFiles
= FALSE
; break;
121 m_AllowDirs
= m_AllowFiles
= TRUE
; break;
125 m_Archive
= (void*) unzOpen(m_ZipFile
.mb_str());
126 m_Pattern
= right
.AfterLast(wxT('/'));
127 m_BaseDir
= right
.BeforeLast(wxT('/'));
131 if (unzGoToFirstFile((unzFile
)m_Archive
) != UNZ_OK
)
133 unzClose((unzFile
)m_Archive
);
136 else return DoFind();
138 return wxEmptyString
;
143 wxString
wxZipFSHandler::FindNext()
145 if (!m_Archive
) return wxEmptyString
;
151 wxString
wxZipFSHandler::DoFind()
153 static char namebuf
[1024]; // char, not wxChar!
155 wxString fn
, dir
, name
;
156 wxString match
= wxEmptyString
;
159 while (match
== wxEmptyString
)
161 unzGetCurrentFileInfo((unzFile
)m_Archive
, NULL
, namebuf
, 1024, NULL
, 0, NULL
, 0);
162 for (c
= namebuf
; *c
; c
++) if (*c
== wxT('\\')) *c
= wxT('/');
164 if (fn
.Length() > 0 && fn
.Last() == wxT('/'))
171 name
= fn
.AfterLast(wxT('/'));
172 dir
= fn
.BeforeLast(wxT('/'));
174 if (dir
== m_BaseDir
)
176 if (m_AllowFiles
&& !wasdir
&& wxMatchWild(m_Pattern
, name
, FALSE
))
177 match
= m_ZipFile
+ wxT("#zip:") + fn
;
178 if (m_AllowDirs
&& wasdir
&& wxMatchWild(m_Pattern
, name
, FALSE
))
179 match
= m_ZipFile
+ wxT("#zip:") + fn
;
182 if (unzGoToNextFile((unzFile
)m_Archive
) != UNZ_OK
)
184 unzClose((unzFile
)m_Archive
);
196 //wxUSE_FILESYSTEM && wxUSE_FS_ZIP && wxUSE_ZIPSTREAM