Patch 1173507 by Stas Sergeev. Allow FindFirst to work with patterns

such as 'file:abc.zip#zip:/xyz/*' that have a '/' after the 'zip:' since
it is possible to open paths such as 'file:abc.zip#zip:/xyz/123.txt'. Also
allow 'abc.zip#zip:' and 'abc.zip#zip:/' to match the zip's root. And
create a new instance of wxFileSystem within OpenFile to avoid infinite
recursion.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33445 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Michael Wetherell
2005-04-09 03:06:19 +00:00
parent 7634e443c0
commit ba75c6bb8c

View File

@@ -86,7 +86,7 @@ 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);
@@ -102,7 +102,8 @@ wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& fs, const wxString& 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;
@@ -141,7 +142,7 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
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)
{
@@ -167,6 +168,8 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
m_Pattern = right.AfterLast(wxT('/'));
m_BaseDir = right.BeforeLast(wxT('/'));
if (m_BaseDir.StartsWith(wxT("/")))
m_BaseDir = m_BaseDir.Mid(1);
if (m_Archive)
{
@@ -174,6 +177,8 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
{
delete m_DirsFound;
m_DirsFound = new wxZipFilenameHashMap();
if (right.empty()) // allow "/" to match the archive root
return spec;
}
return DoFind();
}