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
-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);
{
wxString right = GetRightLocation(location);
wxString left = GetLeftLocation(location);
if (right.GetChar(0) == wxT('/')) right = right.Mid(1);
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;
if (!leftFile)
return NULL;
wxString right = GetRightLocation(spec);
wxString left = GetLeftLocation(spec);
wxString right = GetRightLocation(spec);
wxString left = GetLeftLocation(spec);
- if (right.Last() == wxT('/')) right.RemoveLast();
+ if (!right.empty() && right.Last() == wxT('/')) right.RemoveLast();
m_Pattern = right.AfterLast(wxT('/'));
m_BaseDir = right.BeforeLast(wxT('/'));
m_Pattern = right.AfterLast(wxT('/'));
m_BaseDir = right.BeforeLast(wxT('/'));
+ if (m_BaseDir.StartsWith(wxT("/")))
+ m_BaseDir = m_BaseDir.Mid(1);
{
delete m_DirsFound;
m_DirsFound = new wxZipFilenameHashMap();
{
delete m_DirsFound;
m_DirsFound = new wxZipFilenameHashMap();
+ if (right.empty()) // allow "/" to match the archive root
+ return spec;