+wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
+{
+ wxString right = GetRightLocation(spec);
+ wxString left = GetLeftLocation(spec);
+
+ if (!right.empty() && right.Last() == wxT('/')) right.RemoveLast();
+
+ if (m_Archive)
+ {
+ delete m_Archive;
+ m_Archive = NULL;
+ }
+
+ switch (flags)
+ {
+ case wxFILE:
+ m_AllowDirs = false, m_AllowFiles = true; break;
+ case wxDIR:
+ m_AllowDirs = true, m_AllowFiles = false; break;
+ default:
+ m_AllowDirs = m_AllowFiles = true; break;
+ }
+
+ m_ZipFile = left;
+
+ wxFSFile *leftFile = wxFileSystem().OpenFile(left);
+ if (leftFile)
+ m_Archive = new wxZipFSInputStream(leftFile);
+
+ m_Pattern = right.AfterLast(wxT('/'));
+ m_BaseDir = right.BeforeLast(wxT('/'));
+ if (m_BaseDir.StartsWith(wxT("/")))
+ m_BaseDir = m_BaseDir.Mid(1);
+
+ if (m_Archive)
+ {
+ if (m_AllowDirs)
+ {
+ delete m_DirsFound;
+ m_DirsFound = new wxZipFilenameHashMap();
+ if (right.empty()) // allow "/" to match the archive root
+ return spec;
+ }
+ return DoFind();
+ }
+ return wxEmptyString;
+}
+
+
+
+wxString wxZipFSHandler::FindNext()