From: Václav Slavík Date: Tue, 8 Jan 2002 18:03:14 +0000 (+0000) Subject: use UNIX wxDir if available X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/34885a147bdca70749ac22737b55cbc6e0558b4a use UNIX wxDir if available git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13451 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index bca3e3d319..689de96cab 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -352,7 +352,7 @@ wave.cpp MSW window.cpp MSW LowLevel dialup.cpp Unix NotMac -dir.cpp Unix Base,NotMac,NotMGL +dir.cpp Unix Base,NotMac fontenum.cpp Unix NotMac,NotMGL,NotMicro fontutil.cpp Unix NotMac,NotMGL,NotMicro gsocket.c Unix Base,NotMac @@ -1448,7 +1448,7 @@ fontutil.cpp MGL LowLevel evtloop.cpp MGL LowLevel app.cpp MGL LowLevel bitmap.cpp MGL LowLevel -dir.cpp MGL LowLevel +dirmgl.cpp MGL LowLevel clipbrd.cpp MGL LowLevel cursor.cpp MGL LowLevel dcclient.cpp MGL LowLevel diff --git a/src/mgl/dir.cpp b/src/mgl/dir.cpp deleted file mode 100644 index c290d3f89a..0000000000 --- a/src/mgl/dir.cpp +++ /dev/null @@ -1,263 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// 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; - - data.dwSize = sizeof(data); - - wxString path = m_dirname; - path += wxFILE_SEP_PATH; - path.reserve(path.length() + 255); // speed up string concatenation - - 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 = NULL; - - if ( !wxDir::Exists(dirname) ) - { - wxLogError(_("Directory '%s' doesn't exist!"), dirname.c_str()); - return FALSE; - } - - m_data = new wxDirData(dirname); - 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); -} - diff --git a/src/mgl/dirmgl.cpp b/src/mgl/dirmgl.cpp new file mode 100644 index 0000000000..b6ce6e5ca0 --- /dev/null +++ b/src/mgl/dirmgl.cpp @@ -0,0 +1,269 @@ +///////////////////////////////////////////////////////////////////////////// +// 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 + +#include "wx/defs.h" + +#ifndef __UNIX__ + +#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; + + data.dwSize = sizeof(data); + + wxString path = m_dirname; + path += wxFILE_SEP_PATH; + path.reserve(path.length() + 255); // speed up string concatenation + + 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 = NULL; + + if ( !wxDir::Exists(dirname) ) + { + wxLogError(_("Directory '%s' doesn't exist!"), dirname.c_str()); + return FALSE; + } + + m_data = new wxDirData(dirname); + 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); +} + +#endif // !__UNIX__ + diff --git a/src/mgl/files.lst b/src/mgl/files.lst index 8b7852197b..8243d15d4e 100644 --- a/src/mgl/files.lst +++ b/src/mgl/files.lst @@ -1,4 +1,4 @@ -# This file was automatically generated by tmake at 22:59, 2002/01/01 +# This file was automatically generated by tmake at 17:34, 2002/01/08 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE MGL.T! ALL_SOURCES = \ generic/accel.cpp \ @@ -180,7 +180,7 @@ ALL_SOURCES = \ mgl/dcclient.cpp \ mgl/dcmemory.cpp \ mgl/dcscreen.cpp \ - mgl/dir.cpp \ + mgl/dirmgl.cpp \ mgl/evtloop.cpp \ mgl/font.cpp \ mgl/fontenum.cpp \ @@ -196,6 +196,7 @@ ALL_SOURCES = \ mgl/utils.cpp \ mgl/window.cpp \ unix/dialup.cpp \ + unix/dir.cpp \ unix/gsocket.c \ unix/mimetype.cpp \ unix/snglinst.cpp \ @@ -694,7 +695,7 @@ GUI_LOWLEVEL_OBJS = \ dcclient.o \ dcmemory.o \ dcscreen.o \ - dir.o \ + dirmgl.o \ evtloop.o \ font.o \ fontenum.o \ @@ -712,6 +713,7 @@ GUI_LOWLEVEL_OBJS = \ UNIXOBJS = \ dialup.o \ + dir.o \ gsocket.o \ mimetype.o \ snglinst.o \