bool wxFileSystemWatcherBase::Add(const wxFileName& path, int events)
{
- // args validation & consistency checks
- if (!path.FileExists() && !path.DirExists())
+ wxFSWPathType type = wxFSWPath_None;
+ if ( path.FileExists() )
+ {
+ type = wxFSWPath_File;
+ }
+ else if ( path.DirExists() )
+ {
+ type = wxFSWPath_Dir;
+ }
+ else
+ {
+ wxLogError(_("Can't monitor non-existent path \"%s\" for changes."),
+ path.GetFullPath());
return false;
+ }
+ return AddAny(path, events, type);
+}
+
+bool
+wxFileSystemWatcherBase::AddAny(const wxFileName& path,
+ int events,
+ wxFSWPathType type)
+{
wxString canonical = GetCanonicalPath(path);
if (canonical.IsEmpty())
return false;
wxString::Format("Path '%s' is already watched", canonical));
// adding a path in a platform specific way
- wxFSWatchInfo watch(canonical, events);
+ wxFSWatchInfo watch(canonical, events, type);
if ( !m_service->Add(watch) )
return false;
// all of them to Add() and let it choose? this is useful when adding a
// file to a dir that is already watched, then not only should we know
// about that, but Add() should also behave well then
- virtual wxDirTraverseResult OnFile(const wxString& WXUNUSED(filename))
+ virtual wxDirTraverseResult OnFile(const wxString& filename)
{
+ wxLogTrace(wxTRACE_FSWATCHER,
+ "--- AddTree adding file '%s' ---", filename);
+ m_watcher->AddAny(wxFileName::FileName(filename),
+ m_events, wxFSWPath_File);
return wxDIR_CONTINUE;
}
virtual wxDirTraverseResult OnDir(const wxString& dirname)
{
- wxLogTrace(wxTRACE_FSWATCHER, "--- AddTree adding '%s' ---",
- dirname);
+ wxLogTrace(wxTRACE_FSWATCHER,
+ "--- AddTree adding directory '%s' ---", dirname);
// we add as much as possible and ignore errors
- m_watcher->Add(wxFileName(dirname), m_events);
+ m_watcher->AddAny(wxFileName::DirName(dirname),
+ m_events, wxFSWPath_Dir);
return wxDIR_CONTINUE;
}
AddTraverser traverser(this, events);
dir.Traverse(traverser, filter);
+ // Add the path itself explicitly as Traverse() doesn't return it.
+ Add(path.GetPathWithSep(), events);
+
return true;
}
virtual wxDirTraverseResult OnDir(const wxString& dirname)
{
- m_watcher->RemoveTree(wxFileName(dirname));
+ m_watcher->Remove(wxFileName::DirName(dirname));
return wxDIR_CONTINUE;
}
RemoveTraverser traverser(this);
dir.Traverse(traverser);
+ // As in AddTree() above, handle the path itself explicitly.
+ Remove(path);
+
return true;
}