From: Václav Slavík Date: Fri, 14 Dec 2001 19:25:39 +0000 (+0000) Subject: implemented wxDir as pure MGL code X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/ffd10d5da754aa6f22684a0979c71dd69ad557d1 implemented wxDir as pure MGL code git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13014 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/mgl/dir.cpp b/src/mgl/dir.cpp new file mode 100644 index 0000000000..2fdbfe2d3d --- /dev/null +++ b/src/mgl/dir.cpp @@ -0,0 +1,275 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: mgl/dir.cpp +// Purpose: wxDir implementation for MGL +// Author: Vaclav Slavik, Vadim Zeitlin +// Modified by: +// Created: 2001/12/09 +// RCS-ID: $Id$ +// Copyright: (c) 1999 Vadim Zeitlin +// (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "dir.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif // PCH + +#include "wx/dir.h" +#include "wx/filefn.h" // for wxMatchWild +#include "wx/mgl/private.h" + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +#define M_DIR ((wxDirData *)m_data) + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// this class stores everything we need to enumerate the files +class wxDirData +{ +public: + wxDirData(const wxString& dirname); + ~wxDirData(); + + bool IsOk() const { return m_dir != NULL; } + + void SetFileSpec(const wxString& filespec) { m_filespec = filespec; } + void SetFlags(int flags) { m_flags = flags; } + + void Rewind(); + bool Read(wxString *filename); + + const wxString& GetName() const { return m_dirname; } + +private: + void *m_dir; + + wxString m_dirname; + wxString m_filespec; + + int m_flags; +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxDirData +// ---------------------------------------------------------------------------- + +wxDirData::wxDirData(const wxString& dirname) + : m_dirname(dirname) +{ + m_dir = NULL; + + // throw away the trailing slashes + size_t n = m_dirname.length(); + wxCHECK_RET( n, _T("empty dir name in wxDir") ); + + while ( n > 0 && m_dirname[--n] == wxFILE_SEP_PATH ) {} + + m_dirname.Truncate(n + 1); +} + +wxDirData::~wxDirData() +{ + if ( m_dir ) + PM_findClose(m_dir); +} + +void wxDirData::Rewind() +{ + if ( m_dir ) + { + PM_findClose(m_dir); + m_dir = NULL; + } +} + +bool wxDirData::Read(wxString *filename) +{ + PM_findData data; + bool matches = FALSE; + + // speed up string concatenation in the loop a bit + wxString path = m_dirname; + path += wxFILE_SEP_PATH; + path.reserve(path.length() + 255); + + while ( !matches ) + { + if ( m_dir ) + { + if ( !PM_findNextFile(m_dir, &data) ) + return FALSE; + } + else + { + m_dir = PM_findFirstFile(path + m_filespec , &data); + if ( m_dir == PM_FILE_INVALID ) + { + m_dir = NULL; + return FALSE; + } + } + + // don't return "." and ".." unless asked for + if ( data.name[0] == '.' && + ((data.name[1] == '.' && data.name[2] == '\0') || + (data.name[1] == '\0')) ) + { + if ( !(m_flags & wxDIR_DOTDOT) ) + continue; + + // we found a valid match + break; + } + + // check the type now + if ( !(m_flags & wxDIR_FILES) && !(data.attrib & PM_FILE_DIRECTORY) ) + { + // it's a file, but we don't want them + continue; + } + else if ( !(m_flags & wxDIR_DIRS) && (data.attrib & PM_FILE_DIRECTORY) ) + { + // it's a dir, and we don't want it + continue; + } + + matches = m_flags & wxDIR_HIDDEN ? TRUE : !(data.attrib & PM_FILE_HIDDEN); + } + + *filename = data.name; + + return TRUE; +} + + +// ---------------------------------------------------------------------------- +// wxDir helpers +// ---------------------------------------------------------------------------- + +/* static */ +bool wxDir::Exists(const wxString& dir) +{ + return wxPathExists(dir); +} + +// ---------------------------------------------------------------------------- +// wxDir construction/destruction +// ---------------------------------------------------------------------------- + +wxDir::wxDir(const wxString& dirname) +{ + m_data = NULL; + + (void)Open(dirname); +} + +bool wxDir::Open(const wxString& dirname) +{ + delete M_DIR; + m_data = new wxDirData(dirname); + + if ( !M_DIR->IsOk() ) + { + wxLogSysError(_("Can not enumerate files in directory '%s'"), + dirname.c_str()); + + delete M_DIR; + m_data = NULL; + + return FALSE; + } + + return TRUE; +} + +bool wxDir::IsOpened() const +{ + return m_data != NULL; +} + +wxString wxDir::GetName() const +{ + wxString name; + if ( m_data ) + { + name = M_DIR->GetName(); + if ( !name.empty() && (name.Last() == wxFILE_SEP_PATH) ) + { + // chop off the last (back)slash + name.Truncate(name.length() - 1); + } + } + + return name; +} + +wxDir::~wxDir() +{ + delete M_DIR; +} + +// ---------------------------------------------------------------------------- +// wxDir enumerating +// ---------------------------------------------------------------------------- + +bool wxDir::GetFirst(wxString *filename, + const wxString& filespec, + int flags) const +{ + wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") ); + + M_DIR->Rewind(); + + M_DIR->SetFileSpec(filespec); + M_DIR->SetFlags(flags); + + return GetNext(filename); +} + +bool wxDir::GetNext(wxString *filename) const +{ + wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") ); + + wxCHECK_MSG( filename, FALSE, _T("bad pointer in wxDir::GetNext()") ); + + return M_DIR->Read(filename); +} + +bool wxDir::HasSubDirs(const wxString& spec) +{ + wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") ); + + // just try to find first directory + wxString s; + return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN); +} +