return path;
}
- static int Watcher2NativeFlags(int WXUNUSED(flags))
+ static int Watcher2NativeFlags(int flags)
{
- // TODO: it would be nice to subscribe only to the events we really need
- return IN_ALL_EVENTS;
+ // Start with the standard case of wanting all events
+ if (flags == wxFSW_EVENT_ALL)
+ {
+ return IN_ALL_EVENTS;
+ }
+
+ static const int flag_mapping[][2] = {
+ { wxFSW_EVENT_ACCESS, IN_ACCESS },
+ { wxFSW_EVENT_MODIFY, IN_MODIFY },
+ { wxFSW_EVENT_RENAME, IN_MOVE },
+ { wxFSW_EVENT_CREATE, IN_CREATE },
+ { wxFSW_EVENT_DELETE, IN_DELETE|IN_DELETE_SELF|IN_MOVE_SELF }
+ // wxFSW_EVENT_ERROR/WARNING make no sense here
+ };
+
+ int native_flags = 0;
+ for ( unsigned int i=0; i < WXSIZEOF(flag_mapping); ++i)
+ {
+ if (flags & flag_mapping[i][0])
+ native_flags |= flag_mapping[i][1];
+ }
+
+ return native_flags;
}
static int Native2WatcherFlags(int flags)
{ IN_UNMOUNT, wxFSW_EVENT_ERROR },
{ IN_Q_OVERFLOW, wxFSW_EVENT_WARNING},
- // ignored, because this is genereted mainly by watcher::Remove()
+ // ignored, because this is generated mainly by watcher::Remove()
{ IN_IGNORED, 0 }
};
public:
enum { WAIT_DURATION = 3 };
- EventHandler() :
- eg(EventGenerator::Get()), m_loop(0), m_count(0), m_watcher(0)
+ EventHandler(int types = wxFSW_EVENT_ALL) :
+ eg(EventGenerator::Get()), m_loop(0), m_count(0), m_watcher(0),
+ m_eventTypes(types)
{
m_loop = new wxEventLoop();
Connect(wxEVT_IDLE, wxIdleEventHandler(EventHandler::OnIdle));
// add dir to be watched
wxFileName dir = EventGenerator::GetWatchDir();
- CPPUNIT_ASSERT(m_watcher->Add(dir, wxFSW_EVENT_ALL));
+ CPPUNIT_ASSERT(m_watcher->Add(dir, m_eventTypes));
return true;
}
int m_count; // idle events count
wxFileSystemWatcher* m_watcher;
+ int m_eventTypes; // Which event-types to watch. Normally all of them
bool tested; // indicates, whether we have already passed the test
#include "wx/arrimpl.cpp"
#endif // __WINDOWS__
#endif // !wxHAS_KQUEUE
+#ifdef wxHAS_INOTIFY
+ CPPUNIT_TEST( TestSingleWatchtypeEvent );
+#endif // wxHAS_INOTIFY
+
CPPUNIT_TEST( TestNoEventsAfterRemove );
CPPUNIT_TEST_SUITE_END();
void TestEventRename();
void TestEventModify();
void TestEventAccess();
+#ifdef wxHAS_INOTIFY
+ void TestSingleWatchtypeEvent();
+#endif // wxHAS_INOTIFY
#if !defined(__VISUALC__) || wxCHECK_VISUALC_VERSION(7)
void TestTrees(); // Visual C++ 6 can't build this
#endif
tester.Run();
}
+#ifdef wxHAS_INOTIFY
+// ----------------------------------------------------------------------------
+// TestSingleWatchtypeEvent: Watch only wxFSW_EVENT_ACCESS
+// ----------------------------------------------------------------------------
+void FileSystemWatcherTestCase::TestSingleWatchtypeEvent()
+{
+ wxLogDebug("TestSingleWatchtypeEvent()");
+
+ class EventTester : public EventHandler
+ {
+ public:
+ // We could pass wxFSW_EVENT_CREATE or MODIFY instead, but not RENAME or
+ // DELETE as the event path fields would be wrong in CheckResult()
+ EventTester() : EventHandler(wxFSW_EVENT_ACCESS) {}
+
+ virtual void GenerateEvent()
+ {
+ // As wxFSW_EVENT_ACCESS is passed to the ctor only ReadFile() will
+ // generate an event. Without it they all will, and the test fails
+ CPPUNIT_ASSERT(eg.CreateFile());
+ CPPUNIT_ASSERT(eg.ModifyFile());
+ CPPUNIT_ASSERT(eg.ReadFile());
+ }
+
+ virtual wxFileSystemWatcherEvent ExpectedEvent()
+ {
+ wxFileSystemWatcherEvent event(wxFSW_EVENT_ACCESS);
+ event.SetPath(eg.m_file);
+ event.SetNewPath(eg.m_file);
+ return event;
+ }
+ };
+
+ EventTester tester;
+ tester.Run();
+}
+#endif // wxHAS_INOTIFY
+
// ----------------------------------------------------------------------------
// TestTrees
// ----------------------------------------------------------------------------