From 6ef85b1b2ce940b78c92e174e5df040235943c62 Mon Sep 17 00:00:00 2001 From: Stefan Neis Date: Sat, 15 Jan 2000 22:56:53 +0000 Subject: [PATCH] SN: Added first try for dir.cpp. Since the version taken from unix-directory is POSIX-compliant, this might have a chance to work for VAC++ as well. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5436 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/os2/dir.cpp | 241 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 src/os2/dir.cpp diff --git a/src/os2/dir.cpp b/src/os2/dir.cpp new file mode 100644 index 0000000000..0b66575785 --- /dev/null +++ b/src/os2/dir.cpp @@ -0,0 +1,241 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: os2/dir.cpp +// Purpose: wxDir implementation for OS/2 +// Author: Vadim Zeitlin +// Modified by: Stefan Neis +// Created: 08.12.99 +// RCS-ID: $Id$ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "dir.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif // PCH + +#include "wx/dir.h" +#include "wx/filefn.h" // for wxMatchWild + +#include + +#ifdef __EMX__ +#include +#else +#include +#endif + +// ---------------------------------------------------------------------------- +// 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() { rewinddir(m_dir); } + bool Read(wxString *filename); + +private: + DIR *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] == '/' ) + ; + + m_dirname.Truncate(n + 1); + + // do open the dir + m_dir = opendir(m_dirname.fn_str()); +} + +wxDirData::~wxDirData() +{ + if ( m_dir ) + { + if ( closedir(m_dir) != 0 ) + { + wxLogLastError(_T("closedir")); + } + } +} + +bool wxDirData::Read(wxString *filename) +{ + dirent *de; + bool matches = FALSE; + + while ( !matches ) + { + de = readdir(m_dir); + if ( !de ) + return FALSE; + + // don't return "." and ".." unless asked for + if ( de->d_name[0] == '.' && + ((de->d_name[1] == '.' && de->d_name[2] == '\0') || + (de->d_name[1] == '\0')) ) + { + if ( !(m_flags & wxDIR_DOTDOT) ) + continue; + } + + // check the type now + if ( !(m_flags & wxDIR_FILES) && + !wxDir::Exists(m_dirname + _T('/') + de->d_name) ) + { + // it's a file, but we don't want them + continue; + } + else if ( !(m_flags & wxDIR_DIRS) && + wxDir::Exists(m_dirname + _T('/') + de->d_name) ) + { + // it's a dir, and we don't want it + continue; + } + + // finally, check the name + if ( !m_filespec ) + { + matches = m_flags & wxDIR_HIDDEN ? TRUE : de->d_name[0] != '.'; + } + else + { + // test against the pattern + matches = wxMatchWild(m_filespec, de->d_name, + !(m_flags & wxDIR_HIDDEN)); + } + } + + *filename = de->d_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; +} + +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); +} -- 2.45.2