added and documented wxDirTraverser::OnOpenError
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18895 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -16,6 +16,7 @@ All:
|
|||||||
- added wxDateSpan::operator==() and !=() (Lukasz Michalski)
|
- added wxDateSpan::operator==() and !=() (Lukasz Michalski)
|
||||||
- use true/false throughout the library instead of TRUE/FALSE
|
- use true/false throughout the library instead of TRUE/FALSE
|
||||||
- wxStopWatch::Start() resumes the stop watch if paused, as per the docs
|
- wxStopWatch::Start() resumes the stop watch if paused, as per the docs
|
||||||
|
- added wxDirTraverser::OnOpenError() to customize the error handling
|
||||||
|
|
||||||
wxBase:
|
wxBase:
|
||||||
|
|
||||||
|
@@ -71,14 +71,6 @@ enum wxDirTraverseResult
|
|||||||
|
|
||||||
\latexignore{\rtfignore{\wxheading{Members}}}
|
\latexignore{\rtfignore{\wxheading{Members}}}
|
||||||
|
|
||||||
\membersection{wxDirTraverser::OnFile}\label{wxdirtraverseronfile}
|
|
||||||
|
|
||||||
\func{virtual wxDirTraverseResult}{OnFile}{\param{const wxString\& }{filename}}
|
|
||||||
|
|
||||||
This function is called for each file. It may return {\tt wxDIR\_STOP} to abort
|
|
||||||
traversing (for example, if the file being searched is found) or
|
|
||||||
{\tt wxDIR\_CONTINUE} to proceed.
|
|
||||||
|
|
||||||
\membersection{wxDirTraverser::OnDir}\label{wxdirtraverserondir}
|
\membersection{wxDirTraverser::OnDir}\label{wxdirtraverserondir}
|
||||||
|
|
||||||
\func{virtual wxDirTraverseResult}{OnDir}{\param{const wxString\& }{dirname}}
|
\func{virtual wxDirTraverseResult}{OnDir}{\param{const wxString\& }{dirname}}
|
||||||
@@ -88,4 +80,27 @@ to abort traversing completely, {\tt wxDIR\_IGNORE} to skip this directory but
|
|||||||
continue with others or {\tt wxDIR\_CONTINUE} to enumerate all files and
|
continue with others or {\tt wxDIR\_CONTINUE} to enumerate all files and
|
||||||
subdirectories in this directory.
|
subdirectories in this directory.
|
||||||
|
|
||||||
|
This is a pure virtual function and must be implemented in the derived class.
|
||||||
|
|
||||||
|
\membersection{wxDirTraverser::OnFile}\label{wxdirtraverseronfile}
|
||||||
|
|
||||||
|
\func{virtual wxDirTraverseResult}{OnFile}{\param{const wxString\& }{filename}}
|
||||||
|
|
||||||
|
This function is called for each file. It may return {\tt wxDIR\_STOP} to abort
|
||||||
|
traversing (for example, if the file being searched is found) or
|
||||||
|
{\tt wxDIR\_CONTINUE} to proceed.
|
||||||
|
|
||||||
|
This is a pure virtual function and must be implemented in the derived class.
|
||||||
|
|
||||||
|
\membersection{wxOpenErrorTraverser::OnOpenError}\label{wxopenerrortraverseronopenerror}
|
||||||
|
|
||||||
|
\func{virtual wxOpenErrorTraverseResult}{OnOpenError}{\param{const wxString\& }{openerrorname}}
|
||||||
|
|
||||||
|
This function is called for each directory which we failed to open for
|
||||||
|
enumerating. It may return {\tt wxSIR\_STOP} to abort traversing completely,
|
||||||
|
{\tt wxDIR\_IGNORE} to skip this directory but continue with others or
|
||||||
|
{\tt wxDIR\_CONTINUE} to retry opening this directory once again.
|
||||||
|
|
||||||
|
The base class version always returns {\tt wxDIR\_IGNORE}.
|
||||||
|
|
||||||
|
|
||||||
|
@@ -54,13 +54,25 @@ class WXDLLEXPORT wxDirTraverser
|
|||||||
public:
|
public:
|
||||||
// called for each file found by wxDir::Traverse()
|
// called for each file found by wxDir::Traverse()
|
||||||
//
|
//
|
||||||
// return wxDIR_STOP or wxDIR_CONTINUE from here
|
// return wxDIR_STOP or wxDIR_CONTINUE from here (wxDIR_IGNORE doesn't
|
||||||
|
// make sense)
|
||||||
virtual wxDirTraverseResult OnFile(const wxString& filename) = 0;
|
virtual wxDirTraverseResult OnFile(const wxString& filename) = 0;
|
||||||
|
|
||||||
// called for each directory found by wxDir::Traverse()
|
// called for each directory found by wxDir::Traverse()
|
||||||
//
|
//
|
||||||
// return one of the enum elements defined above
|
// return one of the enum elements defined above
|
||||||
virtual wxDirTraverseResult OnDir(const wxString& dirname) = 0;
|
virtual wxDirTraverseResult OnDir(const wxString& dirname) = 0;
|
||||||
|
|
||||||
|
// called for each directory which we couldn't open during our traversal
|
||||||
|
// of the directory tyree
|
||||||
|
//
|
||||||
|
// this method can also return either wxDIR_STOP, wxDIR_IGNORE or
|
||||||
|
// wxDIR_CONTINUE but the latter is treated specially: it means to retry
|
||||||
|
// opening the directory and so may lead to infinite loop if it is
|
||||||
|
// returned unconditionally, be careful with this!
|
||||||
|
//
|
||||||
|
// the base class version always returns wxDIR_IGNORE
|
||||||
|
virtual wxDirTraverseResult OnOpenError(const wxString& dirname);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -43,6 +43,16 @@
|
|||||||
// implementation
|
// implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDirTraverser
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxDirTraverseResult
|
||||||
|
wxDirTraverser::OnOpenError(const wxString& WXUNUSED(dirname))
|
||||||
|
{
|
||||||
|
return wxDIR_IGNORE;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxDir::HasFiles() and HasSubDirs()
|
// wxDir::HasFiles() and HasSubDirs()
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -88,29 +98,75 @@ size_t wxDir::Traverse(wxDirTraverser& sink,
|
|||||||
if ( flags & wxDIR_DIRS )
|
if ( flags & wxDIR_DIRS )
|
||||||
{
|
{
|
||||||
wxString dirname;
|
wxString dirname;
|
||||||
bool cont = GetFirst(&dirname, _T(""), wxDIR_DIRS | wxDIR_HIDDEN);
|
for ( bool cont = GetFirst(&dirname, _T(""), wxDIR_DIRS | wxDIR_HIDDEN);
|
||||||
while ( cont )
|
cont;
|
||||||
|
cont = GetNext(&dirname) )
|
||||||
{
|
{
|
||||||
wxDirTraverseResult res = sink.OnDir(prefix + dirname);
|
const wxString fulldirname = prefix + dirname;
|
||||||
|
|
||||||
if ( res == wxDIR_STOP )
|
switch ( sink.OnDir(fulldirname) )
|
||||||
break;
|
|
||||||
|
|
||||||
if ( res == wxDIR_CONTINUE )
|
|
||||||
{
|
{
|
||||||
wxDir subdir(prefix + dirname);
|
default:
|
||||||
if ( subdir.IsOpened() )
|
wxFAIL_MSG(_T("unexpected OnDir() return value") );
|
||||||
{
|
// fall through
|
||||||
nFiles += subdir.Traverse(sink, filespec, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxASSERT_MSG( res == wxDIR_IGNORE,
|
|
||||||
_T("unexpected OnDir() return value") );
|
|
||||||
}
|
|
||||||
|
|
||||||
cont = GetNext(&dirname);
|
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
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user