wxString Instance::ReadVersionFile() { if (!GetVersionFile().FileExists()) return _(""); // Open the file for reading wxFSFile *vFile = wxFileSystem().OpenFile(GetVersionFile().GetFullPath(), wxFS_READ); wxString retVal; wxStringOutputStream outStream(&retVal); outStream.Write(*vFile->GetStream()); wxDELETE(vFile); return retVal; }
wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) { wxString right = GetRightLocation(location); wxString left = GetLeftLocation(location); wxZipInputStream *s; if (right.Contains(wxT("./"))) { if (right.GetChar(0) != wxT('/')) right = wxT('/') + right; wxFileName rightPart(right, wxPATH_UNIX); rightPart.Normalize(wxPATH_NORM_DOTS, wxT("/"), wxPATH_UNIX); right = rightPart.GetFullPath(wxPATH_UNIX); } 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; s = new wxZipFSInputStream(leftFile); if (s && s->IsOk()) { bool found = false; while (!found) { wxZipEntry *ent = s->GetNextEntry(); if (!ent) break; if (ent->GetInternalName() == right) found = true; delete ent; } if (found) return new wxFSFile(s, left + wxT("#zip:") + right, GetMimeTypeFromExt(location), GetAnchor(location) #if wxUSE_DATETIME , wxDateTime(wxFileModificationTime(left)) #endif // wxUSE_DATETIME ); } delete s; return NULL; }
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; }