fixed some crashes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9395 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2001-02-20 16:02:26 +00:00
parent 83e72d5f10
commit 095472c0da

View File

@@ -61,7 +61,7 @@ wxZipFSHandler::~wxZipFSHandler()
bool wxZipFSHandler::CanOpen(const wxString& location) bool wxZipFSHandler::CanOpen(const wxString& location)
{ {
wxString p = GetProtocol(location); wxString p = GetProtocol(location);
return (p == wxT("zip") ); return (p == wxT("zip"));
} }
@@ -73,12 +73,15 @@ wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& l
wxString left = GetLeftLocation(location); wxString left = GetLeftLocation(location);
wxInputStream *s; wxInputStream *s;
if (GetProtocol(left) != wxT("file")) { if (GetProtocol(left) != wxT("file"))
{
wxLogError(_("ZIP handler currently supports only local files!"));
return NULL; return NULL;
} }
s = new wxZipInputStream(left, right); s = new wxZipInputStream(left, right);
if (s && (s -> LastError() == wxStream_NOERROR)) { if (s && (s->LastError() == wxStream_NOERROR))
{
return new wxFSFile(s, return new wxFSFile(s,
left + wxT("#zip:") + right, left + wxT("#zip:") + right,
GetMimeTypeFromExt(location), GetMimeTypeFromExt(location),
@@ -99,19 +102,23 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
if (right.Last() == wxT('/')) right.RemoveLast(); if (right.Last() == wxT('/')) right.RemoveLast();
if (m_Archive) { if (m_Archive)
{
unzClose((unzFile)m_Archive); unzClose((unzFile)m_Archive);
m_Archive = NULL; m_Archive = NULL;
} }
if (GetProtocol(left) != wxT("file")) { if (GetProtocol(left) != wxT("file"))
return wxEmptyString; return wxEmptyString;
}
switch (flags) { switch (flags)
case wxFILE : m_AllowDirs = FALSE, m_AllowFiles = TRUE; break; {
case wxDIR : m_AllowDirs = TRUE, m_AllowFiles = FALSE; break; case wxFILE:
default : m_AllowDirs = m_AllowFiles = TRUE; break; 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; m_ZipFile = left;
@@ -119,13 +126,16 @@ wxString wxZipFSHandler::FindFirst(const wxString& spec, int flags)
m_Pattern = right.AfterLast(wxT('/')); m_Pattern = right.AfterLast(wxT('/'));
m_BaseDir = right.BeforeLast(wxT('/')); m_BaseDir = right.BeforeLast(wxT('/'));
if (m_Archive) { if (m_Archive)
if (unzGoToFirstFile((unzFile)m_Archive) != UNZ_OK) { {
if (unzGoToFirstFile((unzFile)m_Archive) != UNZ_OK)
{
unzClose((unzFile)m_Archive); unzClose((unzFile)m_Archive);
m_Archive = NULL; m_Archive = NULL;
} }
else return DoFind();
} }
return DoFind(); return wxEmptyString;
} }
@@ -151,7 +161,8 @@ wxString wxZipFSHandler::DoFind()
unzGetCurrentFileInfo((unzFile)m_Archive, NULL, namebuf, 1024, NULL, 0, NULL, 0); unzGetCurrentFileInfo((unzFile)m_Archive, NULL, namebuf, 1024, NULL, 0, NULL, 0);
for (c = namebuf; *c; c++) if (*c == wxT('\\')) *c = wxT('/'); for (c = namebuf; *c; c++) if (*c == wxT('\\')) *c = wxT('/');
fn = namebuf; fn = namebuf;
if (fn.Last() == wxT('/')) { if (fn.Length() > 0 && fn.Last() == wxT('/'))
{
fn.RemoveLast(); fn.RemoveLast();
wasdir = TRUE; wasdir = TRUE;
} }
@@ -160,14 +171,16 @@ wxString wxZipFSHandler::DoFind()
name = fn.AfterLast(wxT('/')); name = fn.AfterLast(wxT('/'));
dir = fn.BeforeLast(wxT('/')); dir = fn.BeforeLast(wxT('/'));
if (dir == m_BaseDir) { if (dir == m_BaseDir)
{
if (m_AllowFiles && !wasdir && wxMatchWild(m_Pattern, name, FALSE)) if (m_AllowFiles && !wasdir && wxMatchWild(m_Pattern, name, FALSE))
match = m_ZipFile + wxT("#zip:") + fn; match = m_ZipFile + wxT("#zip:") + fn;
if (m_AllowDirs && wasdir && wxMatchWild(m_Pattern, name, FALSE)) if (m_AllowDirs && wasdir && wxMatchWild(m_Pattern, name, FALSE))
match = m_ZipFile + wxT("#zip:") + fn; match = m_ZipFile + wxT("#zip:") + fn;
} }
if (unzGoToNextFile((unzFile)m_Archive) != UNZ_OK) { if (unzGoToNextFile((unzFile)m_Archive) != UNZ_OK)
{
unzClose((unzFile)m_Archive); unzClose((unzFile)m_Archive);
m_Archive = NULL; m_Archive = NULL;
break; break;