// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "fs_zip.h"
-#endif
-
#include "wx/wxprec.h"
#ifdef __BORLANDC__
wxZipFSHandler::~wxZipFSHandler()
{
- if (m_Archive)
- delete m_Archive;
- if (m_DirsFound)
- delete m_DirsFound;
+ Cleanup();
}
+void wxZipFSHandler::Cleanup()
+{
+ wxDELETE(m_Archive);
+ wxDELETE(m_DirsFound);
+}
+
+
bool wxZipFSHandler::CanOpen(const wxString& location)
{
}
-wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& fs, const wxString& location)
+wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location)
{
wxString right = GetRightLocation(location);
wxString left = GetLeftLocation(location);
if (right.GetChar(0) == wxT('/')) right = right.Mid(1);
- wxFSFile *leftFile = fs.OpenFile(left);
+ // a new wxFileSystem object is needed here to avoid infinite recursion
+ wxFSFile *leftFile = wxFileSystem().OpenFile(left);
if (!leftFile)
return NULL;
s = new wxZipFSInputStream(leftFile);
if (s && s->IsOk())
{
- wxZipEntry *ent;
+#if wxUSE_DATETIME
+ wxDateTime dtMod;
+#endif // wxUSE_DATETIME
+
bool found = false;
- while (!found && (ent = s->GetNextEntry())) {
+ 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,
GetMimeTypeFromExt(location),
GetAnchor(location)
#if wxUSE_DATETIME
- , wxDateTime(wxFileModificationTime(left))
+ , dtMod
#endif // wxUSE_DATETIME
);
+ }
}
delete s;
wxString right = GetRightLocation(spec);
wxString left = GetLeftLocation(spec);
- if (right.Last() == wxT('/')) right.RemoveLast();
+ if (!right.empty() && right.Last() == wxT('/')) right.RemoveLast();
if (m_Archive)
{
m_Pattern = right.AfterLast(wxT('/'));
m_BaseDir = right.BeforeLast(wxT('/'));
+ if (m_BaseDir.StartsWith(wxT("/")))
+ m_BaseDir = m_BaseDir.Mid(1);
if (m_Archive)
{
{
delete m_DirsFound;
m_DirsFound = new wxZipFilenameHashMap();
+ if (right.empty()) // allow "/" to match the archive root
+ return spec;
}
return DoFind();
}