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;
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();
}