/////////////////////////////////////////////////////////////////////////////
-// Name: msw/fswatcher.cpp
+// Name: src/msw/fswatcher.cpp
// Purpose: wxMSWFileSystemWatcher
// Author: Bartosz Bekier
// Created: 2009-05-26
return m_iocp.Add(watch);
}
-bool wxFSWatcherImplMSW::DoRemove(wxSharedPtr<wxFSWatchEntryMSW> watch)
+bool
+wxFSWatcherImplMSW::DoRemove(wxSharedPtr<wxFSWatchEntryMSW> watch)
{
- return true;
+ return m_iocp.ScheduleForRemoval(watch);
}
// TODO ensuring that we have not already set watch for this handle/dir?
bool wxFSWatcherImplMSW::DoSetUpWatch(wxFSWatchEntryMSW& watch)
{
+ BOOL bWatchSubtree = FALSE;
+
+ switch ( watch.GetType() )
+ {
+ case wxFSWPath_File:
+ wxLogError(_("Monitoring individual files for changes is not "
+ "supported currently."));
+ return false;
+
+ case wxFSWPath_Dir:
+ bWatchSubtree = FALSE;
+ break;
+
+ case wxFSWPath_Tree:
+ bWatchSubtree = TRUE;
+ break;
+
+ case wxFSWPath_None:
+ wxFAIL_MSG( "Invalid watch type." );
+ return false;
+ }
+
int flags = Watcher2NativeFlags(watch.GetFlags());
int ret = ReadDirectoryChangesW(watch.GetHandle(), watch.GetBuffer(),
- wxFSWatchEntryMSW::BUFFER_SIZE, TRUE,
+ wxFSWatchEntryMSW::BUFFER_SIZE,
+ bWatchSubtree,
flags, NULL,
watch.GetOverlapped(), NULL);
if (!ret)
wxLogTrace( wxTRACE_FSWATCHER, "[iocp] Read entry: path='%s'",
watch->GetPath());
+ // First check if we're still interested in this watch, we could have
+ // removed it in the meanwhile.
+ if ( m_iocp->CompleteRemoval(watch) )
+ return true;
+
// extract events from buffer info our vector container
wxVector<wxEventProcessingData> events;
const char* memory = static_cast<const char*>(watch->GetBuffer());
// CHECK I heard that returned path can be either in short on long
// form...need to account for that!
wxFileName path = GetEventPath(*watch, e);
- wxFileSystemWatcherEvent event(flags, path, path);
- SendEvent(event);
+ // For files, check that it matches any filespec
+ if ( m_service->MatchesFilespec(path, watch->GetFilespec()) )
+ {
+ wxFileSystemWatcherEvent event(flags, path, path);
+ SendEvent(event);
+ }
}
}
}
return ret;
}
+bool
+wxMSWFileSystemWatcher::AddTree(const wxFileName& path,
+ int events,
+ const wxString& filter)
+{
+ if ( !filter.empty() )
+ {
+ // Use the inefficient generic version as we can only monitor
+ // everything under the given directory.
+ //
+ // Notice that it would probably be better to still monitor everything
+ // natively and filter out the changes we're not interested in.
+ return wxFileSystemWatcherBase::AddTree(path, events, filter);
+ }
+
+
+ if ( !path.DirExists() )
+ {
+ wxLogError(_("Can't monitor non-existent directory \"%s\" for changes."),
+ path.GetFullPath());
+ return false;
+ }
+
+ return AddAny(path, events, wxFSWPath_Tree);
+}
+
#endif // wxUSE_FSWATCHER