// Created: 19.05.01
// RCS-ID: $Id$
// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// License: wxWindows license
+// License: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// headers
// ----------------------------------------------------------------------------
-/* this is done in platform-specific files
-#ifdef __GNUG__
- #pragma implementation "dir.h"
-#endif
-*/
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/log.h"
#include "wx/intl.h"
#include "wx/filefn.h"
+ #include "wx/arrstr.h"
#endif //WX_PRECOMP
#include "wx/dir.h"
// implementation
// ============================================================================
+// ----------------------------------------------------------------------------
+// wxDirTraverser
+// ----------------------------------------------------------------------------
+
+wxDirTraverseResult
+wxDirTraverser::OnOpenError(const wxString& WXUNUSED(dirname))
+{
+ return wxDIR_IGNORE;
+}
+
+// ----------------------------------------------------------------------------
+// wxDir::HasFiles() and HasSubDirs()
+// ----------------------------------------------------------------------------
+
+// dumb generic implementation
+
+bool wxDir::HasFiles(const wxString& spec)
+{
+ wxString s;
+ return GetFirst(&s, spec, wxDIR_FILES | wxDIR_HIDDEN);
+}
+
+// we have a (much) faster version for Unix
+#if (defined(__CYGWIN__) && defined(__WINDOWS__)) || !defined(__UNIX_LIKE__) || defined(__WXMAC__) || defined(__EMX__) || defined(__WINE__)
+
+bool wxDir::HasSubDirs(const wxString& spec)
+{
+ wxString s;
+ return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN);
+}
+
+#endif // !Unix
+
// ----------------------------------------------------------------------------
// wxDir::Traverse()
// ----------------------------------------------------------------------------
if ( flags & wxDIR_DIRS )
{
wxString dirname;
- bool cont = GetFirst(&dirname, _T(""), wxDIR_DIRS | wxDIR_HIDDEN);
- while ( cont )
+ for ( bool cont = GetFirst(&dirname, wxEmptyString, wxDIR_DIRS | (flags & wxDIR_HIDDEN) );
+ cont;
+ cont = cont && GetNext(&dirname) )
{
- wxDirTraverseResult res = sink.OnDir(prefix + dirname);
-
- if ( res == wxDIR_STOP )
- break;
+ const wxString fulldirname = prefix + dirname;
- if ( res == wxDIR_CONTINUE )
- {
- wxDir subdir(prefix + dirname);
- if ( subdir.IsOpened() )
- {
- nFiles += subdir.Traverse(sink, filespec, flags);
- }
- }
- else
+ switch ( sink.OnDir(fulldirname) )
{
- wxASSERT_MSG( res == wxDIR_IGNORE,
- _T("unexpected OnDir() return value") );
+ default:
+ wxFAIL_MSG(_T("unexpected OnDir() return value") );
+ // fall through
+
+ case wxDIR_STOP:
+ cont = false;
+ break;
+
+ case wxDIR_CONTINUE:
+ {
+ wxDir subdir;
+
+ // don't give the error messages for the directories
+ // which we can't open: there can be all sorts of good
+ // reason for this (e.g. insufficient privileges) and
+ // this shouldn't be treated as an error -- instead
+ // let the user code decide what to do
+ bool ok;
+ do
+ {
+ wxLogNull noLog;
+ ok = subdir.Open(fulldirname);
+ if ( !ok )
+ {
+ // ask the user code what to do
+ bool tryagain;
+ switch ( sink.OnOpenError(fulldirname) )
+ {
+ default:
+ wxFAIL_MSG(_T("unexpected OnOpenError() return value") );
+ // fall through
+
+ case wxDIR_STOP:
+ cont = false;
+ // fall through
+
+ case wxDIR_IGNORE:
+ tryagain = false;
+ break;
+
+ case wxDIR_CONTINUE:
+ tryagain = true;
+ }
+
+ if ( !tryagain )
+ break;
+ }
+ }
+ while ( !ok );
+
+ if ( ok )
+ {
+ nFiles += subdir.Traverse(sink, filespec, flags);
+ }
+ }
+ break;
+
+ case wxDIR_IGNORE:
+ // nothing to do
+ ;
}
-
- cont = GetNext(&dirname);
}
}
virtual wxDirTraverseResult OnFile(const wxString& filename)
{
- m_files.Add(filename);
+ m_files.push_back(filename);
return wxDIR_CONTINUE;
}
private:
wxArrayString& m_files;
+
+ DECLARE_NO_COPY_CLASS(wxDirTraverserSimple)
};
/* static */
return nFiles;
}
-