From 036fb38eb082f5633448c920c112c61c54a535b7 Mon Sep 17 00:00:00 2001 From: Sean McArdle Date: Wed, 21 Jun 2017 22:37:26 -0700 Subject: [PATCH] Added project files --- CMakeLists.txt | 25 + LICENSE | 5 + lib/efsw/.hg/00changelog.i | Bin 0 -> 57 bytes lib/efsw/.hg/branch | 1 + lib/efsw/.hg/cache/branch2-served | 4 + lib/efsw/.hg/cache/checkisexec | 0 lib/efsw/.hg/cache/checklink | 1 + lib/efsw/.hg/cache/checklink-target | 0 lib/efsw/.hg/cache/checknoexec | 0 lib/efsw/.hg/cache/hgtagsfnodes1 | Bin 0 -> 3984 bytes lib/efsw/.hg/cache/rbc-names-v1 | Bin 0 -> 81 bytes lib/efsw/.hg/cache/rbc-revs-v1 | Bin 0 -> 1328 bytes lib/efsw/.hg/cache/tags2-visible | 2 + lib/efsw/.hg/dirstate | Bin 0 -> 4279 bytes lib/efsw/.hg/hgrc | 14 + lib/efsw/.hg/requires | 5 + lib/efsw/.hg/store/00changelog.i | Bin 0 -> 43196 bytes lib/efsw/.hg/store/00manifest.i | Bin 0 -> 61204 bytes lib/efsw/.hg/store/data/_c_make_lists.txt.i | Bin 0 -> 1796 bytes lib/efsw/.hg/store/data/_l_i_c_e_n_s_e.i | Bin 0 -> 786 bytes lib/efsw/.hg/store/data/_r_e_a_d_m_e.md.i | Bin 0 -> 5219 bytes lib/efsw/.hg/store/data/include/efsw/efsw.h.i | Bin 0 -> 2693 bytes lib/efsw/.hg/store/data/include/efsw/efsw.hpp.i | Bin 0 -> 5516 bytes lib/efsw/.hg/store/data/premake4.lua.i | Bin 0 -> 5876 bytes .../.hg/store/data/project/build.reldbginfo.sh.i | Bin 0 -> 344 bytes .../data/project/qtcreator-linux/efsw.config.i | Bin 0 -> 557 bytes .../data/project/qtcreator-linux/efsw.creator.i | Bin 0 -> 75 bytes .../project/qtcreator-linux/efsw.creator.user.i | Bin 0 -> 16313 bytes .../data/project/qtcreator-linux/efsw.files.i | Bin 0 -> 1791 bytes .../data/project/qtcreator-linux/efsw.includes.i | Bin 0 -> 166 bytes .../store/data/project/qtcreator-osx/efsw.config.i | Bin 0 -> 205 bytes .../data/project/qtcreator-osx/efsw.creator.i | Bin 0 -> 75 bytes .../data/project/qtcreator-osx/efsw.creator.user.i | Bin 0 -> 8137 bytes .../store/data/project/qtcreator-osx/efsw.files.i | Bin 0 -> 1542 bytes .../data/project/qtcreator-osx/efsw.includes.i | Bin 0 -> 166 bytes .../store/data/project/qtcreator-win/efsw.config.i | Bin 0 -> 301 bytes .../data/project/qtcreator-win/efsw.creator.i | Bin 0 -> 75 bytes .../data/project/qtcreator-win/efsw.creator.user.i | Bin 0 -> 8982 bytes .../store/data/project/qtcreator-win/efsw.files.i | Bin 0 -> 1742 bytes .../data/project/qtcreator-win/efsw.includes.i | Bin 0 -> 166 bytes lib/efsw/.hg/store/data/src/efsw/_debug.cpp.i | Bin 0 -> 1097 bytes lib/efsw/.hg/store/data/src/efsw/_debug.hpp.i | Bin 0 -> 943 bytes .../store/data/src/efsw/_dir_watcher_generic.cpp.i | Bin 0 -> 10488 bytes .../store/data/src/efsw/_dir_watcher_generic.hpp.i | Bin 0 -> 1959 bytes .../store/data/src/efsw/_directory_snapshot.cpp.i | Bin 0 -> 1804 bytes .../store/data/src/efsw/_directory_snapshot.hpp.i | Bin 0 -> 499 bytes .../data/src/efsw/_directory_snapshot_diff.cpp.i | Bin 0 -> 265 bytes .../data/src/efsw/_directory_snapshot_diff.hpp.i | Bin 0 -> 590 bytes lib/efsw/.hg/store/data/src/efsw/_file_info.cpp.i | Bin 0 -> 5542 bytes lib/efsw/.hg/store/data/src/efsw/_file_info.hpp.i | Bin 0 -> 1608 bytes .../.hg/store/data/src/efsw/_file_system.cpp.i | Bin 0 -> 4274 bytes .../.hg/store/data/src/efsw/_file_system.hpp.i | Bin 0 -> 1508 bytes .../.hg/store/data/src/efsw/_file_watcher.cpp.i | Bin 0 -> 2903 bytes .../data/src/efsw/_file_watcher_c_wrapper.cpp.i | Bin 0 -> 1286 bytes .../data/src/efsw/_file_watcher_f_s_events.cpp.i | Bin 0 -> 4404 bytes .../data/src/efsw/_file_watcher_f_s_events.hpp.i | Bin 0 -> 2145 bytes .../data/src/efsw/_file_watcher_generic.cpp.i | Bin 0 -> 6966 bytes .../data/src/efsw/_file_watcher_generic.hpp.i | Bin 0 -> 2994 bytes .../store/data/src/efsw/_file_watcher_impl.cpp.i | Bin 0 -> 1720 bytes .../store/data/src/efsw/_file_watcher_impl.hpp.i | Bin 0 -> 2715 bytes .../data/src/efsw/_file_watcher_inotify.cpp.i | Bin 0 -> 12878 bytes .../data/src/efsw/_file_watcher_inotify.hpp.i | Bin 0 -> 2195 bytes .../store/data/src/efsw/_file_watcher_kqueue.cpp.i | Bin 0 -> 13806 bytes .../store/data/src/efsw/_file_watcher_kqueue.hpp.i | Bin 0 -> 3649 bytes .../store/data/src/efsw/_file_watcher_win32.cpp.i | Bin 0 -> 19590 bytes .../store/data/src/efsw/_file_watcher_win32.hpp.i | Bin 0 -> 3212 bytes lib/efsw/.hg/store/data/src/efsw/_lock.hpp.i | Bin 0 -> 257 bytes lib/efsw/.hg/store/data/src/efsw/_log.cpp.i | Bin 0 -> 865 bytes lib/efsw/.hg/store/data/src/efsw/_mutex.cpp.i | Bin 0 -> 231 bytes lib/efsw/.hg/store/data/src/efsw/_mutex.hpp.i | Bin 0 -> 273 bytes lib/efsw/.hg/store/data/src/efsw/_string.cpp.i | Bin 0 -> 3740 bytes lib/efsw/.hg/store/data/src/efsw/_string.hpp.i | Bin 0 -> 5885 bytes lib/efsw/.hg/store/data/src/efsw/_system.cpp.i | Bin 0 -> 482 bytes lib/efsw/.hg/store/data/src/efsw/_system.hpp.i | Bin 0 -> 599 bytes lib/efsw/.hg/store/data/src/efsw/_thread.cpp.i | Bin 0 -> 309 bytes lib/efsw/.hg/store/data/src/efsw/_thread.hpp.i | Bin 0 -> 971 bytes lib/efsw/.hg/store/data/src/efsw/_utf.hpp.i | Bin 0 -> 3319 bytes lib/efsw/.hg/store/data/src/efsw/_utf.inl.i | Bin 0 -> 3136 bytes lib/efsw/.hg/store/data/src/efsw/_watcher.cpp.i | Bin 0 -> 250 bytes lib/efsw/.hg/store/data/src/efsw/_watcher.hpp.i | Bin 0 -> 340 bytes .../store/data/src/efsw/_watcher_f_s_events.cpp.i | Bin 0 -> 8306 bytes .../store/data/src/efsw/_watcher_f_s_events.hpp.i | Bin 0 -> 2079 bytes .../.hg/store/data/src/efsw/_watcher_generic.cpp.i | Bin 0 -> 1425 bytes .../.hg/store/data/src/efsw/_watcher_generic.hpp.i | Bin 0 -> 783 bytes .../.hg/store/data/src/efsw/_watcher_inotify.cpp.i | Bin 0 -> 450 bytes .../.hg/store/data/src/efsw/_watcher_inotify.hpp.i | Bin 0 -> 490 bytes .../.hg/store/data/src/efsw/_watcher_kqueue.cpp.i | Bin 0 -> 20785 bytes .../.hg/store/data/src/efsw/_watcher_kqueue.hpp.i | Bin 0 -> 4350 bytes .../.hg/store/data/src/efsw/_watcher_win32.cpp.i | Bin 0 -> 3737 bytes .../.hg/store/data/src/efsw/_watcher_win32.hpp.i | Bin 0 -> 1701 bytes lib/efsw/.hg/store/data/src/efsw/base.hpp.i | Bin 0 -> 3118 bytes lib/efsw/.hg/store/data/src/efsw/inotify-nosys.h.i | Bin 0 -> 1697 bytes .../data/src/efsw/platform/platformimpl.hpp.i | Bin 0 -> 292 bytes .../efsw/platform/posix/_file_system_impl.cpp.i | Bin 0 -> 2518 bytes .../efsw/platform/posix/_file_system_impl.hpp.i | Bin 0 -> 890 bytes .../data/src/efsw/platform/posix/_mutex_impl.cpp.i | Bin 0 -> 464 bytes .../data/src/efsw/platform/posix/_mutex_impl.hpp.i | Bin 0 -> 378 bytes .../src/efsw/platform/posix/_system_impl.cpp.i | Bin 0 -> 2559 bytes .../src/efsw/platform/posix/_system_impl.hpp.i | Bin 0 -> 588 bytes .../src/efsw/platform/posix/_thread_impl.cpp.i | Bin 0 -> 1023 bytes .../src/efsw/platform/posix/_thread_impl.hpp.i | Bin 0 -> 426 bytes .../src/efsw/platform/win/_file_system_impl.cpp.i | Bin 0 -> 2464 bytes .../src/efsw/platform/win/_file_system_impl.hpp.i | Bin 0 -> 864 bytes .../data/src/efsw/platform/win/_mutex_impl.cpp.i | Bin 0 -> 410 bytes .../data/src/efsw/platform/win/_mutex_impl.hpp.i | Bin 0 -> 409 bytes .../data/src/efsw/platform/win/_system_impl.cpp.i | Bin 0 -> 1676 bytes .../data/src/efsw/platform/win/_system_impl.hpp.i | Bin 0 -> 589 bytes .../data/src/efsw/platform/win/_thread_impl.cpp.i | Bin 0 -> 1175 bytes .../data/src/efsw/platform/win/_thread_impl.hpp.i | Bin 0 -> 669 bytes lib/efsw/.hg/store/data/src/efsw/sophist.h.i | Bin 0 -> 1584 bytes lib/efsw/.hg/store/data/src/test/efsw-test.cpp.i | Bin 0 -> 7882 bytes lib/efsw/.hg/store/data/~2ehgignore.i | Bin 0 -> 328 bytes lib/efsw/.hg/store/data/~2ehgtags.i | Bin 0 -> 112 bytes lib/efsw/.hg/store/fncache | 95 +++ lib/efsw/.hg/store/phaseroots | 0 lib/efsw/.hg/store/undo | Bin 0 -> 3605 bytes lib/efsw/.hg/store/undo.backupfiles | Bin 0 -> 29 bytes lib/efsw/.hg/store/undo.phaseroots | 0 lib/efsw/.hg/undo.bookmarks | 0 lib/efsw/.hg/undo.branch | 1 + lib/efsw/.hg/undo.desc | 3 + lib/efsw/.hg/undo.dirstate | Bin 0 -> 40 bytes lib/efsw/.hgignore | 8 + lib/efsw/.hgtags | 1 + lib/efsw/CMakeLists.txt | 131 ++++ lib/efsw/LICENSE | 22 + lib/efsw/README.md | 138 ++++ lib/efsw/include/efsw/efsw.h | 151 ++++ lib/efsw/include/efsw/efsw.hpp | 197 +++++ lib/efsw/premake4.lua | 220 ++++++ lib/efsw/project/build.reldbginfo.sh | 9 + lib/efsw/project/qtcreator-linux/efsw.config | 1 + lib/efsw/project/qtcreator-linux/efsw.creator | 1 + lib/efsw/project/qtcreator-linux/efsw.creator.user | 406 ++++++++++ lib/efsw/project/qtcreator-linux/efsw.files | 115 +++ lib/efsw/project/qtcreator-linux/efsw.includes | 2 + lib/efsw/project/qtcreator-osx/efsw.config | 2 + lib/efsw/project/qtcreator-osx/efsw.creator | 1 + lib/efsw/project/qtcreator-osx/efsw.creator.user | 296 ++++++++ lib/efsw/project/qtcreator-osx/efsw.files | 185 +++++ lib/efsw/project/qtcreator-osx/efsw.includes | 2 + lib/efsw/project/qtcreator-win/efsw.config | 1 + lib/efsw/project/qtcreator-win/efsw.creator | 1 + lib/efsw/project/qtcreator-win/efsw.creator.user | 285 ++++++++ lib/efsw/project/qtcreator-win/efsw.files | 214 ++++++ lib/efsw/project/qtcreator-win/efsw.includes | 2 + lib/efsw/src/efsw/Debug.cpp | 85 +++ lib/efsw/src/efsw/Debug.hpp | 50 ++ lib/efsw/src/efsw/DirWatcherGeneric.cpp | 451 ++++++++++++ lib/efsw/src/efsw/DirWatcherGeneric.hpp | 55 ++ lib/efsw/src/efsw/DirectorySnapshot.cpp | 263 +++++++ lib/efsw/src/efsw/DirectorySnapshot.hpp | 46 ++ lib/efsw/src/efsw/DirectorySnapshotDiff.cpp | 29 + lib/efsw/src/efsw/DirectorySnapshotDiff.hpp | 35 + lib/efsw/src/efsw/FileInfo.cpp | 279 +++++++ lib/efsw/src/efsw/FileInfo.hpp | 66 ++ lib/efsw/src/efsw/FileSystem.cpp | 124 ++++ lib/efsw/src/efsw/FileSystem.hpp | 40 + lib/efsw/src/efsw/FileWatcher.cpp | 145 ++++ lib/efsw/src/efsw/FileWatcherCWrapper.cpp | 132 ++++ lib/efsw/src/efsw/FileWatcherFSEvents.cpp | 270 +++++++ lib/efsw/src/efsw/FileWatcherFSEvents.hpp | 107 +++ lib/efsw/src/efsw/FileWatcherGeneric.cpp | 189 +++++ lib/efsw/src/efsw/FileWatcherGeneric.hpp | 59 ++ lib/efsw/src/efsw/FileWatcherImpl.cpp | 29 + lib/efsw/src/efsw/FileWatcherImpl.hpp | 54 ++ lib/efsw/src/efsw/FileWatcherInotify.cpp | 525 +++++++++++++ lib/efsw/src/efsw/FileWatcherInotify.hpp | 73 ++ lib/efsw/src/efsw/FileWatcherKqueue.cpp | 266 +++++++ lib/efsw/src/efsw/FileWatcherKqueue.hpp | 78 ++ lib/efsw/src/efsw/FileWatcherWin32.cpp | 313 ++++++++ lib/efsw/src/efsw/FileWatcherWin32.hpp | 74 ++ lib/efsw/src/efsw/Lock.hpp | 27 + lib/efsw/src/efsw/Log.cpp | 27 + lib/efsw/src/efsw/Mutex.cpp | 26 + lib/efsw/src/efsw/Mutex.hpp | 28 + lib/efsw/src/efsw/String.cpp | 813 +++++++++++++++++++++ lib/efsw/src/efsw/String.hpp | 629 ++++++++++++++++ lib/efsw/src/efsw/System.cpp | 26 + lib/efsw/src/efsw/System.hpp | 26 + lib/efsw/src/efsw/Thread.cpp | 51 ++ lib/efsw/src/efsw/Thread.hpp | 111 +++ lib/efsw/src/efsw/Utf.hpp | 748 +++++++++++++++++++ lib/efsw/src/efsw/Utf.inl | 671 +++++++++++++++++ lib/efsw/src/efsw/Watcher.cpp | 21 + lib/efsw/src/efsw/Watcher.hpp | 30 + lib/efsw/src/efsw/WatcherFSEvents.cpp | 264 +++++++ lib/efsw/src/efsw/WatcherFSEvents.hpp | 70 ++ lib/efsw/src/efsw/WatcherGeneric.cpp | 40 + lib/efsw/src/efsw/WatcherGeneric.hpp | 30 + lib/efsw/src/efsw/WatcherInotify.cpp | 35 + lib/efsw/src/efsw/WatcherInotify.hpp | 25 + lib/efsw/src/efsw/WatcherKqueue.cpp | 667 +++++++++++++++++ lib/efsw/src/efsw/WatcherKqueue.hpp | 94 +++ lib/efsw/src/efsw/WatcherWin32.cpp | 144 ++++ lib/efsw/src/efsw/WatcherWin32.hpp | 77 ++ lib/efsw/src/efsw/base.hpp | 115 +++ lib/efsw/src/efsw/inotify-nosys.h | 159 ++++ lib/efsw/src/efsw/platform/platformimpl.hpp | 20 + .../src/efsw/platform/posix/FileSystemImpl.cpp | 144 ++++ .../src/efsw/platform/posix/FileSystemImpl.hpp | 27 + lib/efsw/src/efsw/platform/posix/MutexImpl.cpp | 32 + lib/efsw/src/efsw/platform/posix/MutexImpl.hpp | 31 + lib/efsw/src/efsw/platform/posix/SystemImpl.cpp | 180 +++++ lib/efsw/src/efsw/platform/posix/SystemImpl.hpp | 26 + lib/efsw/src/efsw/platform/posix/ThreadImpl.cpp | 68 ++ lib/efsw/src/efsw/platform/posix/ThreadImpl.hpp | 35 + lib/efsw/src/efsw/platform/win/FileSystemImpl.cpp | 89 +++ lib/efsw/src/efsw/platform/win/FileSystemImpl.hpp | 28 + lib/efsw/src/efsw/platform/win/MutexImpl.cpp | 29 + lib/efsw/src/efsw/platform/win/MutexImpl.hpp | 34 + lib/efsw/src/efsw/platform/win/SystemImpl.cpp | 50 ++ lib/efsw/src/efsw/platform/win/SystemImpl.hpp | 26 + lib/efsw/src/efsw/platform/win/ThreadImpl.cpp | 64 ++ lib/efsw/src/efsw/platform/win/ThreadImpl.hpp | 41 ++ lib/efsw/src/efsw/sophist.h | 147 ++++ lib/efsw/src/test/efsw-test.cpp | 151 ++++ main.cpp | 60 ++ 218 files changed, 12620 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 lib/efsw/.hg/00changelog.i create mode 100644 lib/efsw/.hg/branch create mode 100644 lib/efsw/.hg/cache/branch2-served create mode 100755 lib/efsw/.hg/cache/checkisexec create mode 120000 lib/efsw/.hg/cache/checklink create mode 100644 lib/efsw/.hg/cache/checklink-target create mode 100644 lib/efsw/.hg/cache/checknoexec create mode 100644 lib/efsw/.hg/cache/hgtagsfnodes1 create mode 100644 lib/efsw/.hg/cache/rbc-names-v1 create mode 100644 lib/efsw/.hg/cache/rbc-revs-v1 create mode 100644 lib/efsw/.hg/cache/tags2-visible create mode 100644 lib/efsw/.hg/dirstate create mode 100644 lib/efsw/.hg/hgrc create mode 100644 lib/efsw/.hg/requires create mode 100644 lib/efsw/.hg/store/00changelog.i create mode 100644 lib/efsw/.hg/store/00manifest.i create mode 100644 lib/efsw/.hg/store/data/_c_make_lists.txt.i create mode 100644 lib/efsw/.hg/store/data/_l_i_c_e_n_s_e.i create mode 100644 lib/efsw/.hg/store/data/_r_e_a_d_m_e.md.i create mode 100644 lib/efsw/.hg/store/data/include/efsw/efsw.h.i create mode 100644 lib/efsw/.hg/store/data/include/efsw/efsw.hpp.i create mode 100644 lib/efsw/.hg/store/data/premake4.lua.i create mode 100644 lib/efsw/.hg/store/data/project/build.reldbginfo.sh.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.config.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.creator.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.creator.user.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.files.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.includes.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.config.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.creator.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.creator.user.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.files.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.includes.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-win/efsw.config.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-win/efsw.creator.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-win/efsw.creator.user.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-win/efsw.files.i create mode 100644 lib/efsw/.hg/store/data/project/qtcreator-win/efsw.includes.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_debug.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_debug.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_dir_watcher_generic.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_dir_watcher_generic.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_directory_snapshot.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_directory_snapshot.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_directory_snapshot_diff.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_directory_snapshot_diff.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_info.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_info.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_system.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_system.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_c_wrapper.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_f_s_events.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_f_s_events.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_generic.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_generic.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_inotify.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_inotify.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_kqueue.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_kqueue.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_win32.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_file_watcher_win32.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_lock.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_log.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_mutex.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_mutex.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_string.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_string.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_system.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_system.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_thread.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_thread.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_utf.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_utf.inl.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_f_s_events.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_f_s_events.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_generic.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_generic.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_inotify.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_inotify.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_kqueue.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_kqueue.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_win32.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/_watcher_win32.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/base.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/inotify-nosys.h.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/platformimpl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_file_system_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_file_system_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_mutex_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_mutex_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_system_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_system_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_thread_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/posix/_thread_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_file_system_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_file_system_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_mutex_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_mutex_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_system_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_system_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_thread_impl.cpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/platform/win/_thread_impl.hpp.i create mode 100644 lib/efsw/.hg/store/data/src/efsw/sophist.h.i create mode 100644 lib/efsw/.hg/store/data/src/test/efsw-test.cpp.i create mode 100644 lib/efsw/.hg/store/data/~2ehgignore.i create mode 100644 lib/efsw/.hg/store/data/~2ehgtags.i create mode 100644 lib/efsw/.hg/store/fncache create mode 100644 lib/efsw/.hg/store/phaseroots create mode 100644 lib/efsw/.hg/store/undo create mode 100644 lib/efsw/.hg/store/undo.backupfiles create mode 100644 lib/efsw/.hg/store/undo.phaseroots create mode 100644 lib/efsw/.hg/undo.bookmarks create mode 100644 lib/efsw/.hg/undo.branch create mode 100644 lib/efsw/.hg/undo.desc create mode 100644 lib/efsw/.hg/undo.dirstate create mode 100644 lib/efsw/.hgignore create mode 100644 lib/efsw/.hgtags create mode 100644 lib/efsw/CMakeLists.txt create mode 100644 lib/efsw/LICENSE create mode 100644 lib/efsw/README.md create mode 100644 lib/efsw/include/efsw/efsw.h create mode 100644 lib/efsw/include/efsw/efsw.hpp create mode 100644 lib/efsw/premake4.lua create mode 100644 lib/efsw/project/build.reldbginfo.sh create mode 100644 lib/efsw/project/qtcreator-linux/efsw.config create mode 100644 lib/efsw/project/qtcreator-linux/efsw.creator create mode 100644 lib/efsw/project/qtcreator-linux/efsw.creator.user create mode 100644 lib/efsw/project/qtcreator-linux/efsw.files create mode 100644 lib/efsw/project/qtcreator-linux/efsw.includes create mode 100644 lib/efsw/project/qtcreator-osx/efsw.config create mode 100644 lib/efsw/project/qtcreator-osx/efsw.creator create mode 100644 lib/efsw/project/qtcreator-osx/efsw.creator.user create mode 100644 lib/efsw/project/qtcreator-osx/efsw.files create mode 100644 lib/efsw/project/qtcreator-osx/efsw.includes create mode 100644 lib/efsw/project/qtcreator-win/efsw.config create mode 100644 lib/efsw/project/qtcreator-win/efsw.creator create mode 100644 lib/efsw/project/qtcreator-win/efsw.creator.user create mode 100644 lib/efsw/project/qtcreator-win/efsw.files create mode 100644 lib/efsw/project/qtcreator-win/efsw.includes create mode 100644 lib/efsw/src/efsw/Debug.cpp create mode 100644 lib/efsw/src/efsw/Debug.hpp create mode 100644 lib/efsw/src/efsw/DirWatcherGeneric.cpp create mode 100644 lib/efsw/src/efsw/DirWatcherGeneric.hpp create mode 100644 lib/efsw/src/efsw/DirectorySnapshot.cpp create mode 100644 lib/efsw/src/efsw/DirectorySnapshot.hpp create mode 100644 lib/efsw/src/efsw/DirectorySnapshotDiff.cpp create mode 100644 lib/efsw/src/efsw/DirectorySnapshotDiff.hpp create mode 100644 lib/efsw/src/efsw/FileInfo.cpp create mode 100644 lib/efsw/src/efsw/FileInfo.hpp create mode 100644 lib/efsw/src/efsw/FileSystem.cpp create mode 100644 lib/efsw/src/efsw/FileSystem.hpp create mode 100644 lib/efsw/src/efsw/FileWatcher.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherCWrapper.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherFSEvents.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherFSEvents.hpp create mode 100644 lib/efsw/src/efsw/FileWatcherGeneric.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherGeneric.hpp create mode 100644 lib/efsw/src/efsw/FileWatcherImpl.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherImpl.hpp create mode 100644 lib/efsw/src/efsw/FileWatcherInotify.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherInotify.hpp create mode 100644 lib/efsw/src/efsw/FileWatcherKqueue.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherKqueue.hpp create mode 100644 lib/efsw/src/efsw/FileWatcherWin32.cpp create mode 100644 lib/efsw/src/efsw/FileWatcherWin32.hpp create mode 100644 lib/efsw/src/efsw/Lock.hpp create mode 100644 lib/efsw/src/efsw/Log.cpp create mode 100644 lib/efsw/src/efsw/Mutex.cpp create mode 100644 lib/efsw/src/efsw/Mutex.hpp create mode 100644 lib/efsw/src/efsw/String.cpp create mode 100644 lib/efsw/src/efsw/String.hpp create mode 100644 lib/efsw/src/efsw/System.cpp create mode 100644 lib/efsw/src/efsw/System.hpp create mode 100644 lib/efsw/src/efsw/Thread.cpp create mode 100644 lib/efsw/src/efsw/Thread.hpp create mode 100644 lib/efsw/src/efsw/Utf.hpp create mode 100644 lib/efsw/src/efsw/Utf.inl create mode 100644 lib/efsw/src/efsw/Watcher.cpp create mode 100644 lib/efsw/src/efsw/Watcher.hpp create mode 100644 lib/efsw/src/efsw/WatcherFSEvents.cpp create mode 100644 lib/efsw/src/efsw/WatcherFSEvents.hpp create mode 100644 lib/efsw/src/efsw/WatcherGeneric.cpp create mode 100644 lib/efsw/src/efsw/WatcherGeneric.hpp create mode 100644 lib/efsw/src/efsw/WatcherInotify.cpp create mode 100644 lib/efsw/src/efsw/WatcherInotify.hpp create mode 100644 lib/efsw/src/efsw/WatcherKqueue.cpp create mode 100644 lib/efsw/src/efsw/WatcherKqueue.hpp create mode 100644 lib/efsw/src/efsw/WatcherWin32.cpp create mode 100644 lib/efsw/src/efsw/WatcherWin32.hpp create mode 100644 lib/efsw/src/efsw/base.hpp create mode 100644 lib/efsw/src/efsw/inotify-nosys.h create mode 100644 lib/efsw/src/efsw/platform/platformimpl.hpp create mode 100644 lib/efsw/src/efsw/platform/posix/FileSystemImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/posix/FileSystemImpl.hpp create mode 100644 lib/efsw/src/efsw/platform/posix/MutexImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/posix/MutexImpl.hpp create mode 100644 lib/efsw/src/efsw/platform/posix/SystemImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/posix/SystemImpl.hpp create mode 100644 lib/efsw/src/efsw/platform/posix/ThreadImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/posix/ThreadImpl.hpp create mode 100644 lib/efsw/src/efsw/platform/win/FileSystemImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/win/FileSystemImpl.hpp create mode 100644 lib/efsw/src/efsw/platform/win/MutexImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/win/MutexImpl.hpp create mode 100644 lib/efsw/src/efsw/platform/win/SystemImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/win/SystemImpl.hpp create mode 100644 lib/efsw/src/efsw/platform/win/ThreadImpl.cpp create mode 100644 lib/efsw/src/efsw/platform/win/ThreadImpl.hpp create mode 100644 lib/efsw/src/efsw/sophist.h create mode 100644 lib/efsw/src/test/efsw-test.cpp create mode 100644 main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f359e75 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.7) +project(fscanary) + +set(CMAKE_CXX_STANDARD 14) + + +add_subdirectory( + lib/efsw +) + + +include_directories( + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/lib + ${CMAKE_SOURCE_DIR}/lib/efsw/include +) + +set(SOURCE_FILES main.cpp) +add_executable(fscanary ${SOURCE_FILES}) + +set( LIBS + efsw +) + +target_link_libraries(${PROJECT_NAME} ${LIBS}) \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c3cb1a7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,5 @@ +/* Copyright (C) Sean McArdle - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + * Written by Sean McArdle , Jun 21, 2017 + */ \ No newline at end of file diff --git a/lib/efsw/.hg/00changelog.i b/lib/efsw/.hg/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..d3a8311050e54c57c5be7cfe169e60a95768812c GIT binary patch literal 57 zcmWN_K?=Yi3q%@)-Vm7*{(J5U>IijhdQ^+)}MCGAS6mlu2ObV?nc}N?ZwjM-^ zC`T7LD|0vUkm?pCcbo=kEKZa<;8 z50^GDmC!$ty%)-ji%OtA_e%y0AEtW(OF4o2;Ph6m2qq2R$AR|#&1|SqNpHc6*X{zd ztC1=$%>VdH0_XR(TEMW)(kR$3viSrbXQyRC=eX4eA)BXhgT*=b+Tf$)o*B^VxOV^) zj!@7%&WQ|iLzd7kY@R>VPIah;-6KnAUBO*P8<9^dawvy* z($4p$WIYLpQyc>PpwCk3}|beEu1}245np?`YCssHL3*W=pDQ zUCY!R1;{-zHPxw37enVWEc7h(bJf$c0neK!dxyiX{G^F6ddQtQu!MQ8{p#zk#kz+WCd^)o=hk`d5viv9P~Scr*)^p+1r{VZ9)kTvr1>=z7FbbT zvNwq6e)J0aAEDhwy5RuSj~>4ba=G``L#9$r_bK*GLn!h$V}%x4?Wit=xwe0)|2R$z zo&TU_X*t@D48EpwGd8+qApae?jmG~tu8GdEulV6jYEKz6(dyN=dDo9AIe)gIT>4m1N?*Tr>h!tj`{?@GO7(QD zirv7b_=Ci`BY*z&d){b%DF*8{ifMZnGXV+RQt(9kP%~(2-++KA47X zn)VZqOGxz%AomL7Mi{Ui33BfeAomN%R^9J&_aP9E2t<5>qUeUt0RE7G1A4Mny}<0i zm%Ptj%LM2R5~WJwa^OiG573Q(hZyA{-1KG;ud_00%`aJ){%b$oM25_qlST9POA zRZtHVQG4?ASmbc{3$XSHmL$OQ%x0e1kOEXM0e?{7MSvGgyFxxF2ignZlm!Q>t=Uds z8eQoW6DM{Pk7WB9;7Nm5+8(PnC7a57z>G!unJwG#7!(}-7hkA`SJ_tBCm>g3Q3T(2 z;H247T3lU#-TMUTY+y)f)OcqUSWV85(rTdus}BpSl2%E7QfBtv0D4g65q$X_z;g>B zE7aU|;P<!;w%EZvpi{j0%_^^x|BO|C3;96R^jGF`;?Vg_7#jOUiSgJvtyI z4aYX38cYWJ%q=kHg(EX*iDldIyU{cQQ04VPlXTr_oR=!9Y{3+zH$56jZ1pI>RQJj3 zCdkYYK&X5qxv)0~u8jen>GA9gDg6g*VS1(VCl}+NfVN*GONuCG0jNKKu-jouQkHn3 z59*w~AyhJ?y)ngaPzQK2XwgVb zCR2vKM{qRWlC>_y&u7qpT}tT5cVVz_Vo421XI=Oew6T|~CssGAdZ)?f`9JuQX#sM& zeH)mg0}qa+tA{@GV146TFb`*$BF8yAwF=&h5FUjjwVCz@Kr~hIJCjbL{s>B@U--R( zuxG9m$1eIMFZRC*V<+R2d{Py>Zb&+156mrQQz%s(0zuvdDW_D^c?V@`7JepIHtOfu zdh|N+^MH7fQlG*Z*q3H1I(cDL_P;)Fs(k%0-tCFD@*E33QObi?&7gT(Ty-1hVEF>4J372 wKhB%K=+RAfwNEpdUU%e2i24BlcYSry5of*xXYh52q8Psl0$oO>)5R0ue-<@Q0RR91 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/hgrc b/lib/efsw/.hg/hgrc new file mode 100644 index 0000000..5d7a310 --- /dev/null +++ b/lib/efsw/.hg/hgrc @@ -0,0 +1,14 @@ +# example repository config (see 'hg help config' for more info) +[paths] +default = https://bitbucket.org/SpartanJ/efsw + +# path aliases to other clones of this repo in URLs or filesystem paths +# (see 'hg help config.paths' for more info) +# +# default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork +# my-fork = ssh://jdoe@example.net/hg/jdoes-fork +# my-clone = /home/jdoe/jdoes-clone + +[ui] +# name and email (local to this repository, optional), e.g. +# username = Jane Doe diff --git a/lib/efsw/.hg/requires b/lib/efsw/.hg/requires new file mode 100644 index 0000000..64bcea1 --- /dev/null +++ b/lib/efsw/.hg/requires @@ -0,0 +1,5 @@ +dotencode +fncache +generaldelta +revlogv1 +store diff --git a/lib/efsw/.hg/store/00changelog.i b/lib/efsw/.hg/store/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..7bb5ed17b4db41bce69a7f624c1256d9a2205950 GIT binary patch literal 43196 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�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 n>vJTHn0)rVhtqFpSey3Vi9K@$^?^ler*5O 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 V6a)lH@(EhmSV9D?gaK#se*j>gso($r literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/_c_make_lists.txt.i b/lib/efsw/.hg/store/data/_c_make_lists.txt.i new file mode 100644 index 0000000000000000000000000000000000000000..b1d11a55046e7d521ab2cde5658794033b7d4bb2 GIT binary patch literal 1796 zcmZWpc{tR09R7{L<7k$0-y*^oVMoq&j2Vng`e#+{O5l^LoTVshjvYmM#MfA)Qz_xrxj^Zoqsc|U)=02lxPhv3%+fFE@J^}yBr z?=Wd-dhFI>k9Ix2m*z0^7olTNhq!I^og!;kW8NVWeoKm6hH7seqwPV@>hsa zx-`|Gre2$3ErBC-!kzW<*Pd~iI&S*GEL)w;o#AEk!pH#SJ$t|Ffr}?cNXhSJ&9Yy; zZM+pRUO&X)=3QOvH=aB(-EHkz_zoo5OGF)Kxb%qc;iz+Jie0{vk8mrW-;iG>RB;|eT*6E-qAqGvASj|HpXt>j zbC&B%34(iN^NDnOf`fWf&I?;9*Z%1S5PYNP6v-QL!)Z{Mvvq7Gs}XCb)8VS3H)|4E z1`=&Z--Zg)Os0@5^%e$xU$!YOwXGa)XUizYsorV47Fw>-teE=-IU1397d{Cqt}_*n z5i!u%&LFFC>|)Y<_#Q_nmfj-gp#Kgtp8LqnyZ_kdX)yCiE%XSW&)Eg0JLy~%(>Wt=Rq@0kQ zXpcZy)$r#jnPhS$Rb_RVU3`ODFyl#=C|yq$TnQ(kv~^SmLxJ0s3~<*+6DjwU zEa&HL-Tu=*?|N|vp(^uM%X3<NYVErxLw_-VS^ZJ=Vy`D_}ZhQSlKFJm3;HW zymrmcDK>fz!oE~Dk3@VMBAg5<{>CHSd4@RgvxO?eou)&IN;r>Oc){iICX zpq$2Dx4hYt;EvLYMOe`){G@R%eQSPNm=EroHm0B6o%YQ&_Q%+o>eI#S(_Ojw8RhUz zZv)6sQBD^w`$7;SWM#JTV$nC4PP4b?YJ!ou@(Yh2H6hixqj9!&K{ax(|E}_1%;Tys_VgV zu+vJx=s7pGr}n5+16*c+9AZ)vqTA<;BkhBpN@vFL+JaXx2N*sm z8rq=)fGD2wx~2nreV}0Rs|k%bua$UbxWfqSxbc1FP!dWnP;ErI^~F&kOoUDnS=YCc zxXG{gpkB7Fc~WErG3}xuOMxF1ScUs{+9n)x#URC%ibg(fXM?b_fOkBAz4y|gdI^Ym z9yevRWC=hgT||#37KY&4`!>C)%D2D z`2TcKX3?u6E#I;wOC5?hsUR(2(PX%l`)6#rl3Rh|h?gSuh1AP<9QK?-#qDmK%3B#K zrH835H}+}tipEk0wf!g+xi_DjjPYYoT2GzWaA5Hw@oyaly9)qf0tb#)!?8T&UBm10 zU-vza*{`yFdrQnZ>I~|%tjrGn{zF1(0D4Y35IsjnqtUnKoSe>NxSnwy7#z^;9~^;B zj6z%o`^OeA=s7AsOTgObE9JZ+9B)Bm`T3G;E%p=-xF?zC{(weM>hPQYX^&{DNWine zMBiBp_0TWThPiq07Q=OlIKiuvu$C zwYB%#W1|nJzd!%wn+QasN16Z27n>m#w|T(WA0ScGt@UiN_#Pk%Q)|yunoggRP+FMD0WU&jy!}HD!R$wyLrJ0AqSH7UcJCE}G)GWS zAYp)+zCsvh5B{t=jmae_=WJmV;z4PP{-hhPJn zsfU`WilyjsmDiakF}=wq@DbSHvv^U Q3pj1K9k+7)7rY6H({}1~&Hw-a literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/_r_e_a_d_m_e.md.i b/lib/efsw/.hg/store/data/_r_e_a_d_m_e.md.i new file mode 100644 index 0000000000000000000000000000000000000000..42d08c4d0f89743b87c765a3b621fc66440e7396 GIT binary patch literal 5219 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/include/efsw/efsw.h.i b/lib/efsw/.hg/store/data/include/efsw/efsw.h.i new file mode 100644 index 0000000000000000000000000000000000000000..539b0cf3a1785d7443848f7891c45d2b545e2e4d GIT binary patch literal 2693 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/include/efsw/efsw.hpp.i b/lib/efsw/.hg/store/data/include/efsw/efsw.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..1bbb27ce8c2d2cbf78a5be06339dc24e9e78db85 GIT binary patch literal 5516 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%0A-d(W2+R=`LK!_EU7;%j=H$uT{-~2&O#h z)ghkU5yo?mv87z;Pc1Q)uA3CEUz*ne8HbQ!-mj2v5C~NXFr);~4dh@Yh!)wz#t$7I zC-M3q_t0U!51dW zGzosOfu9bw7T)+9B2rQhBC%cuUUhiKY>tf=fvru1Jh+}&>BG>3n;WerS$v<|nwO|5 zL7T18w|N0kon_qiL61C|N5m_ zcK;@?ev)~{qAuxWUX4)8S+{Dv_RFASicj&A7Gw7+K5Tw%W$X3^_t&J2=ED zjD&Ggexc6Sdaj~c!1qt&Oh9RIsmpo^9lr@bPjd@iY=6kF(^zyOJ^0@$Dgcon2X`UeqN5v~Z3WTc5W{wMl)`iI<^rFo z{{W79YU~A`e{w3L2L4?ZbzV+A$-!6W&nIDI;fl=7$!X@W{wKQvt=M{j%3r%^Yg^Ewg!24^CG2^lVuAx6t_5WV1inD55Mi$-~Xc7&0jD zI5@M;7Ax+}hHf^j*Rv0DX52X737*!9rP6@(mGzXm@0Ga-5_OVNec${kwopD5`7%93 zK;Ug!8w1CaC<$f(@{kfG<7!GNIf=9({~NW*Y`ANmy}I?2^ynU}3KE(IzFO6Uu9usB zBV+1=UVd;nCI2p8{euZM;1!^#ecY^!hzw?3usu~CmGw6rM10@ipW_hvrOIvFWTqf% zq<^|k?Vt4$>vRDrEf=#(2Yf;bY7{J`-OMij06!3Jf}P`J7;_|kaZeEtYWqmvOxo#o zBIl7I-F5H0RPw%(S^!TQpg`u!}iBX9!ikRaga5Q2P1i%WQ*Z?WkC{Q@y zmnAiTX&?s+CuLK*;C#eF()H<@)bk4sCDH8dV_@zdfQ5thr52^U$M+*uOFn=_kR~M0 zyU4$s##i%d^IZs&56gZZQr5QOZ7T5z*#%7sbM zkV~9>uP`C&Hl~>&Nr`BG?h>ytRoMNtfG;(oFU49;tPkY*-4b zy2o~1{gcY^@xC<8Om7kNPZH#XX#Y6P190mgmX-5?zoK3F|CRPRbmP2*tTt<3M8GDriwhj)BS=% zhsxf!tw+h0Y*C+RKPY3X8muhi9W|hj^xW+wzZr9S)qwdMe@tGk9FI!w)nUcomnEM& z6t$h}4~Z}2<9#T88@g;9@gUxc&S6dI=rfz?w{{mNT`;6bVaa#wneJRTdKXMhh1D`v hJSD`cy?nGItK>S*Q`Qw`d6e*N=|KmcwZTov{{UfH#r6OI literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/build.reldbginfo.sh.i b/lib/efsw/.hg/store/data/project/build.reldbginfo.sh.i new file mode 100644 index 0000000000000000000000000000000000000000..c4afaccc21e63ba4b2e4c8d3b7ed930054150f7f GIT binary patch literal 344 zcmZQzW?*E1fD|Bg6v|Hf4+XQmWy;%A%|qw)8nM-c{juRs()j>Y1EwnG1czPmKXvA^ z{<#NUet{P*UuIu4=Zwm_IX0|!lUNnBP1o*-S#J^Ve>A}VsE7YiiBO)|Rw{Dh;dMb_ zMRkr#o7Uyk#rZAGE6d7i%=5|$%Cw5xd{Aq`7qRIgsgEumXJu$QV#fxy2;@2jh7urt z4`wkiq=RUXGe3!IHnKQSYx4d56X4$(ts9=GGD|DgFGpNUL;n za4>gCaL{D0%c4a_lY=gIo&MVO`D+Nz*N~nsAw3V15=2kTQatwf%89AdPO>t*4b~3; E0FQNqj{pDw literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.config.i b/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.config.i new file mode 100644 index 0000000000000000000000000000000000000000..c41ca86b7723d8815b7dea41d5365c0d7b0f5836 GIT binary patch literal 557 zcmZQzW?*E100kf=4`nm_hXM&3*IK#xTkkBlbegCcY8&IhTB8M11ENdy^%WdlToeL= zTwPqgZzUPJY0iZ6}iA_72u>Xn8m=r3!*_*M6A|0B;&W#O)_oje>PXG zPV?tqze3f(D3F^#SVTD`H7zqQRUtm!ttd6sDcB`G9%8-&Sg9hAQ~+WoAm#&NMv(cF zZr0fDefl)jTQfU*@z?X73fku)fpTy_$o&ut62a!2AMU(n04>vK#$;WZMiONsy9D- z`p?`3ltTs>f#K>F93Jl-80s483UO;MSh)g_1gT{OVjCc40h#|)BlG&=66<{z)Ads{ S<|*vkWtOH2l!F68fdK$rrhO6s literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.creator.i b/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.creator.i new file mode 100644 index 0000000000000000000000000000000000000000..fe583623f640e135af36dee97e996e95a74600c2 GIT binary patch literal 75 zcmZQzW?*E10B#_~1!Xh*hXMzd9cDL8ddt?|%Hq12zpbD__wiwv8W3F??Vg&KT9lX* G%LM@76cz^n literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.creator.user.i b/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.creator.user.i new file mode 100644 index 0000000000000000000000000000000000000000..a54665c8aef4059017878b98b91b58cb02a496aa GIT binary patch literal 16313 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 aV^;33W-v>=T_(NGZ;HpTK7HpU`+orTJ8=d8 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.files.i b/lib/efsw/.hg/store/data/project/qtcreator-linux/efsw.files.i new file mode 100644 index 0000000000000000000000000000000000000000..31ec563b47675feae7461120f0ca78ae2fea9dd9 GIT binary patch literal 1791 zcmZux2~bm46#WTEQ7IT90(D^#1d;qe00kNc!9*nx6;O;y#Yhqp*&;*Ke z2>uv0TQF^7*hk%3U14Qb@Wyao@R9Wml&tC|Vb6@eKKVeD7QW48@2PW{lRjP*z!wg+ z&Gp+NYU~WU_fAH+C=Zl(nLlVX@oPU}(}rJny*CsvHjpTAX4o^*S^Mi2ISIRM!Wfaw z*@pS$aY<7d3!@^b+spjs_2;%PDlqjeIcQ)Zlig752_` zE++`i?yb&OZTg5s}2*7%l-KovPU;w?E8)@=w&&ZLL@!SYD*|4rNNkmGeBjTWun%9_{^a7uV4`DPwRJ3{F^`7HfILb(1e-qDBB zYIX2h@91rk9lvykPL8%zc}sgKmxk8HnjbjOJb!aS)~Ok+jTCV01gig&=kk1;1S31 zqq&iMcRXqzcNTOa2$8D?aJvOxfy{*n({pmVLioRv&y_5Tgl0lu!gv(!z+H zJ*7M>!oXqW%I~e6aMqIz>}B{(gQLNA}p3YYinUof|M#H zXBoS2&<+XxZu!veQ>a$_Rf(v<8Isu)7EbA?Xv}$BDRaC&rWzRm@f0T54!u$*R)$)Y&0&(3Sls7lh@ zEvYA8Dns5ng_?Zd2%3x^`+TRL+m}0f+_bAv(LAZwl%9)g7;v+XD~oxyW;c1~&yo1w zaBLbFn45#wZkUQ#i4yvOTe1{bUjd;*gdFyE)lFHISpGz}kkK{w2lBKG5Da7G) z6W|c?1&2@5rgT&|dt5!sLE~m;ZWpX~A~m(;+L`X2yUr3znsSF{3nP9&>AV4hB48N; z@r4K(#Jo16rVR|%r5G9tQX4Y4Mv~!G;M>0oF?a-SR0i$;Zd5zEOE$SDLY(Ms4?7IA zLXXnd`C!iKC6h3Po;ymk093vTteHU8Lxh!C#uBVMxCG61=v?OU7uG*0j6K#yLU1HW#Xg>*akX)V8mNi|bQU)wWfA zsYD!G+F_myQ|aZPgv&6@1YW1vKw=?64%@OvU2B^rUIrJ;)Z7~L+c|Eloc?D+Ay7fy ah`ZH)jnk|AxF`e! zxw^QzdHT7!DEK-$2l)ppc(?|+DspjwRe_9VV9)_#doYWE!5Kt@?3f_Qu_)Ya-P31+ zd-XzRRhoQA=U53<1Eb`D3qE2=EUIadqJW E0P$lnT>t<8 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.creator.i b/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.creator.i new file mode 100644 index 0000000000000000000000000000000000000000..2f85fa13b14bdb46e899b0bf15d2ecafc3a41138 GIT binary patch literal 75 zcmZQzW?*E10B#_~1!W8ThXMzd9cDL8ddt?|%Hq12zpbD__wiw<8ZcEF?Vg&KT9lX* G%LM@AR2CNi literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.creator.user.i b/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.creator.user.i new file mode 100644 index 0000000000000000000000000000000000000000..89aa7e984cc262c4ac167e74cd9abfa55c5740ee GIT binary patch literal 8137 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.files.i b/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.files.i new file mode 100644 index 0000000000000000000000000000000000000000..ba54ab7eb119a6265ca059989e7134aa79fa317a GIT binary patch literal 1542 zcmX|B4LH+l6#s8XC^mD$T$eQRxgkUnF${N^Z?f7LT16orOPAYxEK>3z3?N+!lENiLVE0TJOQA+6W^ct$SY&yfe zZQO@yPo4KxrJ(p4&^bLV%C~Op@rpwnXEkRvYVomTg44{>cUS+RCT#P`TE=@!U6@Hm zeUCy($#9KA@NWvUb8T5$Hd1rn%@jPD(!OwJx~k=PdVQk-EbnOGN+*i)#eLf8b2#^u z)&vY;buxaWZBkN_DjL>$UGw`MJC&tx_v>Pnn=Hy1l>`=F|k1NPnqOv^_ z3^8Z&B5KU-D{phX$Vq9k-wP{{>>%?Ag2na6u-MVNe;x?B_{z3LhY)AF{9|K9-LV*M zlt;(kWA4Qkwb_=@vI5UFZ?95nMM8U7@ZdjYqj`NgCCvAy4o$`4NwWga8@|v%Y4p0GF|!Ks%IW4Bav|)2drqt%T_mgN#mx=h zZd#9ohq9P_o{=L`uUVhId51oqM;o78Uxv`Sr@CDs{zjJUg;$H%$T5dBb zTU7_}mtYg{4XO7Pe8Ro+u# zLn$IJwVFOPa+oUOhC9dgzY1Q=LLzgBdRyYHzpv#FD59ALqb0ce-ZroDMa$!g8h96? zS}CK4p0*X+!2o7_A>{2f%nBkEAOcC)9xGCaoI>u|`jU$wTs1`1#W4p9bVs%I`Kb8YB5m#8WVl zQ74iyZik~IgTfLh)W~>`nAm7EB{o(O%z|E(=3*sjQxZ=`qIMvH<$}9T%|$Qu-PgXj z;K1tj)SuJ&$d*R08}Kc_=E(qsVV9D!>f}!>Zm7HzNNf@ph7?~S7LxomnPtHQW&vrk zu)MUU%!kn9ireaQwx>oPK|$i+0EuP089WLKRt5lP0D#jZC@WD15WybyJ`s9E*&iBO zt{Ql4(&lm`%>7}dWbda)d!Ri8IGg+y78dArY{L*o>qa)warZ5h-L}?VvyoO)>*j00 znCh#imGC*CQTvSHTww_caYz-X35*l0YQdvq3_uIf1pxIM5=Ty=;H#GdJHYFF+F_FH zmQU-b(nY_$ZYss zj+>b~hlX-FsKgn$qe6-ZC#z+Sv#^z@nm_!w14_#=SAxi#dt(n#s ztl{&t)2*NH^@wJ#+xlE`J;+uo-HFzmI)7B@q+FGiQp{?@gv4rU4)S57hB@^8f$< literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.includes.i b/lib/efsw/.hg/store/data/project/qtcreator-osx/efsw.includes.i new file mode 100644 index 0000000000000000000000000000000000000000..9438bf60811b34fc34b8bf970e59e07b52b04aa0 GIT binary patch literal 166 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 CF@d}Q literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/project/qtcreator-win/efsw.files.i b/lib/efsw/.hg/store/data/project/qtcreator-win/efsw.files.i new file mode 100644 index 0000000000000000000000000000000000000000..0a6e021e0239012576c9bacb319dcf5aeeac8110 GIT binary patch literal 1742 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 Oo0gf1GkCjeNdW-nz0{@v literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_debug.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_debug.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..2f1b770ee9a8b543487c971d5efd2ce9adb5e6c5 GIT binary patch literal 943 zcmZQzW?*Ch1I9E42IkWcHiPJYD2O=}9Q<*!X#HWq-otirH7#ewkLNT1^7*{t zX!nAd#(Ybr*IW?4RQvk!b&W%P>o`x&N`1pIQ`gM0+5Onn?}yV@MHuLJsrRJrN?GM$ z%(jf#y7{Tw%}s{?qB>)?CkgpJ(ya9p67r8d5f-#oarSc6JI?+(GwL-sceX7od+@() zLM~$*`}{wKbs|>gM;gACttdk;GyyLYo>+7?a9d>PP|@F>s=L+ z`Flf%vF(HTzh=dplouB~+Wb)@Aepr$RPXXuen){Bb4qhoY?NMk#Anl;b?(B&|J7uz za~9tCn)`R+*OJz6qAimHmlPk}BHt!4cjmP@)lze(8K)jUoOi#e_1(d*t|d>moy_dc zSa62*`1Aa;&#XIlPj0yq`HeMh(&pX`>!Kxh%-VHwuh?$W$7y*bGj6BEUNDT9{Zpd0 z{@x+}bDQKJgMu0qKS1CQjHOp#76XG3hz3PeQE7cPe~@4JIrp^Hf>DkWFS7SkLDhh% ziaE&%31Vpp3D;5+5;i;vIp-7X;puz&jJNN_fPzwPzW(xW-+4cLDdg=cFE0zb5VB&W z7#O&x310=7$+#74ay-yE`XDY48-r+&bN;=M zT{xHf(G^>RZ&MOt+b!fi+|dB5h7w@sOaeOT*5LyO1lG)%G;7+->8mEp5)*jxQhd?E z3De@I%#K*JctXUKxHZd{FJG`SAog_YvQv@Hik9~JuI#&$*x1q%74|Wj*i8{$c=_m6 z%`39)KVO{s5Y51_WxweTkS$CiV7q1mop%Am1>ztO4RW5$!v9|ye^1->aMd~0@1M>H zn}@7=3swy!;Lg)ZNl1uTFlXkp>62zHd+)z%+ZxRQ%;=m z4)yTm=J@o5`(l8{Y5h~aIu`>ybiDMhUA`O)49Rsz1D>r}IAPBG>5H0Uw-#mj6>7D~ z`8YRleGW3Zyrbcr&A|f)bht}ido9qiS?6kW2<)5b#TTzWEZ0}Ra`45j4KtX7xXX;i K8J28Ho&x{_Qk)C` literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_dir_watcher_generic.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_dir_watcher_generic.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..9699025801ee50ee6a1bd16d94348ca326e432c6 GIT binary patch literal 10488 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 bw3ipf5mHWJV|N>wXq%8faRV+yB)I<%P+s*p literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_dir_watcher_generic.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_dir_watcher_generic.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..52e8cc2e205eb4ee1b1193689338dd661ad2df3d GIT binary patch literal 1959 zcmaJ>dpMM76#vX%41-Zd%CyF9&5+CFk`NVBja&vJHCl}^ZcQxTk-3pO&XjA(=&L@kN-O=kAb^7)V_SPWZyI71U473& z_40qn)Uml^lU8&|InZ)B$K1+v@$R;vnflw=_g=_OHkV+gI(DPC5U!lA9w?+Vo%)3D zy_<1S7W1CfSZ*h(U7vAlE)YGlueDpY(~vcK&dz%Ly}=9y$LPFzuT2oYzv_;HZ}nDk zKXTLu_xm*mftiBk65O?a9Pe8xi+J!3S>U z+nX}7Lq!(%E8r8uQ1vF?G$#k2^y3VP@oN|&r+?dqmj(^R!nz^$QOk0%^q~}^*?D1B zQi!U~l^Qjo?(yUgEn4c5zF>TtvdfY8C3c8uWbYm_Ih&qx9AB%?74-Z#;=XV#m~z2Z zaZ2~YE-eSIBQ`G+O|u5RXrL*)E3uJvx)#K~&)R-9iVDo6MeY3@-8`R;?7skS>BIu` znotQqvIh$RuR+@c`T*6!yIL6BM4TTJckg$@|#l^=ExZoE8$xRbFr*aZL4PqcQpe4wbkcRNu%G9T7tAwaf+ zGz7q@3NI&AA3_5aq>+A!E60Q8F%EmL2}I>8fYs`KpxmkPp%KZEu~EGLxz+5fZ{2P)j zOD+L5MjHnk448GxYT>OlF+0+=Li^0nB-B$TZGI1*MwG^!H=#N!4a&N!wup52RUHgI zWquz%kW~1|v$bSk7*m093s|LltBfNJIDW+Pop_%CAn$A8y4zPkQ)7 zYbrDHIJmb);C*O*K1i~@|L-BvIrZu5yEmSAa3e@Uz({e2HEeSd=bxZ`3r(mo*yNe6 z;7Pqk0Y{cQa)m0X^ViN0HfChHw>>snm`tD+vxBp^0<*B!d;6GUwf7t7iSfZRi+%2% zQ(FfZ3rwTZ^;1?U)ckQgZc|B%PII2NRVtl~lsl0JIpYZpM}z+0u&8OQcX2z`drSp6 zK1MwdYMd-HlwUpHmn)2o+I-Mb9r;Q?f9{btYisiKXqk$vs;vtV(Qx!plS$*U^GvF4 zeJAhw=1v+$S{mx=Zz;#b(YrkiU*WMQ9{;>yAEr%bB3;A4ElXa&c>l4-WVBq6vfZv$ zzdu2IHl)jV2sv8JPH-6VG%Z7~phec+&u+W*)=eI0UwI=Yd|%u#=a?9DyCQDEtmIn0 zrJLI|o_FwP#(8U-zNki8)drMAzRK6kpue6Ib~rEdbh8`(6B)9!}7R|TA!GYd@3 z&DP&vq!iDAnF;z$m--v~#Y(oC4Zl{|sGsw57%TBi?(RftesM@5H846{y4xrELUxtY z20*%u`vwZ88VHAU1+CAZg#wuZX($UI+hSuwL*0>qg_QM_#n(W~CgdB~drcsG!L~mP zE^SxGN-EUwL;^h0lA^c?Ny!1J@m{eJ@i9?^9fatJW4x$;Cz|S6I7}&64X8z+sRqqB z4G5WkxW2IRY2chw#PEbw`n{F6gWdwzdsU>Bo;XL=l<&k++7C)lHRV3yN^EytvA9g~ zPU?17)3icsY1fGpxI) zR(>@?sQHz@m^l54QRF4Hdw}}#W{EK_oOjM8sD0h3m82_&dL8jz=D%!yc1&OXGDY3q frcK$N&WT*XyEA5&{PM!PJntkeB@QqCNlE=1-4pN@ literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_directory_snapshot.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_directory_snapshot.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..ecf0b707056f7cf5054e2626d8067419d4b6ae40 GIT binary patch literal 1804 zcmX|Cc{CLK8lJJ0kt`_^WiXcPu6(|aFx|-|$xIl;#TaY0vJEq3vTtAZH8YHTLWCIm zl8PZUG#Fo*iirmE*(H=~-0pqOdEe(b=l7iRzUTSl{Q-CZK)@0B;s5~AoB!1SgM(lA zGZ3AV$S*3+r@jZ#GY~V{j%vU6%X35#gi-sCLGSfNqw;=&s`z;-IRs266|N}sDKYS$ z&6kC*_L~nDBwZJjC%!hH>Al~jpo(ZxujY)nF+^B1nBJbwa#zdT{30F(PIQ;Oe@j23 zsAigZ(Phcb)2p_l=ep~+%0Lf6ic^3ar{3n}6v?lccL29dsKS|Ud}kuU^Ng!IC5Lqb zQocJEnbqKsaefJ+$+qJlSYj&g(~l>2R~@J^4}A>23ci=VUfXJ0CcOjgLG^^rcXia( z1iu#DS8Ew#-57r`t(UTO#~bRV^Cb`nk=lXhP5_CDCg3@ETkC>PjoO#78pj@YkIKsNJ(X9M zUUqsJ>a)a>l4k3t_2;A4nmlT5)(qn(5C&V)qM`pPgsK~`$tdg(_^fx8|*1>$wL1;S{_GhemK zjAiEB-`Gtm->SP3Hz+Q)wjmyoy`|E(ZWYo@s1h2LbLzPFa^kWC^{T710z@LG@^)Ag zn2wT+h#b~$@>VTygwn;WojW&AuQ)IPznSu^9v}8e;9o2_-Iy{4%g$XdCS;U`O9^1G zAtJ|QMvKDJ+=qu+$cV1)l0`!k8hLT)FMrv{AnY;bz(5aepA%^Yu-^*5+tw`NBG|5X zDolum(p8@o0Pm(Y>S&!z|Lzg=8vR3zfXJ=m7(U%uRZG_DELE&{xrFhjDCP}-$HR4d^K{4tTto^a&z!Y$ zgturhYVBo#^~ekp62-whz_qb8$u8RIZ5rAAoYV&dZ=;3)NFHb-yoY-z1E*4ybB z3g)q6D#DLTi3*-SuPX*guswrwR+4H+%yfv=Ox@95(N+TVq=%>9pM)1r?E`!0&ial+ zTZSct`QvMe2)44E2_9o)|12%)X=<92&@qwZ59P(HX z7bEZ?4_0gz+f_Nr$R>W>#N%7`sB^Am971|iBL@kvI=I&Mr|<>z4{xyix0`_?uav1n zyicZfp-c29NehqTIU^VNR`CzwJ7(x%6AXz^>v)u~>t@LaBu^a{{LXFMGp6<} z|0U}|`)>T4<&?I#sAJMUa+l?_9b`TZ0e9H2pP# zH7lIi#2Psg%ZM~Jf11#zL0^6`yiq51nO%krIYGw0F~l~gcCNPuQEfbx>B4H|+C~sb zqXFHsD^}jUFkyw(L7hNj2E?=hi-S+0WWWma*gFJ2TNhd=tsrus?422MPMk_IBnMj{ zDihv&=1kQoX6Z_H9fyg%3r&m`UY-rduXtf}%iiD>A7cHgiEkUSCVUy2#O#jmLHkUL zXmrs>iWRyl{O``GK4Tz!u3wrP27mHVBwmLhmL4kZ$6&~1Zir0%OC+7iTNG4GDQ&G; z-n8snZv2t^SBoH^-Q0dW@9R@~+t)`LWoH%URV`#WvIv<4`NfZ(`_=+j6-xOmNjvO( zpZ^JaXZ;B1vzbGu@Z&m1a821@hHo#*q;( zZ215~bmcMbF#eUJk+O$dHXSOS!y$?cqwE(0>5)F-#2r literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_directory_snapshot.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_directory_snapshot.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..df7649d270624f1c313d6524f178ab79cf373335 GIT binary patch literal 499 zcmZQzW?*Ch14d~E2BsJYo5A8g6g>TYSvRiH{p`L<-wQ?I{}VG9Ywe+Gz*NPY)=6ix z4jTxxoWB;VBhgfy`QA^n#Y)j~i(%n{FCrqDS9MlQ+A!sxz@_x{Z%mFJwb;v1_I&o$ z4MAR~JVFfShWgJ=+Boap`su5mzbXt0`~0-ZSl@e^+gzSFrwA{%7kgcHxIVp~&$TL$ zCAvPW&3galg$hg8m7lw7nD#@v>Nu-Y^Pxt=g*(4r_`HGH`%c|z&nG&bX-f(dr}$2a z-=KM1_GRPl;D^U`w%yn9{2=k~gX9l|&v)8qo#8&QnI(Mf(&>uQui|Aso0=@|b!q$e zF@NpV2Kgt=@>~~mMD{#*#{S}s!gGMgH%-C9(KhPhYZ$?BjF?WlzIzyerd>P6LGxC{TeQf`NgVAIxH4umsVd z(EalGotb&(fgWc4AIqE+OWg`423>`!0aF!ok`ogCoMkx1Gkd3n<>^nx!6HJzL3fOb zgG@!byo1)P>GJL}`g}>0OUTe#eXPB^(u(fYhJ$9uYQZp9l14Bi#)OyIsP_F&zVh~8;IKOL^M8)tAUpG*@H zGS1bmcb~<^A-UzgbKXW7P2rcn@8;yrxudu?_IJ5~y;)w;1v}p@ADH~IH~s8>^9m%GfnkN>%!@^8YFEukxJ zDrtXrpO-KG`EFXZMtz#=&O2`^=A|A_4Rnx7Kk;a{p~p$D;=mL80^9d{y0I0nzPsa7 z9aq9p$!2k($mMUi6nZ%t3s(i2t^23H_QS#=UiGyPxjOgH;W_E=G3og-(bi@5EPZU! zA@TZ!af>C6YzA3**CNOM(pqqh#3BqS!umlN!0;$z%yLW0ym0V>B z-{HqcRp&|wyY+$OV4z}7azaAPVTOZ~PHC>poLRY&OK)ao<~-GvuAQnsU8T74W?HVC zSDE?KZst+dy3U;|xn|9osmir2A++knq${uHt#jM9CN**KP02N%PX`4H=rI*foHMz*fWJ$G@%R&^oou16l*R3mRIT1 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_info.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_info.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..83e124c92c9bbbc2e8cefb09528c1db522cfaab4 GIT binary patch literal 5542 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_system.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_system.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..22298c56e7ea8d7d49a04e4f59f9e419229ec2e3 GIT binary patch literal 1508 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_f_s_events.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_f_s_events.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..ec061099d32c8f5530b2b4f6fcd7e33bf358b432 GIT binary patch literal 4404 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 DV~Ca5 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_f_s_events.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_f_s_events.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..2ea364260a13972cf0cf68736109fb166b8c3986 GIT binary patch literal 2145 zcmX|B3pf*O8y<6rD3+`&&0%zKnud|X2$@5%Wg^O$!)$~vx_liSVh%a=J7f(N%Hfkt z^DUMQ%XbS2RYS^c$*_DQGLOd|g#{HCFkvK{ zhaOT6V&6e!Mu9ZqRp2s5JYMeW&k?}3JXsKM zb&|En3ch2hRp6r8VA0&%dPw?yl5)7pen=JR%V!<#~WgOp_-({ zKu>!id|u2j8J$Tb+UVX0D_@CsPuHDmxa8J|EdV&|+5mq)_OTTj4fn?Hk$i7XM&z<% z=*H^FG4{x()e7%3@D#090!z~C02n4mg|wk9*r)`LeR4qsk<%TiJoyEXfkt;}_GBderJ4`5X&*l)JINPO>4-hjkPsXHr)gK> zCv+JaMlTrRs=CBwCGLM*6(!lc)P!hD)*zhVkpw9^2@XlnIlk6N4^E zPbb>|ruKj|u5b`_BI;UQO|kK>>V2fmD|2rey?Dg8_<2z*w|D-~==ocLr=%MSPZON^ z7gp-5AktZm!7+qD)^t}EEUs$fP-D`Yk5sHvv|Fw;=iLd~8F6?C+}itMqy5*s2MP(i zj_E<$jk!dZxg4E;?&+QhQ2(ce#ZrB-os%7@?Fu32bN zn^LNhO3x`b;JGdKcXrHx`|g$+#|Jt3{h^VjGsKuw_@*u7+MJwF7Hv&^=Ei+UIahoSx$$?t!>^j;9(?Q4Srv(Li?^>tu|Q z;}dq_zOoBIBh}S<){+j7)*bMlosw~u3vW}c0wNT8FdpNLqf2F)R}?QKS|%XV?2Qv} z$6gYgWJV-!cWM_q7uI>avV1rHSaGSGH$P2x8JLhL;xBC0y|NzO`}~F@2*pqWKKPP` z?)_ksfRp4`qyve$)G~-KT9RZ(y&aG)VKb}Y_Vv&;)N0LC+Wm;tKJayx19{uCU1$5} z2IYg=+)cIQ!$j|-w|E1sHutWUfZWhwL)neb$BChYLa$lUGfbSys$$)ABYGi2^=V(b z;lYk}CbWrp$-TG(>?r!u`{f&{J@Zdxm)u`FUmlgRjPXygF(xgLUC1I^)9Xs@Pgn;T z*palgSiJY*-*5|cGw$ZL#GS=apm2@|hmRnJ0RY+T9R>iH3sE?QjDzRuHkrJNMsG!B zmn`q)z414qera|fik6zGFDsNWqGX3fSZ* zD96t$+%yshZJC+k_?=F4^L7O_#yn~;3%U~?BtLK&X86UiQBU6kP>FX%{p8F~l^-{w zw+4A((pQs85hrLJM+)3a!-c(xEA4bB0|3aZ2$*nE+X+!-Ca5Z=jVhwbM%A#A`9Wudp>0@IJc2}NAaoFh zw#|wj#?0cQhWg;1h;DnQRc-q>k=;Fx_Bu;Fj@^=#l*@F-V#N%`sk;F_8U#n-ZNw{uRYY1~NtS>Je~-Nog>5`z zMf2mDPeyQ0%1;m~&ej#KPb~}fen%87d(fQJ3RjR^1P{mz9J>)MllDz+SKhz@vpc66 zBlfSE$TJF>-TsqPOZhA^3W=DNQZt3t64^_TJMur*tDK|z!R#?4dks8m`zMAzu0H#u zY|S+AK8|uF@Uf!;$zLfIqg$KV^UWYbzxMm)c~)5-s*+$m~Pp{V4xwef5 z!~j#u(BW|xf|FlZTR*h{b)BV|!uP=tK_)d#x4`xe)pw6+{Z%HRdzG>8MH>a^!|m#` zwUDap)?A#M*42GB2k9%nmZUp(iF)u7Zld%aGTZUmWuG;uTYf6aR)+g^Z*Sey%7hVF zw-LWB$Y`PX EzmEvA=>Px# literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_generic.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_generic.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..259391e52b494740a8585b41a1f01cd0b90d038c GIT binary patch literal 6966 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 E55->YSO5S3 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_generic.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_generic.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..88cc8c12cfaba33eb63cd3c940c588f3425b4ef3 GIT binary patch literal 2994 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_inotify.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_inotify.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..73371ca18611ff43c381c92e13f9c6952a40017f GIT binary patch literal 12878 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 W&(gQwyh-(BV1?|C$h_Wkj{FbR&+IP% literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_inotify.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_inotify.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..94f35ac3e0e4b265b964cdb82b5610f697080a23 GIT binary patch literal 2195 zcmYjQ2{@E{7k}+bWN5@FHDw*l9m|L@xRzuY#u!c9;$vd6T-Q2-lx0vfLy{;(i=9wp zsd#D>jXhbi)Rmbsipo|}#`VoRpYMCV^E~JL&i{GO`~UyW?>Pq$14IC!iBpo+-GtMi6(h1SJCuD6Lotj+8F-p zKSvKLlB)JMi?(0gbJ+0qDY%hE2EpiwSmj-IP>{>l+e1VQ`sha{Ke%?+rggsWxN`BS ze`aqd+-T(Lg$_SadHZAuR@aQK4}|f}3pvUP=im)?Y9H`7)Wgo6RB!7-vJa{*80~9f z(yBW@Mq1#qr*$XFs#xXHl1~eQ)nUovP&Fh3Idkl|WA~ZguR%Bs1I>-~^V1d@WAo1& z+GEg(cC%GOKF8EvQT?lFN6OmK$Lg0SMtAWNvKKezFP{vdC&?95P|3%rrN(Q2N$oD= zAS_!*6<+ft3&>F-*!YLk8zEWU(E)Y%V^GYEdkY)`@S5~pZj2XZ7SzCR~)hR z@Qgtp|BHL~eX+3aP}hHMB67#1vo=nDH5q}x&OeA<-FZw^eLYQHCcEceu#^jB)p-ewcO)F?$#U?ESyiZeegPNQZLIV z&tYS%tZUgI`Q4GWr?;%J_X=L@YZ||Gc}QQn>1}taG{U9p59FERVIuSCfh!`~7=(EJ_&PAWLx0=p!b@Pn_j0Z2;hkdWG>pbdr~1GjiLh+seEQpMhDxxb8pJUcUtQ5A3H`%X^@tG7dZ zQGh=n<_C}U7mh<> zD`dvdy&W(nC`=_`yUI<0y%V z1(;t7=MImLdjSaCfZKq+vq4Y)OHZdh6mhAiU%!svXaL@g?d{ig9Q?g!)wY}SmpGUE{-MW>Pe z%J<7ENFcHNBA&Q1&&#!$`=k>n6)Rr;IYc#-lOKB30m!99erecgp zPV?W$tZ}y@-&FtXYuCP?^nHG2AG`1MBK)^n(BU0ghg?p_>`dSqL$ZIE;j{3mb#DI0E8qyMtW0EdNGzF3v5*Dtl5iE?7$&$*u&IE!z_maGX`~a$ z_x~8A@C`2Z0j5`G5!e^%J;Lhk08X`k`wJFp{UV)io0B*4|FemDs%cV3v=?!9wZ+|m zH|Uz)J8V00ok^!Vt7N{RTgaPZzJLF&%wL5PnT!=CltIL~FjpALtSL)hXs-#*80ynO z)XJBrPVfQJJ{28$NyoiMYy{u_ zXYoaD{YE>V8Oj|YEBN+yDkjlvQle82O75;7!Z7SZ5fj9KkKYxQ#op|(wkipCAC*z8 zOWZm{?)P}aI}vSUg?}|tq*Bz7qz^AVjI(kOTz)r1pSEfd_&Jvc~VY`DX9Cu+20dwzt8Qi6|3O zt0Ao34nl=*bO0~p9{Cg%QGOO8WF4v>{iIZLE@<_@tbg`QRwLB>TPm4$n9M=fS53Us zYPUfrx53yx)CvwMrSF0qCZrfQ!Fy>?298);%fK;=SBI5{Wt9X1rwFK21ZqeB8?_jm A{Qv*} literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_kqueue.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_kqueue.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..92f5bad4ca1d30d836bd3de9b1f6820ddb71f1ab GIT binary patch literal 13806 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_kqueue.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_kqueue.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..1d7e50c6c6f2dca9acc71054c2b5cdfc2549151e GIT binary patch literal 3649 zcmY*b2|QHo_rKOLW8cSCgt3h+M3F6e4Gl(QN!EmtB}+podr~Asmb}IiVOZKfX z_9gtR6K|zoBBaRw-g))@|Nry(obx@;ea=1SJkN8Ub1%RE&;c}}uK@t2<$rVlI6NZM zChx~p)HY)pS$^>&#ZN4mC{_O3210z!GwUyYGb&sMIs5!FHd%JDi`oZ-eE#v$ARk5k zpK*`F>B^E`yyHm2{%4`}RjNKI37eX1a`*O^mOE>2ACl|Z*aTMg-0o@%4L*3qsaf#g z!%9Z?;EA(@c(yHQskN(lRu-@t|udffA5 ztGl@0|5UE-TxWN873@*dkVQc;PDI($It(AIJ+<3Jecxr&sM_QSKcpiY0fEHb7G~SUV7IONj&Qy&t~kZM0wO6F+lm0;H!Q3tv0O5v)g{= zWq3jTmadePhaiXCEb$(jR=bV#RQ-@%Zage(HUG;lDri$l(j=h`7 zs)+k6tnpnV$~fwFu8tmnh~}vK8lgNIYUn%XV%XKop*gcxdV8&6yzKUa&HuJD~6}OS>P;U^JE;?w|Kr4tTMe9mfkx0fcJIsyI+SgLl&EHP|-rA4w58T@QXAJ z0N5dfYF>0$tOfnc^RRaGLn_vC99!pc-|NWcHxNOk17tx-Z(nzx;Hw_uI)R~q%0Z$2 z9)U_;x(LXQew-#b0RXNBYS10yfDj7NSJG8-TCkIJfW} zVmmV-!dPv>bne*Nx*5gpjDlD1k8sQL%br@m`-o5c&e|K&QPvs=zfZyXMJP+Lj5+dG z$J2+dYdObZbf3rB%}K+(B#hcgl7_R)y%()9Hg?a}BddEtQ)C}S1<9-37e%QycN}ZB z5_UJpGl~ut3~IWQ(wA`wvuMS9)e~m3oasfJ@Gv2g5^E-6Jb)bS%^l06uCq#ZLXbemgY<^u7QC0r#y^%Q9cadC?a6%&bjKi-VGUqC^ z55wkiYpc@wYws+`-W$%wQ%+TCYm|Rqu5M9i`K&O1)^x$W70J~(FPR|X)-WSYs8~n6 z37IEpV-f?d`}SGi?61(vs$Fj%;Ea@j_0MDDA1J}*b7hTiw`F(;rtc&ZHzQ0%t zbww`wV@mp7#w}d&^;f#Z(-O{Sovh4t<3SlkZ)EeylGn#k>CEDkzvQcYVN<<>@@?u< zlZ4>XcXgC%C&zrZf?@^4My{It@h~4T?~|I(4;lf_&|CtcP9<$z4dOs zpKS3duAAM~`^W#Jn%{%g$wXT+odp0O{J2l z9k+*C;}ZVZudjK|gS+eBKCX&rU-m$0_2k&vi0!{Mu3l_nky~$&@?g)+pWqOS@B>7& zIq)@%*Hi2t-t(ZvF?MRMKDO2VA%4O*^!&Fkag3V!(reS{ozCJP<<1!9`xx zp1QlrkUwYCKEJfEK9as2L$f{-_#Af^m*?F;yXin?X#eRVIU?c|(YyQokEMsw{X#_J z`Pd?25iv}Ni7CWU-$q#oX*VI%7O^eLz>qB#GZ=a-N(k8qm~V1NLjGWmG_P!6BE_J_ z1TsH_P$D5uVdoSEoa4<98`V{g;gfw16D>6B{}s)ky7zks`{zSY4ZfZQK4S)107A%D z$=~H!|M^2YwBfIWHIDru#{<=_bHCq%5Ly(#U?Co2NxAUW41>MsAI!?}1QPCIGohSWkdOrQ!S#-T z2m@IdLTJ4L*|OXzrTE4G+=t*2u{BoF9)vwO_b<^7QPCZ6XNH?o3itO#V;y_b(#Xx< zHo8)%kH=5kP*Tdf%gU%Gd&_{|L!h8!blBR2GNhnXvq}&Aox%s56~JOgbB71F7;1Jb zAWJ|9#do2;nH;kg+(o0$ck3{AF6p{eP13B71T8+%)y2gdET+XJwCsQ~2CIa@)-1cZ zxO|Rwi9;TxMRxmtd9h<-sr${#JYaq$QBhqfY(qNnK{d=qmk13~-2CCWEU5ga!(hR;rG;_w`2^v1sX#!QQTBQV->Lzmijza!&b5; zXwyLj+;H70{q>o*ZEaE<<6dq3#Hy;Q#XpOa9jw!w3oX+etQ^v8%Yn(&5BZk4_9=u# zM7lf?Z8EV!5Bxk3?}S3ab!dTO!99KgYS6z68bT;n6oSu7-ZZ{fwT;QTEF$Yd{V3L* zW_={^ImVAwIp`(0jEjfev|=)?6dZWn-(Ry>WU>=_#`3tfP4#T55!s=6^&o?@dSHWT zC*I-4nT1UBPzE*Ep67~4BeA#4-!=Acw;mOAyMbK9>(6b>BWBGwB81Q) zuI;INCD#{al}_lp1k literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_win32.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_win32.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..1859f40bd246c933ed1566bbe78092513e72ff74 GIT binary patch literal 19590 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 PH|VviCy)FO;AQm8OTa7G literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_file_watcher_win32.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_file_watcher_win32.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..e35ba39002b78b427d7b24ddd070ad55bd27ebf2 GIT binary patch literal 3212 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_log.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_log.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..13e4c54c916b4f932837debde0735efd2e727833 GIT binary patch literal 865 zcmZQzW?*E1fV&I~jD=9P*ncQEWqT=q=YJ#C!}2?_)8!_L=QM5*g{lEl6>~!SH|8BS z;BiTRsm)PdI6>*|)Gg7*qBlP=Hn~_c#hg^gOfmTLexk?`Pcg@eYik(u}QX8--*xR3t}e9FhB{<1Kqb{AcU(do$!x zuNr5VS6%B0Q0rQM%=PuJ-LqvDipD(swoiV-i_f{ACseIytl@p6cVXH@pAffGk!}`k zjQ*Z|nO*l*m9$s-Lz*qH_^RhA@>X4G&yT)-lQp2+^6@w zIiV_d^^@$@E1O?1N#sdEI<$j44i#n76XGKhz5nv-w@L?4~`$Lm|k=}q^0a$ z(VdDo9;g~HRWTm2_Lo!>u-?=A89)+-OKQrgbf-6l|j!e2DqU|^T$RnZaix&M+ zVvS~1oiN2IFiXiLNYU7Tq0L4WOXaN*j?Rvrj?s$h_Oc#YnOc#>j0_xGC2T=PGa7>} z*uucTqz~c(u^Na5x#~XeJJay3A%T4g54^W8xLL~lwCx;NHI%5BQ+vUi>yUu}+k?WH zafcMOk4kUZab;@62KA1&F5cP8o-|gl_&>V1r*+1IWl4qxH~$#RpJ6y4oFK;VK-Fcf z%)@POGtbwZK4`L2!20Q*V^Q07xXm;&c@wx?L|mh=)pq_P{X$LdiT5r}dexP4L^ea= zY38i%yYoe&o5P>JHr}cEbGmM`erf1uho9S{@9NcNTU|N%{J})iU01#z?+xE^yy}Se znbr)C)fax-yft3-IA!8q#^omA(?L#Wd=B&d#owz%tXHQU8jY|M`@@J+1 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_mutex.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_mutex.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..a53e19cc28c91133cb47787af653b034bff38ad0 GIT binary patch literal 231 zcmZQzW?*E1faMGfjG9n3!+$7vXsOB`?^Ip)m*>zKUn#{0IhxTm@!sl3TUARbY!_fWQ@7mvqltvD2^c9I30`mFIOOv+eu7_djR)rA!rC=OOa- zQNYwMbK-kD5B$&T>G7U;|LTvFQzsf(WVN+?<_LV#Fk>iF=XuL1(e^;|_j@Z%2VYaU zyFJZ02PZf(zg@9^&iz)o&dXJ&^`-YcPnUaO(w=iuyWht9Vx^IPUbAW9<_wSe2VVb= P+wT;Os$lMSO3VfTE>2sH)M_2!RWGQ9}l^B-I}A~w`}#> zx}A~!Wxpe*If@vizBF(1h+O!3PJzp%_({y)O*H06Ge_i|u-4<4&6a;xz1e|X z%3-eA+;YdxEj<<3zUXl7nt$%swx!OrUTM63#m}vGCoY@MC}EtoulRx7o5Ua&vv8q# J>t(a&0sz#wck=)M literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_string.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_string.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..7265a066e6535d1765c52e05ee1c070f808292cb GIT binary patch literal 3740 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 HbgKRz^?c}l literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_string.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_string.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..84a3fc907d5fc24f91a23ad6c0840549e62d9186 GIT binary patch literal 5885 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 N$l|TDo4Yvn{{ZQQ0v`YX literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_system.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_system.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..e48c7ff81b4ef3f757b684ee749d4b0f50d82405 GIT binary patch literal 482 zcmZQzW?*E1fCeD74$5Zu4+T|QXO(tDe8@hvX0Fol^>y=%9+fZPBqbPD4rj<@Xu9 z{RRi$eOqbuJ$>x~$+QN^L`FAl>uX@QG=NEe1_nkJFpGgf4Mc;y5V)p&y3O*Ge;iAN z?;Sd{BkSDMI)11cFjX-pIUyn9EW^RXqpF%=VMkS6XI8%CIym*H>dKvAVJ}yzGP?de zx$@{y#!gj9saY{sW9GQ7R9)&?$;D{dshauI)xmX#NObYlqC!T751R7dz-FEYlfgje z)B{y$X)Ut!G+520vF~(}f#G+*yj?Y5)ldTLoRk!XfoE)hM&J1jKHH-jaleK{W literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_system.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_system.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..0f1740abb8aaabe0a52621734b61614bfe6d63e8 GIT binary patch literal 599 zcmZQzW?*E1fEhq)3zW_99|{Uo{FVOy;<_O#an0>H-xZ<4vtK^J)PU%UIjLtiavd@d zXn45uy9hh$Mb~oeJW=t50*-T3eD%I6>}AsnUGnAb+Rd-O^Vgqrv|(N2|LmJVdGT8P z{^H9HI~BP9T29f?>znt%!SVj?Yg)PUHDwu(d|PtT>QMYa&I7KiyPhqcSv6yUN3!(I zw+l5)ZlB?cXRf~DG3D9|wu?QBHOigj9xL4Csy^z=TFlCN=Jf0%#SQw4N-SrC-3am# z1A_?=-vP527}P*C$ZO2E_F3k9Ho6irhmAq2BPgpuXp1CN4UAd}WPq>+7bjE;3Xho7QST&RYhGqXozrzj!E_ZL)Ph1(W;*P>B6A_KrDM}BS z&pkJdd|6X|>o)UY_K)TsHA2%ZCU%Pizuhx)?y6NqrrDv_b8kO-(4o|(FvDO|@thNE z_m?k=s9RSxW39f^tfP-Blw3Hc1vwqRcS3y8#mh5)?0vO<=ES)(E1u*xi5+{sQQ1+# zV1x3PDQgO@C~zLz`N7jRY3Kb#H{&&CyPnYg);?+G6^-Z`mUo7;GJo%?yJK?pZ?$*m jDMPl4lWN1O?AJ$8M5J%_gbvWtMr_D|;?KU^#rZZr-1;w7nD5IHoi7e7gJE+J4W+miLtn zax8E6eyzV|beJ=!%WvsX|F-LF@d1JTw_hJ$b}c#3q&260vDKwk&EhSxHZdG$PSqW< v*~f0b<@;Rkgu~8L6s>brdHyP%|NKXP%gZU+QtsMQc}@e6NTsyqKG)xM9xDS+Dco>u@)9%`!8c_2P}W z@%UGI67VtqIr3^KX`@rwE8<^C`nAj_30*IIa9B&&yBarc{b&||Tw;fG@x<{vdG1QyK}>TEg9S8Gu-zr^}`B9qQ-5yR=PiWX$v zj-0&Y^1%ZulW$ykclb(U%GYN0(kbZ^S2nqR*j;2CrhB_*;eD|y(;hDuVLzHBQ&OR= zWvIK{T`lDH(g|KJ2U6dznX8lCzGB+s^P3|)VoyaHHHVuzSVv|~)6i*H&+fbRSlqX! zZEY2gXIzfSz3bELxVoEfr(tsJrH9Kxm?9M&PrSaWylmAXZB~nEqT7F8+Y@tL_TcrW zvGYDTv?wt&w#VGp)-G00)LzLK8)}+iwY#TAKlIxskCqT;;o?n)1QQ&sPk1^$5k0x< zo%DyB{(6dMCP_@YR}-dsdiOIg>jUm{Zh85v5sH|)GHjXOARV)J3b(fvJ()L%| zGDz6V^r7t@=`fqbm8wY-f22;)EK)Q-;A6GK@od(`V+N0Xx9;S%UbszR^5GK``Vv1L ze_m30;~?kX#lf$xzszMh=6{vH${;I__LSyhuJJsebQ!kYop6_t;)3(77v7lUrb9d><{1ZAp5wU?lSeS z=e?&FZQGTd&+z3~+}>qPju)gVJh`Kk-yic6K4mty*rUG2Nhc-Xw`A*wkJtZ}7^z;B zUb^qZrlp?MsWV$$_t(rn`^GMFy$si+_Y0Cu6Q@ix&pUR|jZ^=FMc(l|KXw0o!Ax8{yZQPUDU@Usr6#5na{&Nw#kZjV literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_utf.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_utf.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..031be9ddc3e2a10bc84d9fbad35eac6a18f2c50b GIT binary patch literal 3319 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_utf.inl.i b/lib/efsw/.hg/store/data/src/efsw/_utf.inl.i new file mode 100644 index 0000000000000000000000000000000000000000..1310571336101580b6a9e3310035e864ad5c2a75 GIT binary patch literal 3136 zcmV-G48QXL0{{U40000001IUR07^9g0000000030|NsC0|NsB~$MaGxy#M`Xroawe zg7^jLuLa@&00000000000001Zob6kCPuofs{~IK}!>lTC6B6>IEFuXjN=X-~w;&$n zO5G}QoC)#Pv9q3W1AE)=zGogDkL__1z|d|l76Rk(oY$QBoik^~^*TDoV;o@5#suwe ztk>&kLg{S3UZ2nBwa{~He}rp(a8qB@b`}m@$F859pT0Xk{QaVS^zriQvR^;)y{|Z+ za9gt<*L|XQpJ9LI;@Z5;I|mM#I3uf0?7*2(QU}6c9Xzkwyf<-tkM(`{wXwdjPVsc+ zS`?!$y_;drnqqX~9c-+hc<73byL$)w`)@H*rvy)i_{Q<7@B+f#sEV!}kG5Nz$Pei( zq|yHQd>j*B;@xlkWQ}`MRql+Px|x1=!KDiQM3A_KQW_L^?pC?oSz--=e7C~e7<)K zb5G7>e>^6bl27KjciWIxRo=H7d(r)IE4ptV?M3(f!-l$NH|#zZLg9qK8$>4<*%K?U zY>ETXs6)b=I|{hoiy=ZNFt9B`yG;JQgVGiUtnz26qBBM%{sdK0WV#H{${7^}umO`s zCw@rg4z(w!l%Pvx1JvAK?BOf`J?15c^Gkye4ed4ir=VF?1YIX^)>@hFw7~D^bs4+Kj z6JQz!GBQKk_ner18d3=A@LNUoV~dk z-$(rSv49TodyoGq}febiiph8-2LS=-aor0jBuv+r37kj5arseAwj= z-@vQoEHv;T{c5?+$TXgeXVP-ITW$#xS1Nf!yU39~rg-(kva;Dys64!~p4kOLg` z(L8V{)DXjprEKWf zUeK|Z80A#QoleSP$G4POl3Oj$R>FIE>!+R1hFG98SrQ5ud<#l#m;xp|l6riT7T<)w zZ~6dq(p3)@V7VaNDwc3d5pEVsxTy#?%!H95tRaVP>(437PK@l~Xv9W!$_A8;u9$W4 zD;hFwAv+9UsmNJ?D4fUR$624~TN;N-C2s)l*Q0gs9?eyId^g7#(RD$fNiQBh;9Htm zI>wPih98FAGv84dD7nd%r|iquoa)W;G9d^Z?e7!kzjzP_y(2&L7Kx+xaj|zpCtC71 zpExd#GRT~aF$&~d?O1NzO)C{aIVX~<#(d?fXhB@>2mbWXBaUIcu19y_{9Iqxw=EZM zBJnpi#wz-z#}8Czg0x$zZop-UQmksk#FXX8j6~6@%BFITrB?98rIxyOjFpYpQbn7C zGc;wKKhzBG0eQXViiQAaaxGxZY>!ClL2F&i|tpa;V%7E z<{2bvdXo2KGp~~cp=I!yv7GW%VM4B6#t*AWb&?Z$v2(t1#@+~z(Q*Icdhp?NaDDRj z_~@U9=MS^~(z#njb7p?Pa^ouIC$TbDW3iQ2vF3NO+n-)N`j8 z<-4f$dKdj8k-;)!9mL~WhQw?6GXAlUM18p1du%{UD;gnb@c;^U&D|%AzeP>g=5Aau zdA7jJ&C_oEoaQl3gohg1gs|R>B!0hyF$oLzp1&Z#YB3}~1 z97V#&r$U;3EKLqWX{Jk9Jw97AwA>#Fr62i|z*I+HF#X6#wPC%_ZX% zB#Kw|Nhy+L#%s*O@znZ)VH8C~hoPR`84!{WQ6YtC9cLF;reR_mC%s-kY~1n^ph>+; zy-v(Eg`5M_b65#mrZ12_V)XA2ywAh%7~I*OVEYSW!9m0ExX+7G;@L@ZN-wW1rzYSE zK7dMe0#i@qLhJ?;9DK#2auxyd>(A_3T!YpeBrBHbl4m>Epoe+|@Cgh4%vFUZ zv4C^Ob%n=r`wH)5;42LqVX!8kCpWPaMCJr@lfffP9&qSoS0(c4`%_`n;dZ}&^ho7h1$i?}^>y2E;mxANHO!XJ9I4V2*3MI#j%O6XfM&!olU^VkBR93+%k zo2kwS(#bS$1$2fPcj}>Q#~b-`Qbjkm{TpGE!5dk@2)WKMu!1{Ox`8_zf;5`IJha@Y zPpIne`7kYKGe4kc><4OY6B>@kHFU^!vY8wJP?g9HRO|BZah(?QF4$?|T3k zAraqA0ESzkOQqNx9Gn}^53uUZPf>epi<}Sv6EiCSGf^DWBFjQFK*z^}v-gLW{nPW` zQLm@}3&G(7+XgdV^)0rMA`OIUwHn&0=e!EnztmWlKy=5$qtamT?)}M|qqDQYfPdd1 zpQEVZk3XQH90>sI7!RgsW)uKXCk8C+bxADo?@U+Nr7>?wOV_;`GN zadP?rxN7WJBO62D;`x+~zz7VBs6S($Y&aD7>4({)co%N~B|k}<4yix4OPi{_iZ-QN zHuZ&=^m@}qyXqRx=~u~ZKke(1F(5Q$lCpoKyTDwuC!oIN5)pT_?N#l2<+Zi^bRpuT zO(mPn#IDr;U{iALiAFHnfIsM(UPcF{IDG-OLYuX<40RrYRwB*c%+M7%z}i~ER9A9R z394-GSRRwWmaW@H8c}SG5gI^%UTM5I-P#=T7fH{Z4dH|?J$(JChBNy9-j8X_D zHDev?K_XY4W7k#Fjzb7RE*{h9BMfp!K%$N!JMriEE8Ec&fJCe@21o*Y38&0}7G<*m zXj~m#Y`54PiO>OPDykS&=Nm20WE60P6wT|3}GC0%+cU}5kQdR{`$gF+AYw!FB* zPCd+R>Q9G>*rVfBgvQ!Q*fKv7v*3t?BBilXhdLf|$|8fPD)0OCB3(o}rBk6%FXj=g ze>Kw;68ZG86rs+ug211bmiSiA+I`W`Yq9cPm5f{r=P`6KhA%8&{C@}AK8p>!KXAz$ zoa0jYVPGfJ89S68r&|z#%UKRPksc#Ic|=jr$%)X>r<|;o?T<@xBn+o=#aEpB@q<6} z;bw_fc9K1Z0k*y*kFUl5$WWNimme+EzCGwg=N$R*LcK+uJ7izF$IlPc(Zl73e;=-- z;l%9{{9eL-rSr8p=1o|6K_Tyd)T{vX000003uOQR00016002ro000000001L00000 z|NsC0-IpiYVhzG0MS000000000000000c${Nkur6U>uzt$Gz)-3H z1j?Cd3a)O!;qd`Jjv;RTLB0yMwx|N};hug9YHAADfxeak(1h^Jyp;U%Vg)@tJq0a& a97=&8hL?+h!SOu()>68 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_watcher.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_watcher.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..87265adfdcef1721002fe273c97e0b705bf92909 GIT binary patch literal 250 zcmZQzW?*E1fL#m>jIL0&<9{e9Tr)M8E5ZCIXPi;_tkbgj&)xm9p=!WX#hlzeU+yLc z5!dVc;tN;ywuQV_jPexl=vIij{o_=lXKI>`)1UX5nW|fMzi%!+AM!LPTr>G-dUd>v zu)49?=QTRlT`G%Gqtzx|lnoUATCVu(0lUDHT;+PnmM5;KHk7nh{+R4(e*Bcxx!ddS zD)#L@IxjVK&9060ep{Y4WM%zx_{epeLyI>tR;#7d?Wy<@XUC4-OMj}Qy$qV)C3ge| iX3SW~+nmaMB;rf=krO`-AG+~d{MWX82Y(*cjQs#7k!(T$ literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_watcher.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_watcher.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..1ea9ff9c9227d5475e368fa89a887341de70e73c GIT binary patch literal 340 zcmZQzW?*Ch14a=B2FBMAHiP4TC{PieJS*ou>-^VRMfFSAB^Jyriar5V1EwnG_$^F1pUU?(bWYr5Rf+*!RA;;`0LU zsZSyfCjFe4yLtKf=~t5`?^*Wxt(Nc1Y!1&od^5c_iO9O|IPUenS?PMk_Uu{h-U;gk z4QAFa&if>Eu+6|gtU}I4tgGkHX3Ykj{L`{p8m{Y1D;TBQHPe`jXRQ+mX**N6?87s& zr1bd5c|y#E@+GGa2W;$V^5N*)p!-vaP#eyWpasY z-g|D1)qC*$ixy9N@rCP067wH&`l|KWddkdva^`s3$2BQ8?KO`VKf748x^&I0Gg;wM d_gS~w=09_Hf0J;gx1)Pf@X>z^i&|#R2LP>zn)v_# literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_watcher_f_s_events.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_watcher_f_s_events.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..e9b301e2d9d4a31b8cdbc8b6f19800f3883437a9 GIT binary patch literal 8306 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 fl6^spK07X=9yytuX91sEoA`}S# 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_watcher_generic.cpp.i b/lib/efsw/.hg/store/data/src/efsw/_watcher_generic.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..2d610225cb1d3754a981a1fc5fcf8b7bde4db9ee GIT binary patch literal 1425 zcmZQzW?*Ch14c0h1|~-cn?dY96g-n%dp+Ab`FD!RA2-&JGU;<(XA_`mz*NPY+zEl% z%?2W^^Uto|5g<{v1`23vAOK^`5&XC$Y;`=Wcq_|J4Dn9vMELdB#`rcF0G8 zNrD`wMHLTLC`TOjUajtx$R5tlb8yC0?*w=iV}T&t3laFMarP zuEF9;(_z)+ufN7uZL!a3Tj)Rcguc=A!%IOy0}4+d*aZyLgJ2c|gCd9q1#HO0Ln@lu zcjrzi-@I0zV|DqND#+UG}fDzqUx@>cfL)9-lSmKOo6u;mshi`}pL}V8_?d6DuoLUf`dxdqT)7$A9($E*dHWrk^Pf|@6tw~qcXLH?s(Kugn-%hkLD*Bt%+i)=i?e6cJ=R~! z-S2#*5B{6;T=L(%V!f~LQgTFdh0bkNT)8eH;`p^Hqv4%sqVU9$tj&JW1y&6uz)mayI`a$=3p^@0sl(;3<9Y5vzz6QH9|JEuVLEk&^^v(lWciLY zO>3RvvUW1{%!aw1=i<`E0h1<1u30=`Qsk6bF_Yp$RxV~pnIa~dK5eO1MikJAg2&`% zfox*h4Ym&$ZOk%277GwNgJ_Tw-&=i@UEy}gH*#ZQNVmVbZosWsL15KT0_;SuG=}81 z1)Khy5o!H!WYUwKD@xz5?76b&Op5mEB7ys=n?0Nt?oc^;YSoS<8pisuia-I!$*X5| z3u`c6TbSJ*z%gyhvsF(YF)>J0tcU@0lJ$UQYLwJ0-LL%}c9$45t@ zBqOs}Mx?jYzL?q8!`xFqz}EXC}DePGpag7F&AW$%DodAQ4v6E(sr0LwTG$N&HU literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_watcher_generic.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_watcher_generic.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..bd77ef041ce5d6e436a7caeb427ce805b0c1ea2a GIT binary patch literal 783 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 I6#^Om0-=VQ$N&HU literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_watcher_kqueue.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_watcher_kqueue.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..331c4a6438d2d273fc51f4c407b7d72ec4e45914 GIT binary patch literal 4350 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 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/_watcher_win32.hpp.i b/lib/efsw/.hg/store/data/src/efsw/_watcher_win32.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..0a5d756497065c55c7865183b3b798d8d37db257 GIT binary patch literal 1701 zcmX|B3pkT|82=h`SYc$*qFg&Hmt5*8myyb4v6!`7b|S3Y65Dd-lCY@AwH<7IG_ula zIy$7WNJh=QB9%_XQyeGc(nTk9zHfPYpXYsl@BjP%p67kv|M&a<0R>4z}ksR{1qwdVelLEqa9`2Nsy=HynG>1%2{JOQ=@Mj$%xcm`r#~ zzF+!~V(q5WE);eKwxMq}nn!3)Hu^5#ZE^vtB01XqI~k>2+=@0*VF+q^DpVZ!qR=+J z?cIR0!*AXhX-wu>m6Trz_Fhs60o@!TOkf9f#CvwJ*mNFdG2BlpIJdfIBP)UFpnf!t zG0*cKG?P^XvU{H7hb$zs;;mDBqaN%j`Y<57B0CxJirbfQZ9MDx^U+=d%GH98_{-?= zfUL?%`t9kqLbrHXA925(qkZcB17@5}k@UP@RBDwJJW4C0^Y~k9jPK_WTBUcBmYZq( zVcg9(i*s}H))RaWf5KV*dSOO~a)hS?1|tPBn=VuOb@C!CG+p zH{#LJspDDYdWzFJV?i8n9dh%KG-|M3ElE|fIe+N%jd^hQ*=u|1uT4x3cRQIz-BPbl z!Z4~dWAz2pky_%do&ZGNRHD)F*Qa%3KD|SB%Y%AW<0CpnWm{;LWsa?QN8i*xM83UG z9yRa5c;d*}niue_)|_3eS;x+bXFB!jUzacEM?{`5}Plm?5LiAMJZ2Y*Nv&Y(QwyA9b459?j3V# zQq2EW>QfkJ_wt|Qx31fTq^X|#!0(Z)q~#~4CHK^(*3YC7cfC-B^%wXsrJj@J>pwSOT#@gCApinRi5iI9I z#S~|t43;|yM!3N85i9k!az^5Y+}7iE;tm-n++<$PUI{EPEF>hB283k^Kyc)oiERC~ zy(8Sj4mT_hMWKQq*lMy@ATz6ZP|KGHzRx!F5Iuesa4QL?2DgA1 zmN!xW07yQRAs`Qh5$>I6?>O6H{OsWKo$h=7Wn)M4>Yjgt_I{eYcaQM2kbrmHlDFVv z4jFlIpl+0YvY{I!_ettf?w-#;I9MtvZT3_?@{ri;X>LjJ_zcC_p8YbfE-&wRi+w#? zMucOd=BD1AGOydCqi?00p?-384YKo|*O-@r&5d+KyNMZv(r&Vsn>c~ew{DSA`7F^k z?f$^xAaplBy~hK&MkCr1sI$lS!i_2Xcs!0n^PGm4kVnD@&toyYbLk6*;t``e+$hmB z{oIh(5CQG|H2FOKvU~U9IIGr_UQA!GEYQG|`xk+Qfm&1&nMc(u=N^rz61<^uc>YDG z;zu(oacb&nDkReyy3Cy5Z7H)74)}U>_VxJ!bA+61+b+@xE$aOxHdSkJZlBE)+}}0~ z0x8E%BnFT{hLdnzg%|Sb{Q#h}3(6EBXTb=!J2RE!P~u*_5Y{?Tur)~HZ2G!HRnA@s zEKu*fHL-20j++zH?CQd^K;uxpCmB;q4t32CtajA{7k;1HQmglzsOtV!NjHs+u63Gl zax$R2cD<3BiFSVfX?E%3nq)AyV#fDF9Q#|-nYl$}vkIp}uZe#~=~tB-VW;g;tGAqK zOxd+t#4}1?Ym;wuepDl-I4xwcy5zP&g5E8{vHjStwx&~4rnF62(J_V^|8cIcIoqQS z`p2^KUsY9pq7*fiUDg$=;8JAW#BaKSD?5yxJp~CT4m=$kn`549Z+@{3N4zwA-ML;s z2!Y2^6v~HlfX>4l%8-!5zYz(a$51$zzF6tQ%oqgt*d&@%bkcCGoc%K(G9l&4pruvl l@#8W2B-#-=jS(Tgv8F5c){jX)5yq6?UYvfM{G*uz>VHrt$kPA- literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/base.hpp.i b/lib/efsw/.hg/store/data/src/efsw/base.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..429846773d8153d9b4dbb027c1639482e3267162 GIT binary patch literal 3118 zcmYjT2|Sc*7k>v?2HE#w7~7rfTS8$h*N`#Hs4y6NGZ;%*CRtOFeaV=)LfmXg>Qa(K zjjcwMB}$Ugf{-NnsQbQiyM6cke*fox-g(aZob#UN%y}Mw8-M{Ef!zlH9@l?#0Qm7! zVCm+aF9h>)cpvkd3+-IX9W;w0{A&Yod|3{D*=1f&a(n8#)YC;lRr`B+`SeQlW76K! zq#|lnh5W1;+2G;5UYoS<%U54W2YHHjwk+)XT7E1cA|%tc*8*lxb1XIhpQarnS*V1V z5MNb$!P=!mD~vGzhVnYs(RRe=N8noYHTLz;?77*TcayWHPx1QYWqJ3uN_;t$KtFS^ ze^vzDub1nRBn`2EiNWZsIQ_JTkx6Ai=jTD$Z65*4w+?BneK{e4@ zS&Up9QV(0gwqn2Xf5dJN@3yR-7W=+zW2=(3`TKiw12w~^*4+Eccp6IE+;828svWVu zG1X1%k8d4Rc9OBX?s?Zwkn!f=rGV^~=mjT*iFC8PK;H0;jiXhKY0qUZ+TY5x6d>lY z3GC|XwYF@#H0^T5680iuh5y*DUik-m*KV{s)F~>AE^F~s+#A`)->MxbgnHj%?!LV> zcL9EjcDR=p>4LwMsr~wkBdb=`pKj2AW#_b%ld|tc7PhdSFMFZIdy1IrN%a}!sn*2g$34_k85>r~16`gr4zr46h>1sU=&rQc= zKr~u*nq&QQ;CwpOpG5Kjx2E|NexISXu9~rP_n5Y+#k9HJsPX9eEIdO(vzS4LiwUnp z2}OMtS+$$%N!a{$Hoo1C%f0rkWNmcR{KCSX^uR#rJ%FocQUMx6iNXZ?w4<@XZn1u3 z3b`Q{9p&$cy@U?VL^~!?qI@#Zv?N!Pf*aizN|^LQMsH77*DQCpkVJ|PPLI&s>dwC| zva%wyGgG&Jh`k4+ZD0sP{ciG%%^EOF7n~4}8C39F+MCa2?c~i>+ zikjj|R|WQ_NQ9*XfmL`aJU)kLU`&bgsd{9rbsTLoOWXdYhr*g-}!{5%lQ+q=Q3E96@_2%hd zP53qSBoB1y9BIpO#OlF*v{#<>qkT<#z|6K zu!IEnX~$=aN6yBas2sdbp9m72_q=7&oaixWad4x(c`L2XVc25yZMJ**Nllub*7J3Z z=7{EJE~wr~>FDTc`}&87T-$uHq?B#0d&<*CZ?Id4R=5i{tWDKa)T~(&jKT%YPR)7GyDs@lG1T`7w4195zRy+}mM8&15Y`0i9T6)eBep z(kz_&CiSAD{xI4~XO0G+S?8+=z5WF%r5*P<1*HX6AOm^?p#d>efjGo4f5NigFwHt# z!d|PQwctJ#>|_5GzA6CV>jHm42nZkpgM!J_AcUPg{;;nL{$KWWu*NvKa~i^qWzM@O z(AP~+;{^dVBwomuo?^qFhGqudr{o6awj`bKI((Z@FZqwal)+vD0#H0oiwpvtA@D9Z z2MnIzOQs$-F%l5KKxEGG#488A2r~pd^??c>2n&cIPt~#W#}Bewo({#19Wjc3NE(;W zN&@G833xGZbH<*sl1!@q$c5F%6xC3PV;A(T%?SQ}`LK^vbf71uzcNFxh&n|RE?Tlk zo$d;a7gtg-!7wVjXs%a@1TnQRJsEwr{CnuD*)FFMX9Mqiw@D|(xorbEW(Gu$ zu%hn8OUb%;C}dDJQ;8JBT6OC2XyYhYWzb;LO( zFCgQOaPIbHI7Fz7$jI5fB*=4 zh@l`o^xWZzL$o8kh1MCbnjhait2zqx<6rVmkb_{5nW?GD1x4VQ9RXA9qPFJ5kYtXV^=Df`EZrOSHc{t%p z853Xj0Q~S?9+tG#Ls=kicsF!S0QluOe!&dFPkPwFG&jAW_<_QT1;EkIr9&KTF5KfO8^;IJJ`Zq{Jnul{XHds|vEJtUo@ab80 z!|0Y#TSnRerbCN$V@;a63~)L`<~6huzc**S0ss&M|FM7|h!TjQ5GDq6RV9RCI$BQb z3{^pmzaGCU0$nA32`5+OtgbE#2DqU}4Vl``&dxNiB-iK$G%eW2F^P5!jq!IqLCHjW zP+X&elgiQlZb=>uXz-Ax_>ui{(U?xODZww2B8DqSD@aY<;h?C#tHgs?*xyrM#;6fh zTKW(Y#-p;0mJE{=La~K};#1u&(SED1yN+~U zNGn-`J%&++vDagVux)~Q2=e?85$w#7!ht@i@_tS@TKO@; z0AJ$BnNvPP7`ZegPUMHHWA*KlG6vcmLZ67z?NLTJUL;zjLZKMOpdSm=8`xJPt2?od z<>R&0x01)<7i*v%uKL3<9G#q;9D`zpBc<6_%9rj5C_Am}^!IzkfDjtS(!DT@(<4n9 zd=ySd17IwHMhqg&h7Dp1EFSZM@^eAN@%=|iw2*$5M8t|a^U&w?ANaWR6DJE$2!h7J z!z`MkL!CSsLmo3Gs>t_{ij%}Sa~v9m`e@r8BhNStFC~K7#}SGJ2|tPeL*5lEBh!0Q~-8TZ310CU0u66VHGvBVAIaI<01kFD~r zB01w^jqk{Yp*3Wss}-chsIW38BBdk(;!wze$MCF3X*lRVT=z!GySlDn>7CD6nhTlH z0K?Fv9-=ViMSkrR%WOE9*f+y|8tg`<(e?Q+QBoS9L97;tQT|x;uRH$3?p~{CCt!uf zuA6QhwHaVs!??suZqgMZ&#-}IDeS7A-Z=5k%<0oR%6FVNl)1w*Ou2}pUt969#-E3( z_S&^Ve4v8eR1#X(BLmPJ$W`w>l{0hTy)VH++WLv%_RjaJZO-5?P9E-)jJ<_b!ruKey% zo#=;jMmgMRWV&Vd0Q?e~Q(BWP30yc?rnor?$-7E%Vf6d9_0<|o#;Pv$u1afCZXo@v z_e#Fl)9U}L0wulG16oqf^n86M^}dFrRj+0Am`iM^5t~0(W2^{PhgEs`^N{w*MTfSH zSun@8U9B9T^uA~hMs|9~p&VMlG|fFBGyBNHyxB4=QpumS=2{$=xr>S+8h zzLFWZ?2fGu&HC9sNJeQV?tC9^O>-x#UEM+53!h4;H#+rFnvG7Qj8dc1ESLxDwAnuU zzsyVTDLykx?AIIT=cNQds9nYYWI8)2ENCD!1vs~Fdtb)(xOa;_eab%A-OFB6dRSIp zeaho!^Z_;6W_6!ZyYcHlyR~bZAFickJmGM6_-@@N)zMcOIn0@>;q@4fY%?U8i z|APbVw>!|u9N22E0EbjKuNq8ig=d}D&ZITuy!Og*lp*THNhI0AbuJ7fUG(F}_IYWa zHqQ4A@7$a?KP#OR(CynzDw>^Inf-S8f`J|@wcp;gV8pz1O4eR6CHGCz+>~tWv|bv0 z*e<2^oApka{br-K%RW?cp)l6R<@38$zCY@%(*03y74rfNo?&~H7iOzjo|@La;>l9e zYAFJO$c_&~KSb~ExQK(m59JRjh{c>nM7^|n_Z}qmP!JJZHXXQ~GO3#K?A4EM|0kci z)ynsZ5fVUhl)N=dS~f3Ry{Pk@|yiG=v|WqCs0df literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/platformimpl.hpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/platformimpl.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..b19711dbf0b366fcd71579852ac36049024868bb GIT binary patch literal 292 zcmZQzW?*E1fF}$LOr=mZ!+$7vy7QX%nJV+_`KhK|+2{VrxN9F(fvEw}6?1wg9PBz| zAkcRHnVF3CY=SoqjxcqIgbxt)bY_Iu|bWWr04g-0xW&Vr$*I{QlOXOD_IeJfA}%#;$(5 zcA3s+ZJk9oPh8tnw#Yblm9=;Ompc+`D(_`ky8LSvH*fDx*!5>C-|Yk&<<4YPH_yeJ z50+WKsyfO4`fACqxgizj<@j=MZayemU9o7P>-vR;a~l)StJ;J|IIXqdVOnvHv64GF cgwOIvKml)L#oq}(G>&?@tpCo>xchn)07^%KuK)l5 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/posix/_file_system_impl.cpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/posix/_file_system_impl.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..0f652de40259013b38f8aa8cee028d5b5e73c125 GIT binary patch literal 2518 zcmYjR2|Sc*7k|x!#yS|XjQfo(3?^J#SxTfVeIdnV$U0~vGcux>v6Q7^h>Wq7b&~x~ zO~{tYmQbX~G9pV^sw>y1?|moV{l4@2o%27>^PKlQ|MNTVa{xHN2k?Y15ddJ5zkC4r zxh?x8$RDy;5A=;kCuT1u|NN5Ip$z|T41{Dxg3}rMjsr+8V^jK!@HwX8H{vNwP?6)g zU=)A4c_i_IH<1R_3MV{^5yiED?+sYG{ z56Z+ykp}1Cwj>t6e9UB_hve3rB3B^ZI$}r-uW!C0Szjc!@EVz66GcVoJ!v&aEgZxv zp|4sXJd2b+$Hv&GkfZba_NgX|L@3<7A!-p;i6IxNJd(}VTW)V~^+IQw7#dmq_IA*D zguAHcvGMiM%OfK#bbjMPT*?RfGunaIVb;7XmqRkxa zrWwcmc+_R7Xj|))?zQoJugm$u`a$_Q^$OMO+_K>GQ8O{)G0nHl7bjylBVPrPGlDrm zoN}lWQ2#)w0|0n6&jYt0gc@mCdq9;NsMPPuL1_{-Zrx0l*2HYb@PN$Fxlt?Bu8T}e z@mNC{-`Y`ZQZ`(%)AJKN^R|s>L()u@l|;cn*SemlSVTw6#Lo+dYByyfllu+h5iicy zZ6*5$mY`WUcPphTn8V7ESOaVVDz7Db<<(c9>lCBJU+>+CkbASek<=gwIwL9dB;g1n zElMN9cG%3v7#SK{+Ep{7&30>Our5e>A!4JV_+aGUu)m8I-+fk2!xsC9-My82wK-#9 z;?X?fT;K6Ec+afWbBH#~ghyT(thf{OplV?dLKU-A7ZOE_|2){ipRi$G^GLFuikIU> z|Ib_jT}WkAg3tS%4fhYgm=Pn1dx#_-5-!L>2nvL`Ll*D_Z^(m|ph`dp-EhA<3OgGa z1Tdbh+xB-y^oymGlfbiogv{{s_I}gR+N#mr+B&(Am6NfMlbyAk>sAQ(3cAW<7tgx? zQNlOci9tNL!ySu#LK6{9nBg`}OD0UyP+Iq?NQMcp!g%WLT`zSnU|53k8tqAE zmEWMw;DA5YFyqiwuqNJxhe3u*pa;E8B?uvgc7_)MY}6D=8(gxR-j`~P-WSh3&x_tR zJcc_1W4#qV^ft{f1~Xmwb6+(~hh2Wq%W&y$YKU%5rNT^c+O)P?ooW?qWN_gRO-Joi zM>-x)qh;jyKjR1bqZ9|AZ17)00iv-2E_Z->2||cQO%^``JDn|H8iy` zyNM)>rYWyqa62d~Y#9JV!IS_$sL>EYG-d$d5%E6cW0#Ndn(ApMWuM)a6$j7$5i%n$ zYyA9MUD?F+QpL1;H7*r*g0Ki%hUJLuMu`&zgMXB-Bu_JxjK?D0FP`4tkq@>>0C~T%$EJ#K%{c#G0DWJ!!_T%5cmh z-)arN;f0T(H}8GY2MPwu8ouZ_^#993SiNoG`z4j}ua2*&0(Dr)5i3Dqa~!R6->K8f zoNok$zy>N=E`jD z&BZCq;jr`$Zs^Y<&Q||sAAuho-Q#qnYjaDZ#C5__Cwhuw01sv@tq*A@O;?wB%c)Tc z&e7CEcbm0zB159-Kkc;*cLz-iuq=WJ=?THB%U2Y*Nab*1gZ7t zt=|HEz=Li{F|K}Dn%8T6HxMmDKN^$%IkHH6-=~-{KypD^JKgFcD=tTa>EoLUBMg^Q z#>aadlniw*+VcHg;L^c%6QXyOB$j6R9F-}pn5zx@YlD7N^Nf!e(?{L(HljlQF|I#- zv_ig=?wf#OGN0DgzmaZx&z$O(ta);JZwe)0fH{Rfx6~lqd}4?_Cq!pgCB7(mc1i1r z>vcc4zKlmrqShI2yUN501v#(pwE`_#n_B*C!Hl`aoE@V^Nqj8ZP|8HhH05&Ro2t4W ze3H16ntomp`*C7}u9n}0y~awQX8{Q8<^BD~z~{n%mY_ldQ2=@_#r$>RHxvh%!t3p{ zN8O%1QnAOXc+uO2H$2Ggt*tAWd?K>T2X(Cq!w7WhJ&#awQ%nu@zD}y#^3=z9#qQ1u z292JTlg)I*)7*Rsuu>#-ucMQ0UkQVrP0M-O$qyV5Mkhd71+MXO7l3p|K~E6W7ziOc zSg$Inv1_~FTe;7t^G`bdU8d8j$BW)Jzou;`(3bHq^Y@`OXXhc*v?n^Q-F$0$9It3~ zFb>b@bC}LEvzj*F;(FrQnG~%47iWZqU7vlI1LxrFkF)a}`Q_zVnI(CcvrMY4fTvAc z?~bZG3T0Ic4$r{BWoxows{)t~M*YL$as#$?(L+@UYd7Kr!t5;#REdn%8)~NkN=VXP z|0|6{SuijNN4-k6M;Y8_11E=}R{_A7bJ(EKayYpMW^nAb2ziVxw z6mQDTiu_ND&Ky~OBQ-Set7ma@U+b~FsoWc+sKfn`XFKEjCFX~(9G+=- z)l(^=;8C}Y-sTLOch;+e#9W^&-OhF5wF&Qwv#t~7ud%i{aK1O%!11Ee=gb#7zvMDy z6+C(9U&oqkkns0RUUjIpy2XO^tsLoFJPn>dIA2^LICtB#?RCs;$@ITt5qaY`{LUMjyafw24Ns5(KaY<2TUb>n>L1IaUf~GYW$Q(vXuxb84 z)-n(mhy_73$O-aZvi8r9uT||_$MPg$-HsWHGJ=3kMFBs6N`ZPAoZ&8T%gjmj%uCDn zO)OAI1G0-j9JiwU+yJ1hgq_m?HeMd;93~)742YRP&fyh*kTTWnYmmR9g42Raw;x@# zd1(YzjUes-neTyEI5{V=xL5(?mf*_blGI$TYKU)_gVpi?jh_x=F$1w8hz1!iciW<@ z^!F|{mYM#dI=@8z?sG1g3s#LF8iC9SFfQX}Fv}fi)+Hc|1&C`vG{~%F95u(pq7tLm utbfm#G4akL|BjW5!K&c|V*^kh5Hna~L|#y8ZhlFsTQJtZN`b{JC;|a@`XjIa literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/posix/_mutex_impl.cpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/posix/_mutex_impl.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..94fbfd92ddb16ff81d1736597e04e21fd557984b GIT binary patch literal 464 zcmZQzW?*E1fWHh3Ok7Yl!+$8SH%|F&WPdqiN4@^sm!jF~8y|US!PJ20iaE9YcfAff z2(+%hyIg|9gX!p_M5tx{5c;F|#rnv@&B79T zxB1`w+*Klwnvt`1+x`{vzqCK%IVUhx>)!E0?0=IsP5htw`=r9&{L_vnD?Ilx>U3?} z0}cpaumM3ZQs5bb1VG_8S4T-$g8k3QCke4W5`Ua)@@B+t0m;EY#hm1XgcT_X2{TxZ zOxm|pb*1RMovfB&VFk3#c=TdMawJIvjA7?+CYp+tjD&%QO@;&z|%@ b*QRO3aiqMVYsp2?sm~5hWn@U7qLBvx>o~|l literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/posix/_mutex_impl.hpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/posix/_mutex_impl.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..797e6eba1e14cd275a7df5c40367c0800f221579 GIT binary patch literal 378 zcmZQzW?*E1fIAEfjA2kV!+$8?$n7sT8n${_x@I$`Tk3%yUgyoyyUVq34(8yu2yjt zYFDgn^vf!p?XZurIzQ_s*q^{q0RlOsun_|ZfP%;D?~kY1H?)@vScM&D$US1c#ZK}b gNDc|?0kY2lu~2eOVsWv8Z)r(tg=cO-4p%i704~jyRsaA1 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/posix/_system_impl.cpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/posix/_system_impl.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..6091792aa56bafc30e605789c623beaff5a6e90c GIT binary patch literal 2559 zcmX|A2{_d27arSO%e6H~(_alSCd&}U-ePCQQZpt))+YN{nz2UK$dY|2%~-S54P}^Q zm$(RX$0H$>60WU@MArX|+r8)aocEmb`_A*e-*cYx0k{AhfFtA70|2;d|H%P>!(a9R z*Qgr8Y5c1Bk%|}D1UmHNcbnCJd)P6I;)lKxKvorrN{{ZbxN>G(q0gDDIdV$kF}m5~ zP35ZKOV>ENXQCIfO|gd&bWPbzI2!QbHtU-XSHL>Z3SzEhk&PVh|Bp0nd$T4jGWmsB zd|7kdlA6NOt^RS_`OIWTg)APXU*mobVaz4E=2Y|rS@NH&`!2l7l`8gl25*r`4^c$J z4D{&foiw!`MK_-!{%7k<{)Ns;Dreoj)yBb2^2?X!Dnx<-kFNqtv8HQ%g1HW>9+yw> zCaWgnz4Rys>1tMJe`d%XXQ0FZU;E$!>3V{I=Eqo#5)H#M$o^vFdR0)1A|#VHZ%Ulk zroy_ILtqwn*AP_gAEa=P!(y!Z=3hE{zWs8g5I?dhY}e28m~K8JP~@_`xo^@MiLWtV zF2r;qHpkg+=zVt_#bPq4x*FVAnYW32;Gj8bKeNamRnkq&<5>4BjSOnJg~MbqME2re zW4J;W!h@*e$pT;JlC4%qbX4bloE7hNx-NbD+=JNzaQmTi-L6}+9Kvtu4Gxl9Use?7 zX0g5EV*a@#(MZM3Ckq|vW+S==GJ*EvV@k)vB6ACC2G+>gSKlqDfrx?!{M&QU-;wqZ$6doLVzshw3?zJ(Z6=1p4(BDra|75QZd+7iGu5$o@z#cne8I%p|?E@>n_!>)Yhjc^te*|oK%~-QH+EMXWVysZcitBktmcC#h{nd0L&qG`@z$DC zt4?eAPq4e5J9Rt0y428C`#-!dQr3o7^wsH9su48jXBOkb$wuk&&qKYu5k<^|l++w9 zytk27`&lVI;om}^8+K^(b#ukG70KeiT7%TLD^h2ZyA)LKQ2!^8&X#;?j` zR&3S`-4vJJtK#wm)@CQC(QKCoV4cz|9DRlbEv(f5yynvXWd3*cS(57oq?t0iK7iv--_I* zJeHp}_NVGA$%>Ie&Ut+oj=@_ZVP0?atGyB%PSeVF_M|V$yTtJ9%2KVREOmUdHBXj4 zG&y!PS8IV0o~>jzfc-i3sIP^i$ZTQtwC7$6VYo>0X6_LvS&1nTjFW=@|kjv>%8Z$y)>9Rp1hdG)W;P7Ed%|u2hH?v?h8tj^dRhq z!$V*rhbjOdq`^*DuEdV)2j?Sfrj06-pYbe@KIq!(0-q-9Zn4h(voK0crj>QKsz|~a zT+b9h(?}GS^(2?)I^)uDm~zT!9CwgZMSpo??!^hA%h)zlXI4y)rzz4b*G zch6t!R-O6%yqUay#)yJxQ#NV>1WQF4FDe1=F~0432z97h&Y|et_J~jkcOA&mMo z0jUcg=7>zN?-2DW^}9cU&htxxLIBqKxBvUPUo z`&is?QWfvH0dpo=+)%IE8ywoqRLpO0R*pYFIX&>Dc@PFj!QqTCb7^SwLqgG&;QI#X z4;KScr;z3QC~{2?ea{N#!Ec+_r&Z}+cmP@=H^{RG2c#U0&zv=HO;*Oqa%Fa8&)ZoT z^jaQ%3|TcOGtAA)?dO}Qj5zB44+OygfS@g_)aT=K_b@gw#G1h%GN#@HcgPKQ5}xQC z7!*K+5WM}ogCKH*8;<@mO8-=FBI~CMK9~qOtH;l#1I`_h>i@b27pqcdIT!mLomx>% zx#;D0$N^~=o0?*L*J6L?QTKnqX~Vj5G^i%q+)c`RdlK} z4Uec4Vt>=iCo18@f)@_zA~2 zjWnwmzJt3Rb^n4RbzYAcSLrWxcX-^FH$Lj)07Op(g zAq!lbUyuV{o&Wpu(!%00`0KJ{X-SQ%q_3dukTcI~;g}~>Z58&9z&^ZY=~)y5kcx3F)2Y}8kF@75*oCjA&yKzVq*6$ z(_4=TC|f;f)8&Ur_{I^w0Gf*)W#Y7mqa5EfOMFfae;RyZTe6#i24RS58}*3X?*b|7 bIh&~%(#ZGNMA+Xj*B26AiU2hy?9cxLIQVH4 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/posix/_system_impl.hpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/posix/_system_impl.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..e2a55e5e69296fa41cf8687e7884b17d7cc99a86 GIT binary patch literal 588 zcmZQzW?*E1fMW~{jO#Z1AO|GKpPZ9eT&xgWSzMBu%T>(< zR`U={ngET~2eLo`t_Gq(M$cNZW#4+6$K?C09RPETom{n$++kVEghDUV4XSKTg@Exq8*V_txqQ3nRC)D}0<= zA738BIrW5dm%))UGSy3;m}!^X)8xVND+UxJ<&v#xi|DjaZVkcg~FOd_@pRw5ZNbqovce7yiw{r#=2j>zbkt7jR4u)>B!Q zz`f$9l||_mpXE6e&3{Z zpi8E^Id{q5rEBK7{Fue?&#K_&KB*~@5~T}IE-vJn_*rVsthxX(#XX&CUVboMH%XqM zGj6ftYi+Y>K|iL)cUy^{>RoD7n|F9FYu;bIxbOOX$GcBfSy@SVoC^Xx}@rB_+MA>96fq9TMf7X;Ky;zCPcn|2Xfdj|--xM{jw) zrJbYHW+sY;OH|zDbdS6lVmRjCwR}`CB?4{kVv!c%K&WmO)ZDXmoj;py6A2ii3^l$#e zuBFny3Y5M;sS*gXkkY0YNC1>Pe`@p_7H<(%x%sBfcHu!MkvI4E-vr6QK*gNogoKzw z2M+A$Z)|j2rDJdGs;IJ9!_@Go@pgsdr&ie*Zgz2=yn0r5V`CCdKSXgDnO?hfvb5%Lxib-2a&Z;8ea zkc~{o!1h)GUHTu$0_7?N5Djwaakbu)+ExwB2EV2k3D`WDCKeTc6(|P>V3*D~#c(j_ z)Xd70mP<8Pa+$5nJo@yP-b&AYi+DdiLm5%`36ajwf{u zjnz$E7plZ7?$j{ds1mwRh1p~Iktdp(8BxrohPiBy9y`P?nlm$#ONwjfyrX?5RcEHI Qn|_2xG?(`ce(xX1q+fK4KosVYa3cFZ8YON87O(UJU;5~Gd3rM4}b61AM#u! zy?8_8(W3uh;j8a1nlW8^-?Q7bKjYS0_+Ofl)!g5za@DQOz4b$ruZ6v=%Yn?-cV160 zDOkJuja9???yQ}6b6;)bpZt5<;%kcoE}NP4zA&^<6l|OMVW!F^VMPa1tE|sQ892ZL&=3hG%3~dCz-kxM?c&%Rl@Qs7F`dowBoF>^l)Y<9s zyQuSiv)jvO&;Kz!QEzns1qUb)fj}N9D8)bmpwO&u|MJsTY`1`H{)Xk6!s+VuVH@6o hw2F1dB5-euIGK9@4X+;E)WlhYr7;tAaKGz zIS91#)B5HJF!-k8&Gc{<-$ysy<989)l>g;$kd*VxaUfvO2oh1)IyM0%WcpE?^p|_A zbX<=QQB%>xz1LX*6}YiHxR*-sJ_N-~&aK#2f3cuP{@rW=D~GWA-T`gdjs0uP*~lNN znx@nr(2Q!9&)S@4!=?2_V|2ST*klb?!8AcER-TB9#ngGQNpMu9$Y=8K#Htzk zi)bxYpjl~Q&j#BQ-n}wyzXh#B@?&waWCD-akgv|cJo~|U@1}(4 zr@nX|FpnGGlgk~u|MmyD8XJXq)En4U}))tbJscc_9k(naUkX1yN z36I);`(x0m^!&VQYxX;8<>4nzkQAPSvbM+Jte~+2{hA(B_vKK@!{T_R%U<)L0PEW@ zyU7&Hr8t8$LISM5OQ4fd*e^&kq?725PfH@Tlyfapg;5xu3i353WBv>?v6!S}%7^NiA{DpVB7k z4e#>~UC+m*<)h%LL1p$CjroFK|2R1vtjL%0rF%RLWVQ;|Y`_fJI{Ycvecdisk+1V-{7;44B6c2cnNg;aN$C^*FjPJ+%DAVjp9X zTyxQ+Mj?7Va?=emKVlh}zy7IfiGOHkWW#ihT+4WM#||y=x(~=|@X=hZ>DZG)3i|V- zZQJ0)2tQa@f1V#W+u0@}OVWsn$NHwXKAe!0z!x-a*fS0ZZ9FJOg@_|76hnZlF*_+l zQTsiYiQgOi`g>hoY3|H6KLxJ$oKN|rwc^+jW%rFUX*knq4+lAYOL7dC3KukjP*Ht4vGAx|OOes4`k5$r2S@R@!}a7Mpzif*m=) z2n)o7Kw>&N2(a^XrQJ5+u{ANiCG34pQrw1D7S^2Lf2begrw%fmQ8>ye z#23gd=fd9M5q8GQc6knRcKFsU89o}ls_OuF@1)pEJ22jZ zK*R??%{>UGef&L)2?V?kmPqgjhCyLxZA~5Q9Z+y+;6;MBy1QF20S|*i;ZP(JdKx%u z=4R~RfC5a=4rXqr0F;@jgAMAufe@z#Uk4}hbb~ImpD63=x+cg+h!0!&5QXobd&{5nfbl(AkE&UPAuw(`jK zv??vKo)~_FzMx(wBbXpH(rnqNLa4h_3>Un1IP8kyz3c@qkfSw^Bbm2Rz@QUtM>dMc zol0o@E6F;}{x7M<=^JkkmbTjUM=6F?p@Y<7qCb4+rFIc3SL&@xZha!w{W&dEmrAGqi5Z+=ZG(z+Xgf8As8fTg4 z)3?Mt=HFy(&+i1!N&5?2d%-L}{d9YvzT$N&ffmU_T1g*0a)Wh@){~toY#{ek#$i$Z zs(e&vzba4`zZu0-Pbk$M$dza&82VoJ3l37g#V|g0){aB})<+-^8FqCK2(LeJHZ^ksFx(7>L2yU@kBlztX_b(Q04WQx-Q+FP7I>^j_Y^Fq1MZDZLZw0vfGb) zFe1AbQS6L!)(8%Adf`=Aa?S6UXpZ;tB)+`M)>#!0C2-ll0$(4Ss>fdX{43pKPz59u q_P+{tf^*ndH`#pfO!=so;DDk5jjrsGnHowM$}|2FBvwwJ%Z z#w+|uxbu*k_1oU*;{LaDK1UtO`g(iCp{DlVr+vRBU8v%>z}+Ca{3rB9cnS)aUC;oNvS@+1t~^WUa@>b}WV?&EWZ?CpvnbIwyU?JWicIA9zBi z?4*vDuii=hRaXK$&YjoR3)Il_+_*_gPxI6n@9*&`n6O=;b9r6|m(j1%6474$XwsrH zdrC}OnHID(Ei)Bocz8jw6J$K&F0du?P;L75X)LgD=E|4n5n;??G9mskQq?v)Z21J95 zpYpCoYB|^JTD=)xwyY}he{*|=Njp#u2{6tD>H}g1Yc5XC;*!LY%w&b6{QMk+%;KQb s-29SMw_pv0!+$8)VbQH|s7HOJ+`W$h3dfqud`uV-Y3u@Xx8NUb9h6KWH25% U=-_(kMVHs-2d5a8DQTDj04Hywng9R* literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/win/_mutex_impl.hpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/win/_mutex_impl.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..9227d3918c6d7938c42db98a64b446a6b4628336 GIT binary patch literal 409 zcmZQzW?*E1fZq%Zj5DEZhW}8YW_RZ;=Lx$!?koPA#P;Ym`U@G(fvEw}6?01a1HBI$ zh_ue19ACIl|Cf>D{W-#3Zw)S#rLI1+eS)ec_p;20TcHwPx6c-{Uj8DuXy4>H)p-lN zlv6lA7HwYo(pzxc8yuli$Mh=rUEcBO$&G=RRQQag()>-niuWx0SwFMU#A&LytW~PZ-JLh@oi|@I z>70>XVg{S~54N3YzLD};7Kvv}i}@~XoA`dord!G>x95iaky9=?7Jj|>&DZ1k1#6}< z#D3oHeRo!;LUn-qwG)ckQInfo5}nKoLnef>U6n99zW4vl?-jSwtQhN==4`5d0}cjY zpaFp#QqYNk1VEve_RWCvS#jjF%Z6%w2i7hS{eR$bE=Udu`~&I}0P=;Ba}tY-6?{ue NQY$=j3v#%sxd07PqzC{2 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/win/_system_impl.cpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/win/_system_impl.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..a6d0e3f6a488b1f4db07ab5960ac3ed7efd8f077 GIT binary patch literal 1676 zcmYjP2|Sc(82^SLrexe=G2@uXT^ONbiJUdaeTzH5vv!Zr=+)W2F$Z7ojyGrCOk`J?nwj3omBRO> zFVPy@TYNW^S0+{7g~*r*D$WG2MdWxHbYr3fL`M?ng*-bs0%^Fz8&i(3Q!mEDdRA^; zhbwjyG$PN~-jtu}8FYMS~eF~H2Pe5I_L<`8KJ8y{@q?J&|8mbl4s6R%Vz zjB2Q7NCNz>S?ouF5`gy8|Ab(R18GrsG)NwGcdJoE_8K+-MPJ+JU1Q8fe-AJ?_@6L% zMDptC*#;1a6h%}Z6{Vz)U_<8F(O|bX)K?UA7}Q(F$>N_p+-J4h3tArvw>k$EI1gr1mb6sso0YK{4#Fx3z1>Td5m%I&*S%C~(J?~~vMu#f4u+M!Lp0-a|ZrxKQi$_iTVPb3v0jVrUAI|6)r2Iu4q(1^%*&OSiO znv%cmLZ>+)>W*`-X}7QHJ4d8HF2&OB-EMe)GhaOG(mc<+H6x!jbqmvLFj#YV^s6<3 zKi#WmLAY2?>u>sa7BMlA;WdN)`6zbzjUNU7q2hsmnRwNnb* z<2QWvN^E8yjVj;h)H+7csVegsTE)B{Oi@T)OwV389&t)QQU7x1wy<3(<4`80w6;~w zD*SnO-uj{S`Ey-N)4&X*yqdkZ6WYbmUJXe)>hw4zKDgaIPT<(IFx)odD(qbN7H7Mz z0}fFyn%bZ#t&4l-Jbb$AtV;|ZtfcB1+-|dj$8MS!FVTk14w1h8wq5Sy{M*#riR}}2 z=I2gSf7$C<<|G46gQJK&6F+c>Pr!;3bQLH=L$o-ezSMgsf7oY%kXGP7Aq7~3OtR6t zA)G<*@YwVL2=R;6UwVb(rh8`7Sgy*Y6YU7B7@t+SU%9hdd4F%C;1QvE*Nc9M>XtdS zc>LoEEvypL6n(-9t*EW}M4?7eyFtFW*ya|X=$K{=7oM9{F;`Vm?XlH3QptUQ2Y5Ot zX9W>*BH6Uyt+`%+6|_#;P=;?14wEHOUCfm0RGIB5)t!6g|WK5B*9SZNVC|AX7qmb zU&iEVT&o&a^2TnAofj|^Eum0MhZL1O>FQndpl2QQ0UD`d?Th(o-`DUJ_-Il?f?Jk_ zKr+4ovbnWu}H{9XC10dj&kF*r5l@QkP+CY~@;sB6~K#=7C;=p4OF z_Ap;QI4#-OAW9DZ1DD#ClOkFF;e|C%8{d#$5sUZ2HM>CH;`1I#$vb_mrT5{#Pd-#_ zQJ{sf-tXkR(_tE69D<``KNu!F91$1bvIySHGnwlwQmu}x(#2Xvm0ZnGvT@mg#fdSJ zA^G4$wulEo)u+IU8+33L0d7e3>u<&T^QMLQpB5sMGWVx*r=;plu+iTGhZ(rQp5RfE fSB~WEMf64)o7g(wjm}!(%q)#<@K(0=Mu>j_6#|R& literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/win/_system_impl.hpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/win/_system_impl.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..aac620382868ca61d3c7093437fd5d72b38a5b97 GIT binary patch literal 589 zcmZQzW?*E1fa44djGRz5!+$6cZByW|wfvRAw%GbzuG^_k&WexMz|?@~iaDiyzS)Ny zL|m^|?tkRC;Kj10yI1*NI0YKKy}^T_31t4_Sx0P zr^&3l_H?0E|I@nA9PX{wIq|D|gC=}GWBj*W@q3O_Hs|vvPqK?HIrUGMn9jV@`|7*Y z{dLv)1si`@hwOct$#r0tTIVeRKE6GV-Y;nKTlaItN3Mh>v4fwYg?Med-)dHT=807E zRL}pg`JeGThz;}>ZRvDf8Qw%z;tgtzWc@Mo}>fB^sm z(n!G|1`+^;MELBZ#}fD7x_nzxrpjqi&vf1HUlkxZB(Ms|-U-C~$vKI|#R|cd#U-h^ zT-97)C6BH)KAXMNMRsq#|07ToCbCMGhrX(>WvjywfW zzb5U!_3sbk=9{k_N;u5p?Tpnb`*uAsY)WlRf5EhSwUv$WwN8JvyW9B-KQlXPWOZ_} zv3&cKUBJfGYO=zsRjq5M+2!}$XAf6depj@5)LF#WQD1xGPtU!?>0P`tNRP za8$nFu#PFwsj9j9n2pr+_PEv73385?-?H&WE&0E|*S8rPyx=^mwCUuAH zzhgUuITY@!Ipn(|K5FwnV})Ez@kuqA%WBrYujS4>Wd7%I-;PO9b5taKt(!HJ(v#<< ze)tzuTTsihP|00x$3vB?5qs3r*S~VgI;?tk@r5lboGkOw_pWVfIW^<^GoJL8CvHd1 zUNk+a7#q7hd3{^SiOsXLx7(e5v1;b?IQi$RCe?A@ndT-kDVyhl7c54)FG z>o2z{Q!V*8b&|op?aN|bycBj@@}07+n=^we{vaMyja z*CouMXI`!q<=T0jF{=@(2254VNlr*8NN-3Ge0pZjlR1~Bgs{#&^61f(MM8Udto0WB z@KLbiIufNQ>AJF0bKXu?%djwxZEZ{~YZpw7pEo^f$%2&uXIU9)8^nQ@1050uHZun5 z5Kt-?17b#yL&6;MJ!go`oAzdvof5k_N1)1E)@NYVPy+0bh|>oS6v%dLbu#J-5)QU0 z<}O;ZMj(fml_T0wd%unTRu9L?t7mmLHWrErkdPoTrKsChFY7cmAN4dFfF zFqP+%#44|#?jqyQLf%0Ky%=9?RZ{_3!L$i%5zuWcOdu{0D}ZQ_+vZkJ{aUE=c9MgLi%^)y6te8- z$(ggBJ$fbbYTd#GPo~Y7IeFHifJy5o#7vnLF=On5^B&z_myGI>-`c zKCo55Fk}e?ae;U?hz7ZhXR_U#cZ;S8$Gm#*b%U;ntA5;v4`9_$0_?V!gAB)b{vpRw zDMw$MTDYlrdfKd}HYYuo5XZ^g!Wu_j&Y2uP=heg+(tQb|91H1c%l>7%R+^^THu E05vA%Z2$lO literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/platform/win/_thread_impl.hpp.i b/lib/efsw/.hg/store/data/src/efsw/platform/win/_thread_impl.hpp.i new file mode 100644 index 0000000000000000000000000000000000000000..26088ed42629720c1bffb77c16cd37b4faeaaa6c GIT binary patch literal 669 zcmZQzW?*Ch14a`D1|~@en}Oj!6il6Bdhf>k??zg);}vuwa)a8o&v1gN0nrt6N+$$n zA2JYWoj*CgaH0M=cJ|x1=QthgYJJruT*G6yb8e%FuIDbJw*R%6+c#-RvrPIux0+ww zJg9YIgu|vf+f9el<{w#IGCTcv$#Jtvzr_nQoBy9Q337Ykreu@+@YZkPatrJ0UpEEU z`Fz%~TND2+Izne1Bez~Ze{H(_LjA~TN36x(hvi7iP2pkuC!}l=B)XVqt#6$ zCjl7>oSY#UMX8A?p1B1%8VV4$f|f#ld0uLff~GYWNDpHIh-8q5+6A&l42T&)c0FB` zx?tVyUoQ)kTHarqv|Ydd=v)qvVgz7R1uC@w@`aOg5{rwWc7W{Ts)iU}4^}J(G+qnH zVglmXAR27EK=}c!-MclFWB31>bI{C?gZbDouxdELmqI63Q(JOgw*06(YY AzW@LL literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/efsw/sophist.h.i b/lib/efsw/.hg/store/data/src/efsw/sophist.h.i new file mode 100644 index 0000000000000000000000000000000000000000..1721ca267c871befec6b93c2f1d9c60b90989759 GIT binary patch literal 1584 zcmV-02G98b0{{U40000000r;>02Pz~0000000030|NsC0|NsB)Q%`;r7l{-Rw@EAY zi}f(n4yVQd00000000000001ZoV8ecZ{j!*|G!ed!`ve6lBy4A5$Z0tT2YF&Xel6Q zuRYzJA_E4ZCUF!eeVqE?Z|pb^Cx&)U+DJvsJbs?>JTmsl0dN*<93CBS;0PMWXZRb$ zbJtnGl6l1O@qI>#4;Lg1X%xX}quJQsJ2-$JK6`TMa!p|wk|!TlA@krObWrw+v4>9_ z0>(E8OZ+8lqA2)sauS4eNms|5#o>akSh%LgK8+;YEHMLukUcs}Dzw9h%v}o6OF(%C zURW&uMSznU{y09eHq?WN30?>cjqr&_xxkZ{i4^}LUqE;=o?H!PH#YT`!cIw}4x)q^ z%XOm2rKtqV8FOc?s1>*k;dZ;F!8L?xvjffw8i(Nc5%Q%YKtk$&ij-~33Rb{Sn1(2B z!fGCZ5&(xoyLB{oqRibQ49Wyic$mG%2>~U9_8Rp$ZWVCnUkZe$peC5}L(ou)@A%qm z>x(qoCXlmJU8?vlH%Di;TPBcp%U&>_N5qfne(cR@XaOXb> zG@y7FQnouOn^yxAqRh(1r92YJF!3l9>xsn^CL~NrNxeDQ-`n4-IV&Fn54JrR^@g{X zeLF?HvTbCmwBEwb1yb^Yd4c27$nmI6IHw`HgJC^clj2_F#GV_c+h zo{HHjF2nlK+C`@*mo1~o#i?M8x||wuwPfFctH~8`3n?P&HWe9-Z4nt zqdzUB&t3PXH@@yw68K^~9d<{Tk^y;M;e%q8>=L<`(=PkHo=6*|QgPf)`la4IJ0I|JvnGbBk=L*FFnR>(8~CgIT{trQDx|j!=nr=#+c1cs>l;tq*F4Fhh!Q zvWF8xLkZXu4TD96Q)(SMc3q|?z&m%nES>H8uiE#z#DcaVAtPNcm|W!h=r*Y-je338pZ=Itg5I4>hJAz+3?m+2J644X;!Be< z^zYBwN$YuweZ6V-&)!=}RBniGrBS6Z{?bIkY8(!KwtjE7tC$l;WQ@$0qziBF#)&`G z=}7t6DC+K*oWw`q91i77%vQx>IR^{Aeubvh*$EJJ-Nz zbykrlDK+FnHeQR=DK~C4N$qUvTE%J=&G<@njr^N@Hy8;W{3QRD(e5wC_m*YGXtyo~ zH(6hJ`!QjNZ&tafnZ9F6&Ve2t~)1-2XRK6JL@CGRmEC4?-VaynpJ`P0tQYE)o$Boc)-$& z!9kK$sU$}U8q4fH(J0cc?SZ1cvsRN+T?sfl{=E-GP5mVhMXk~b^NVgtcR0D~zPs_5 zEa^_KtAkET)GZ0U#J?&Cc1-aB(iKvoeq0j7E$$?|yI#Mv1*5Ia)fD3E!DQASqK2t8 iq*sH+v@D!8-_k2y7ZygBq$;t1jCVY;H2wpJf^B$oX!`L0 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/src/test/efsw-test.cpp.i b/lib/efsw/.hg/store/data/src/test/efsw-test.cpp.i new file mode 100644 index 0000000000000000000000000000000000000000..de0d71dd7dab43e514c273b692c0218a5660d977 GIT binary patch literal 7882 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 B*sK5m literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/~2ehgignore.i b/lib/efsw/.hg/store/data/~2ehgignore.i new file mode 100644 index 0000000000000000000000000000000000000000..f2a073b60610a12c4d46c96b177ac1e2e28902c8 GIT binary patch literal 328 zcmZQzW?*E10Cgax24yq+hXOg}$$8Nc#V@8VoTOnIZJSxXpf(Ps21J(@SLT%@R#+*d z=j10Ta3y8t>1%Q2CuIT2+{EluAeEDuq^||m0^5#{}70hEJ-iaE&%2?l8m4}LT)`m^TB6QRF{COuhn z<;bKzN_YP};`)1K%cCOO6%BEjg;^8lO`I3$7`RGNeB&$MNkNw;`Svi1{a0}V002Q{ A1ONa4 literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/data/~2ehgtags.i b/lib/efsw/.hg/store/data/~2ehgtags.i new file mode 100644 index 0000000000000000000000000000000000000000..fd4b701326d1ca28d2ef11f813ecb077cb0b4c2c GIT binary patch literal 112 zcmZQzW?*E100SVU4`na;4+R;IWjLlT(sr!rmAfQ#UbS6()u-D~HDIdL!qgM6IwyTssul+Kd;vrl-}$ROm9{`rYA){b;cIXU6thK z>A$npb{mQlQF#sG2T%~0yBH5TC$H}2_CwR# zOE#O`-q}?uXg&T~;3nw8dk|W&ISImfKM>rD)yk)A_YY`4XXBN@_4yCRP^r5U6eR9j z-h@{;s=_SF6qeTroE8R&KVLiOAPm&HAn%0q>z6QYlG$komcJw}ldJ8Ioq~%a?qstQ zGbNC^pxWs0^tFVy9sbn)ge@G4)kb^Fzp8XpX0RY_mZ#`E5dDpJv)bduHQK$(%knpv zM%_eS(%#z)nsgI+N!}*VAa4U`jqmWklh{{tCK4Rmi&L&E%H&m=FNO0q^MpK*2f+XU literal 0 HcmV?d00001 diff --git a/lib/efsw/.hg/store/undo.phaseroots b/lib/efsw/.hg/store/undo.phaseroots new file mode 100644 index 0000000..e69de29 diff --git a/lib/efsw/.hg/undo.bookmarks b/lib/efsw/.hg/undo.bookmarks new file mode 100644 index 0000000..e69de29 diff --git a/lib/efsw/.hg/undo.branch b/lib/efsw/.hg/undo.branch new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/lib/efsw/.hg/undo.branch @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/lib/efsw/.hg/undo.desc b/lib/efsw/.hg/undo.desc new file mode 100644 index 0000000..3bca213 --- /dev/null +++ b/lib/efsw/.hg/undo.desc @@ -0,0 +1,3 @@ +0 +pull +https://bitbucket.org/SpartanJ/efsw diff --git a/lib/efsw/.hg/undo.dirstate b/lib/efsw/.hg/undo.dirstate new file mode 100644 index 0000000000000000000000000000000000000000..6459c295b4dc106194c17ce55c363caded6b8bc8 GIT binary patch literal 40 LcmZQzAPxWk04M+f literal 0 HcmV?d00001 diff --git a/lib/efsw/.hgignore b/lib/efsw/.hgignore new file mode 100644 index 0000000..eeba8b2 --- /dev/null +++ b/lib/efsw/.hgignore @@ -0,0 +1,8 @@ +syntax: glob +bin/* +obj/* +make/* +lib/* +*.DS_Store* +project/qtcreator-osx/efsw.creator.user.2.6pre1 +project/qtcreator-osx/efsw.creator.user.4bdfc43 \ No newline at end of file diff --git a/lib/efsw/.hgtags b/lib/efsw/.hgtags new file mode 100644 index 0000000..8b01356 --- /dev/null +++ b/lib/efsw/.hgtags @@ -0,0 +1 @@ +854e6d23258ed18984c1dcf0396050a66e5b13fb 1.0.0 diff --git a/lib/efsw/CMakeLists.txt b/lib/efsw/CMakeLists.txt new file mode 100644 index 0000000..660f6a8 --- /dev/null +++ b/lib/efsw/CMakeLists.txt @@ -0,0 +1,131 @@ +project (efsw) + +cmake_minimum_required(VERSION 2.8) + +option (VERBOSE "Build efsw with verbose mode.") +option (STATIC_LIB "Build efsw as a static library") +option (BUILD_TEST_APP "Build the test app") + +if (VERBOSE) + add_definitions(-DEFSW_VERBOSE) +endif() + +set(SRCS + src/efsw/Debug.cpp + src/efsw/DirectorySnapshot.cpp + src/efsw/DirectorySnapshotDiff.cpp + src/efsw/DirWatcherGeneric.cpp + src/efsw/FileInfo.cpp + src/efsw/FileSystem.cpp + src/efsw/FileWatcher.cpp + src/efsw/FileWatcherCWrapper.cpp + src/efsw/FileWatcherFSEvents.cpp + src/efsw/FileWatcherGeneric.cpp + src/efsw/FileWatcherImpl.cpp + src/efsw/FileWatcherInotify.cpp + src/efsw/FileWatcherKqueue.cpp + src/efsw/FileWatcherWin32.cpp + src/efsw/Log.cpp + src/efsw/Mutex.cpp + src/efsw/String.cpp + src/efsw/System.cpp + src/efsw/Thread.cpp + src/efsw/Watcher.cpp + src/efsw/WatcherFSEvents.cpp + src/efsw/WatcherGeneric.cpp + src/efsw/WatcherInotify.cpp + src/efsw/WatcherKqueue.cpp + src/efsw/WatcherWin32.cpp) + +include_directories(include src) + +if (WIN32) + list (APPEND SRCS + src/efsw/platform/win/FileSystemImpl.cpp + src/efsw/platform/win/MutexImpl.cpp + src/efsw/platform/win/SystemImpl.cpp + src/efsw/platform/win/ThreadImpl.cpp) +else () + list (APPEND SRCS + src/efsw/platform/posix/FileSystemImpl.cpp + src/efsw/platform/posix/MutexImpl.cpp + src/efsw/platform/posix/SystemImpl.cpp + src/efsw/platform/posix/ThreadImpl.cpp) +endif() + +if (APPLE) + list (REMOVE_ITEM SRCS + "src/efsw/WatcherInotify.cpp" + "src/efsw/WatcherWin32.cpp" + "src/efsw/FileWatcherInotify.cpp" + "src/efsw/FileWatcherWin32.cpp") + + exec_program(uname ARGS -v OUTPUT_VARIABLE OSX_VERSION) + string(REGEX MATCH "[0-9]+" OSX_VERSION ${OSX_VERSION}) + if (NOT OSX_VERSION GREATER 9) + add_definitions(-DEFSW_FSEVENTS_NOT_SUPPORTED) + endif() +elseif (WIN32) + list (REMOVE_ITEM SRCS + "src/efsw/WatcherKqueue.cpp" + "src/efsw/WatcherFSEvents.cpp" + "src/efsw/WatcherInotify.cpp" + "src/efsw/FileWatcherKqueue.cpp" + "src/efsw/FileWatcherInotify.cpp" + "src/efsw/FileWatcherFSEvents.cpp") +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + list (REMOVE_ITEM SRCS + "src/efsw/WatcherKqueue.cpp" + "src/efsw/WatcherFSEvents.cpp" + "src/efsw/WatcherWin32.cpp" + "src/efsw/FileWatcherKqueue.cpp" + "src/efsw/FileWatcherWin32.cpp" + "src/efsw/FileWatcherFSEvents.cpp") + + if (NOT EXISTS "/usr/include/sys/inotify.h" AND NOT EXISTS "/usr/local/include/sys/inotify.h") + add_definitions(-DEFSW_INOTIFY_NOSYS) + endif() +elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + list (REMOVE_ITEM SRCS + "src/efsw/WatcherInotify.cpp" + "src/efsw/WatcherWin32.cpp" + "src/efsw/WatcherFSEvents.cpp" + "src/efsw/FileWatcherInotify.cpp" + "src/efsw/FileWatcherWin32.cpp" + "src/efsw/FileWatcherFSEvents.cpp") +endif() + +if (MSVC) + add_definitions(-D_SCL_SECURE_NO_WARNINGS) +else () + add_definitions(-Wall -Wno-long-long) +endif() + +if (${CMAKE_BUILD_TYPE} MATCHES "Debug") + add_definitions(-DDEBUG) +elseif (${CMAKE_BUILD_TYPE} MATCHES "Release") + add_definitions(-DNDEBUG) +endif() + +if (STATIC_LIB) + add_library(efsw STATIC ${SRCS}) +else() + add_library(efsw SHARED ${SRCS}) +endif() + +if (APPLE) + set(MAC_LIBS "-framework CoreFoundation" "-framework CoreServices") + target_link_libraries(efsw ${MAC_LIBS}) +elseif (NOT (${CMAKE_SYSTEM_NAME} MATCHES "Haiku") AND NOT WIN32) + target_link_libraries(efsw pthread) +endif() + +set(LIB_DESTINATION "${CMAKE_INSTALL_PREFIX}/lib") +install(TARGETS efsw LIBRARY DESTINATION ${LIB_DESTINATION} ARCHIVE DESTINATION ${LIB_DESTINATION} RUNTIME DESTINATION ${LIB_DESTINATION}) +file (GLOB HDRS "include/efsw/*.h" "include/efsw/*.hpp") +install (FILES ${HDRS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/efsw) + +if (BUILD_TEST_APP) + add_executable(efsw-test src/test/efsw-test.cpp) + target_link_libraries(efsw-test efsw) +endif() diff --git a/lib/efsw/LICENSE b/lib/efsw/LICENSE new file mode 100644 index 0000000..ac8ac28 --- /dev/null +++ b/lib/efsw/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 Martín Lucas Golini + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +This software is a fork of the "simplefilewatcher" by James Wynn (james@jameswynn.com) +http://code.google.com/p/simplefilewatcher/ also MIT licensed. \ No newline at end of file diff --git a/lib/efsw/README.md b/lib/efsw/README.md new file mode 100644 index 0000000..f6d084b --- /dev/null +++ b/lib/efsw/README.md @@ -0,0 +1,138 @@ +Entropia File System Watcher +============================ +**efsw** is a C++ cross-platform file system watcher and notifier. + +**efsw** monitors the file system asynchronously for changes to files and directories by watching a list of specified paths, and raises events when a directory or file change. + +**efsw** supports recursive directories watch, tracking the entire sub directory tree. + +**efsw** currently supports the following platforms: + +* Linux via [inotify](http://en.wikipedia.org/wiki/Inotify) + +* Windows via [I/O Completion Ports](http://en.wikipedia.org/wiki/IOCP) + +* Mac OS X via [FSEvents](http://en.wikipedia.org/wiki/FSEvents) or [kqueue](http://en.wikipedia.org/wiki/Kqueue) + +* FreeBSD/BSD via [kqueue](http://en.wikipedia.org/wiki/Kqueue) + +* OS-independent generic watcher +(polling the disk for directory snapshots and comparing them periodically) + +If any of the backend fails to start by any reason, it will fallback to the OS-independent implementation. +This should never happen, except for the Kqueue implementation, see `Platform limitations and clarifications`. + +**Code License** +-------------- +[MIT License](http://www.opensource.org/licenses/mit-license.php) + +**Some example code:** +-------------------- + + :::c++ + // Inherits from the abstract listener class, and implements the the file action handler + class UpdateListener : public efsw::FileWatchListener + { + public: + UpdateListener() {} + + void handleFileAction( efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename = "" ) + { + switch( action ) + { + case efsw::Actions::Add: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Added" << std::endl; + break; + case efsw::Actions::Delete: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Delete" << std::endl; + break; + case efsw::Actions::Modified: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Modified" << std::endl; + break; + case efsw::Actions::Moved: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Moved from (" << oldFilename << ")" << std::endl; + break; + default: + std::cout << "Should never happen!" << std::endl; + } + } + }; + + // Create the file system watcher instance + // efsw::FileWatcher allow a first boolean parameter that indicates if it should start with the generic file watcher instead of the platform specific backend + efsw::FileWatcher * fileWatcher = new efsw::FileWatcher(); + + // Create the instance of your efsw::FileWatcherListener implementation + UpdateListener * listener = new UpdateListener(); + + // Add a folder to watch, and get the efsw::WatchID + // It will watch the /tmp folder recursively ( the third parameter indicates that is recursive ) + // Reporting the files and directories changes to the instance of the listener + efsw::WatchID watchID = fileWatcher->addWatch( "/tmp", listener, true ); + + // Adds another directory to watch. This time as non-recursive. + efsw::WatchID watchID2 = fileWatcher->addWatch( "/usr", listener, false ); + + // Start watching asynchronously the directories + fileWatcher->watch(); + + // Remove the second watcher added + // You can also call removeWatch by passing the watch path ( it must end with an slash or backslash in windows, since that's how internally it's saved ) + fileWatcher->removeWatch( watchID2 ); + +**Dependencies** +-------------- +None :) + +**Compiling** +------------ +To generate project files you will need to [download and install](http://industriousone.com/premake/download) [Premake](http://industriousone.com/what-premake) + +Then you can generate the project for your platform just going to the project directory where the premake4.lua file is located and then execute: + +`premake4 gmake` to generate project Makefiles, then `cd make/*YOURPLATFORM*/`, and finally `make` or `make config=release` ( it will generate the static lib, the shared lib and the test application ). + +or + +`premake4 vs2010` to generate Visual Studio 2010 project. + +or + +`premake4 xcode4` to generate Xcode 4 project. + +There is also a cmake file that i don't oficially support but it works just fine, provided by [Mohammed Nafees](https://bitbucket.org/binaryking). + +**Platform limitations and clarifications** +------------------------------------------- + +Directory paths are expected to be encoded as UTF-8 strings in all platforms. + +handleFileAction returns UTF-8 strings in all platforms. + +Windows and FSEvents Mac OS X implementation can't follow symlinks ( it will ignore followSymlinks() and allowOutOfScopeLinks() ). + +Kqueue implementation is limited by the maximun number of file descriptors allowed per process by the OS, in the case of reaching the file descriptors limit ( in BSD around 18000 and in OS X around 10240 ) it will fallback to the generic file watcher. + +OS X will only use Kqueue if OS X version is below to 10.5, and this implementation needs to be compiled separately from the OS X >= 10.5 implementation. Since there's no way to compile FSEvents backend in OS X below 10.5. + +FSEvents for OS X Lion and beyond in some cases will generate more actions that in reality ocurred, since fine-grained implementation of FSEvents doesn't give the order of the actions retrieved, in some cases i need to guess/aproximate the order of them. + +Generic watcher relies on the inode information to detect file and directories renames/move. Since Windows has no concept of inodes as Unix platforms do, there is no current reliable way of determining file/directory movement on Windows without help from the Windows API ( this is replaced with Add/Delete events ). + +Linux versions below 2.6.13 are not supported, since inotify wasn't implemented yet. I'm not interested in support older kernels, since i don't see the point. If someone needs this open an issue in the issue tracker and i may consider implenent a dnotify backend. + +OS-independent watcher, Kqueue and FSEvents for OS X below 10.5 keep cache of the directories structures, to be able to detect changes in the directories. This means that there's a memory overhead for this backends. + +**Useful information** +-------------------- +The project also comes with a C API wrapper, contributed by [Sepul Sepehr Taghdisian](https://bitbucket.org/sepul). + +There's a string manipulation class not exposed in the efsw header ( efsw::String ) that can be used to make string encoding conversion. + + +**Clarifications** +---------------- + +This software started as a fork of the [simplefilewatcher](http://code.google.com/p/simplefilewatcher/) by James Wynn (james[at]jameswynn.com), [MIT licensed](http://www.opensource.org/licenses/mit-license.html). + +The icon used for the project is part of the [Haiku®'s Icons](http://www.haiku-inc.org/haiku-icons.html), [MIT licensed](http://www.opensource.org/licenses/mit-license.html). diff --git a/lib/efsw/include/efsw/efsw.h b/lib/efsw/include/efsw/efsw.h new file mode 100644 index 0000000..28e63e2 --- /dev/null +++ b/lib/efsw/include/efsw/efsw.h @@ -0,0 +1,151 @@ +/** + @author Sepul Sepehr Taghdisian + + Copyright (c) 2013 Martin Lucas Golini + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + This software is a fork of the "simplefilewatcher" by James Wynn (james@jameswynn.com) + http://code.google.com/p/simplefilewatcher/ also MIT licensed. +*/ +/** This is the C API wrapper of EFSW */ +#ifndef ESFW_H +#define ESFW_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) + #ifdef EFSW_DYNAMIC + // Windows platforms + #ifdef EFSW_EXPORTS + // From DLL side, we must export + #define EFSW_API __declspec(dllexport) + #else + // From client application side, we must import + #define EFSW_API __declspec(dllimport) + #endif + #else + // No specific directive needed for static build + #ifndef EFSW_API + #define EFSW_API + #endif + #endif +#else + #if ( __GNUC__ >= 4 ) && defined( EFSW_EXPORTS ) + #define EFSW_API __attribute__ ((visibility("default"))) + #endif + + // Other platforms don't need to define anything + #ifndef EFSW_API + #define EFSW_API + #endif +#endif + +/// Type for a watch id +typedef long efsw_watchid; + +/// Type for watcher +typedef void* efsw_watcher; + +enum efsw_action +{ + EFSW_ADD = 1, /// Sent when a file is created or renamed + EFSW_DELETE = 2, /// Sent when a file is deleted or renamed + EFSW_MODIFIED = 3, /// Sent when a file is modified + EFSW_MOVED = 4 /// Sent when a file is moved +}; + +enum efsw_error +{ + EFSW_NOTFOUND = -1, + EFSW_REPEATED = -2, + EFSW_OUTOFSCOPE = -3, + EFSW_NOTREADABLE = -4, + EFSW_REMOTE = -5, + EFSW_UNSPECIFIED = -6 +}; + +/// Basic interface for listening for file events. +typedef void (*efsw_pfn_fileaction_callback) ( + efsw_watcher watcher, + efsw_watchid watchid, + const char* dir, + const char* filename, + enum efsw_action action, + const char* old_filename, + void* param +); + +/** + * Creates a new file-watcher + * @param generic_mode Force the use of the Generic file watcher + */ +efsw_watcher EFSW_API efsw_create(int generic_mode); + +/// Release the file-watcher and unwatch any directories +void EFSW_API efsw_release(efsw_watcher watcher); + +/// Retreive last error occured by file-watcher +EFSW_API const char* efsw_getlasterror(); + +/// Add a directory watch. Same as the other addWatch, but doesn't have recursive option. +/// For backwards compatibility. +/// On error returns WatchID with Error type. +efsw_watchid EFSW_API efsw_addwatch(efsw_watcher watcher, const char* directory, + efsw_pfn_fileaction_callback callback_fn, int recursive, void* param); + +/// Remove a directory watch. This is a brute force search O(nlogn). +void EFSW_API efsw_removewatch(efsw_watcher watcher, const char* directory); + +/// Remove a directory watch. This is a map lookup O(logn). +void EFSW_API efsw_removewatch_byid(efsw_watcher watcher, efsw_watchid watchid); + +/// Starts watching ( in other thread ) +void EFSW_API efsw_watch(efsw_watcher watcher); + +/** + * Allow recursive watchers to follow symbolic links to other directories + * followSymlinks is disabled by default + */ +void EFSW_API efsw_follow_symlinks(efsw_watcher watcher, int enable); + +/** @return If can follow symbolic links to directorioes */ +int EFSW_API efsw_follow_symlinks_isenabled(efsw_watcher watcher); + +/** + * When enable this it will allow symlinks to watch recursively out of the pointed directory. + * follorSymlinks must be enabled to this work. + * For example, added symlink to /home/folder, and the symlink points to /, this by default is not allowed, + * it's only allowed to symlink anything from /home/ and deeper. This is to avoid great levels of recursion. + * Enabling this could lead in infinite recursion, and crash the watcher ( it will try not to avoid this ). + * Buy enabling out of scope links, it will allow this behavior. + * allowOutOfScopeLinks are disabled by default. + */ +void EFSW_API efsw_allow_outofscopelinks(efsw_watcher watcher, int allow); + +/// @return Returns if out of scope links are allowed +int EFSW_API efsw_outofscopelinks_isallowed(efsw_watcher watcher); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/efsw/include/efsw/efsw.hpp b/lib/efsw/include/efsw/efsw.hpp new file mode 100644 index 0000000..8757f36 --- /dev/null +++ b/lib/efsw/include/efsw/efsw.hpp @@ -0,0 +1,197 @@ +/** + @author Martín Lucas Golini + + Copyright (c) 2013 Martín Lucas Golini + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + This software is a fork of the "simplefilewatcher" by James Wynn (james@jameswynn.com) + http://code.google.com/p/simplefilewatcher/ also MIT licensed. +*/ + +#ifndef ESFW_HPP +#define ESFW_HPP + +#include +#include + +#if defined(_WIN32) + #ifdef EFSW_DYNAMIC + // Windows platforms + #ifdef EFSW_EXPORTS + // From DLL side, we must export + #define EFSW_API __declspec(dllexport) + #else + // From client application side, we must import + #define EFSW_API __declspec(dllimport) + #endif + #else + // No specific directive needed for static build + #ifndef EFSW_API + #define EFSW_API + #endif + #endif +#else + #if ( __GNUC__ >= 4 ) && defined( EFSW_EXPORTS ) + #define EFSW_API __attribute__ ((visibility("default"))) + #endif + + // Other platforms don't need to define anything + #ifndef EFSW_API + #define EFSW_API + #endif +#endif + +namespace efsw { + +/// Type for a watch id +typedef long WatchID; + +// forward declarations +class FileWatcherImpl; +class FileWatchListener; + +/// Actions to listen for. Rename will send two events, one for +/// the deletion of the old file, and one for the creation of the +/// new file. +namespace Actions { + enum Action + { + /// Sent when a file is created or renamed + Add = 1, + /// Sent when a file is deleted or renamed + Delete = 2, + /// Sent when a file is modified + Modified = 3, + /// Sent when a file is moved + Moved = 4 + }; +} +typedef Actions::Action Action; + +/// Errors log namespace +namespace Errors { + +enum Error +{ + FileNotFound = -1, + FileRepeated = -2, + FileOutOfScope = -3, + FileNotReadable = -4, + FileRemote = -5, /** Directory in remote file system ( create a generic FileWatcher instance to watch this directory ). */ + Unspecified = -6 +}; + +class EFSW_API Log +{ + public: + /// @return The last error logged + static std::string getLastErrorLog(); + + /// Creates an error of the type specified + static Error createLastError( Error err, std::string log ); +}; + +} +typedef Errors::Error Error; + +/// Listens to files and directories and dispatches events +/// to notify the listener of files and directories changes. +/// @class FileWatcher +class EFSW_API FileWatcher +{ + public: + /// Default constructor, will use the default platform file watcher + FileWatcher(); + + /// Constructor that lets you force the use of the Generic File Watcher + FileWatcher( bool useGenericFileWatcher ); + + virtual ~FileWatcher(); + + /// Add a directory watch. Same as the other addWatch, but doesn't have recursive option. + /// For backwards compatibility. + /// On error returns WatchID with Error type. + WatchID addWatch(const std::string& directory, FileWatchListener* watcher); + + /// Add a directory watch + /// On error returns WatchID with Error type. + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive); + + /// Remove a directory watch. This is a brute force search O(nlogn). + void removeWatch(const std::string& directory); + + /// Remove a directory watch. This is a map lookup O(logn). + void removeWatch(WatchID watchid); + + /// Starts watching ( in other thread ) + void watch(); + + /// @return Returns a list of the directories that are being watched + std::list directories(); + + /** Allow recursive watchers to follow symbolic links to other directories + * followSymlinks is disabled by default + */ + void followSymlinks( bool follow ); + + /** @return If can follow symbolic links to directorioes */ + const bool& followSymlinks() const; + + /** When enable this it will allow symlinks to watch recursively out of the pointed directory. + * follorSymlinks must be enabled to this work. + * For example, added symlink to /home/folder, and the symlink points to /, this by default is not allowed, + * it's only allowed to symlink anything from /home/ and deeper. This is to avoid great levels of recursion. + * Enabling this could lead in infinite recursion, and crash the watcher ( it will try not to avoid this ). + * Buy enabling out of scope links, it will allow this behavior. + * allowOutOfScopeLinks are disabled by default. + */ + void allowOutOfScopeLinks( bool allow ); + + /// @return Returns if out of scope links are allowed + const bool& allowOutOfScopeLinks() const; + private: + /// The implementation + FileWatcherImpl * mImpl; + bool mFollowSymlinks; + bool mOutOfScopeLinks; +}; + +/// Basic interface for listening for file events. +/// @class FileWatchListener +class FileWatchListener +{ + public: + FileWatchListener() {} + + virtual ~FileWatchListener() {} + + /// Handles the action file action + /// @param watchid The watch id for the directory + /// @param dir The directory + /// @param filename The filename that was accessed (not full path) + /// @param action Action that was performed + /// @param oldFilename The name of the file or directory moved + virtual void handleFileAction(WatchID watchid, const std::string& dir, const std::string& filename, Action action, std::string oldFilename = "" ) = 0; + +}; + +} + +#endif diff --git a/lib/efsw/premake4.lua b/lib/efsw/premake4.lua new file mode 100644 index 0000000..0cf7d4e --- /dev/null +++ b/lib/efsw/premake4.lua @@ -0,0 +1,220 @@ +newoption { trigger = "verbose", description = "Build efsw with verbose mode." } +newoption { trigger = "strip-symbols", description = "Strip debugging symbols in other file ( only for relwithdbginfo configuration )." } + +efsw_major_version = "1" +efsw_minor_version = "0" +efsw_patch_version = "0" +efsw_version = efsw_major_version .. "." .. efsw_minor_version .. "." .. efsw_patch_version + +function get_include_paths() + local function _insert_include_paths( file ) + local function _trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) + end + + local paths = { } + local lines = file:read('*all') + + for line in string.gmatch(lines, '([^\n]+)') + do + table.insert( paths, _trim( line ) ) + end + + file:close() + + return paths + end + + local include_paths = { } + local file = io.popen( "echo | gcc -Wp,-v -x c++ - -fsyntax-only 2>&1 | grep -v '#' | grep '/'", 'r' ) + + include_paths = _insert_include_paths( file ) + + if next(include_paths) == nil then + file = io.popen( "echo | clang++ -Wp,-v -x c++ - -fsyntax-only 2>&1 | grep -v '#' | grep '/' | grep -v 'nonexistent'", 'r' ) + + include_paths = _insert_include_paths( file ) + + if next(include_paths) == nil then + table.insert( include_paths, "/usr/include" ) + table.insert( include_paths, "/usr/local/include" ) + end + end + + return include_paths +end + +function inotify_header_exists() + local efsw_include_paths = get_include_paths() + + for _,v in pairs( efsw_include_paths ) + do + local cur_path = v .. "/sys/inotify.h" + + if os.isfile( cur_path ) then + return true + end + end + + return false +end + +function string.starts(String,Start) + if ( _ACTION ) then + return string.sub(String,1,string.len(Start))==Start + end + + return false +end + +function is_vs() + return ( string.starts(_ACTION,"vs") ) +end + +function conf_warnings() + if not is_vs() then + buildoptions{ "-Wall -Wno-long-long" } + else + defines { "_SCL_SECURE_NO_WARNINGS" } + end +end + +function conf_links() + if not os.is("windows") and not os.is("haiku") then + links { "pthread" } + end + + if os.is("macosx") then + links { "CoreFoundation.framework", "CoreServices.framework" } + end +end + +function conf_excludes() + if os.is("windows") then + excludes { "src/efsw/WatcherKqueue.cpp", "src/efsw/WatcherFSEvents.cpp", "src/efsw/WatcherInotify.cpp", "src/efsw/FileWatcherKqueue.cpp", "src/efsw/FileWatcherInotify.cpp", "src/efsw/FileWatcherFSEvents.cpp" } + elseif os.is("linux") then + excludes { "src/efsw/WatcherKqueue.cpp", "src/efsw/WatcherFSEvents.cpp", "src/efsw/WatcherWin32.cpp", "src/efsw/FileWatcherKqueue.cpp", "src/efsw/FileWatcherWin32.cpp", "src/efsw/FileWatcherFSEvents.cpp" } + elseif os.is("macosx") then + excludes { "src/efsw/WatcherInotify.cpp", "src/efsw/WatcherWin32.cpp", "src/efsw/FileWatcherInotify.cpp", "src/efsw/FileWatcherWin32.cpp" } + elseif os.is("freebsd") then + excludes { "src/efsw/WatcherInotify.cpp", "src/efsw/WatcherWin32.cpp", "src/efsw/WatcherFSEvents.cpp", "src/efsw/FileWatcherInotify.cpp", "src/efsw/FileWatcherWin32.cpp", "src/efsw/FileWatcherFSEvents.cpp" } + end + + if os.is("linux") and not inotify_header_exists() then + defines { "EFSW_INOTIFY_NOSYS" } + end +end + +solution "efsw" + location("./make/" .. os.get() .. "/") + targetdir("./bin") + configurations { "debug", "release", "relwithdbginfo" } + + if os.is("windows") then + osfiles = "src/efsw/platform/win/*.cpp" + else + osfiles = "src/efsw/platform/posix/*.cpp" + end + + -- Activates verbose mode + if _OPTIONS["verbose"] then + defines { "EFSW_VERBOSE" } + end + + if os.is("macosx") then + -- Premake 4.4 needed for this + if not string.match(_PREMAKE_VERSION, "^4.[123]") then + local ver = os.getversion(); + + if not ( ver.majorversion >= 10 and ver.minorversion >= 5 ) then + defines { "EFSW_FSEVENTS_NOT_SUPPORTED" } + end + end + end + + objdir("obj/" .. os.get() .. "/") + + project "efsw-static-lib" + kind "StaticLib" + language "C++" + targetdir("./lib") + includedirs { "include", "src" } + files { "src/efsw/*.cpp", osfiles } + conf_excludes() + + configuration "debug" + defines { "DEBUG" } + flags { "Symbols" } + targetname "efsw-static-debug" + conf_warnings() + + configuration "release" + defines { "NDEBUG" } + flags { "Optimize" } + targetname "efsw-static-release" + conf_warnings() + + configuration "relwithdbginfo" + defines { "NDEBUG" } + flags { "Optimize", "Symbols" } + targetname "efsw-static-reldbginfo" + conf_warnings() + + project "efsw-test" + kind "ConsoleApp" + language "C++" + links { "efsw-static-lib" } + files { "src/test/*.cpp" } + includedirs { "include", "src" } + conf_links() + + configuration "debug" + defines { "DEBUG" } + flags { "Symbols" } + targetname "efsw-test-debug" + conf_warnings() + + configuration "release" + defines { "NDEBUG" } + flags { "Optimize" } + targetname "efsw-test-release" + conf_warnings() + + configuration "relwithdbginfo" + defines { "NDEBUG" } + flags { "Optimize", "Symbols" } + targetname "efsw-test-reldbginfo" + conf_warnings() + + project "efsw-shared-lib" + kind "SharedLib" + language "C++" + targetdir("./lib") + includedirs { "include", "src" } + files { "src/efsw/*.cpp", osfiles } + defines { "EFSW_DYNAMIC", "EFSW_EXPORTS" } + conf_excludes() + conf_links() + + configuration "debug" + defines { "DEBUG" } + flags { "Symbols" } + targetname "efsw-debug" + conf_warnings() + + configuration "release" + defines { "NDEBUG" } + flags { "Optimize" } + targetname "efsw" + conf_warnings() + + configuration "relwithdbginfo" + defines { "NDEBUG" } + flags { "Optimize", "Symbols" } + targetname "efsw" + conf_warnings() + + if os.is("linux") or os.is("bsd") or os.is("haiku") then + targetextension ( ".so." .. efsw_version ) + postbuildcommands { "sh ../../project/build.reldbginfo.sh " .. efsw_major_version .. " " .. efsw_minor_version .. " " .. efsw_patch_version .. " " .. iif( _OPTIONS["strip-symbols"], "strip-symbols", "" ) } + end diff --git a/lib/efsw/project/build.reldbginfo.sh b/lib/efsw/project/build.reldbginfo.sh new file mode 100644 index 0000000..9282efe --- /dev/null +++ b/lib/efsw/project/build.reldbginfo.sh @@ -0,0 +1,9 @@ +#!/bin/sh +cd ../../lib +ln -s libefsw.so.$1.$2.$3 libefsw.so.$1 +ln -s libefsw.so.$1 libefsw.so + +if [ "$4" == "strip-symbols" ]; then + objcopy --only-keep-debug libefsw.so.$1.$2.$3 libefsw.debug + objcopy --strip-debug libefsw.so.$1.$2.$3 +fi diff --git a/lib/efsw/project/qtcreator-linux/efsw.config b/lib/efsw/project/qtcreator-linux/efsw.config new file mode 100644 index 0000000..8cec188 --- /dev/null +++ b/lib/efsw/project/qtcreator-linux/efsw.config @@ -0,0 +1 @@ +// ADD PREDEFINED MACROS HERE! diff --git a/lib/efsw/project/qtcreator-linux/efsw.creator b/lib/efsw/project/qtcreator-linux/efsw.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/lib/efsw/project/qtcreator-linux/efsw.creator @@ -0,0 +1 @@ +[General] diff --git a/lib/efsw/project/qtcreator-linux/efsw.creator.user b/lib/efsw/project/qtcreator-linux/efsw.creator.user new file mode 100644 index 0000000..fbd3f3d --- /dev/null +++ b/lib/efsw/project/qtcreator-linux/efsw.creator.user @@ -0,0 +1,406 @@ + + + + + + EnvironmentId + {b6114084-39c2-4cd0-b9e2-d8803dc6b446} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + System + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {388e5431-b31b-42b3-b9ad-9002d279d75d} + 1 + 0 + 0 + + ../../make/linux + + + true + gmake + premake4 + %{buildDir}../../../ + Custom Process Step + + ProjectExplorer.ProcessStep + + + + false + -j4 -e config=release + + true + Make + + GenericProjectManager.GenericMakeStep + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + -e config=release + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + + release + GenericProjectManager.GenericBuildConfiguration + + + ../../make/linux + + + true + --verbose gmake + premake4 + %{buildDir}../../../ + Custom Process Step + + ProjectExplorer.ProcessStep + + + + false + -j4 + + true + Make + + GenericProjectManager.GenericMakeStep + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + + debug + GenericProjectManager.GenericBuildConfiguration + + + ../../make/linux + + + true + gmake + premake4 + %{buildDir}../../../ + Custom Process Step + + ProjectExplorer.ProcessStep + + + + false + -j4 -e config=relwithdbginfo + + true + Make + + GenericProjectManager.GenericMakeStep + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + -e config=relwithdbginfo + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + + relwithdbginfo + GenericProjectManager.GenericBuildConfiguration + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + No deployment + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + %{buildDir}../../../bin/efsw-test-debug + true + %{buildDir}../../../ + Run %{buildDir}../../../bin/efsw-test-debug + debug + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + false + false + true + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + %{buildDir}../../../bin/efsw-test-release + true + %{buildDir}../../../ + Run %{buildDir}../../../bin/efsw-test-release + release + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + false + false + true + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + %{buildDir}../../../bin/efsw-test-dbginfo + true + %{buildDir}../../../ + Run %{buildDir}../../../bin/efsw-test-dbginfo + reldbginfo + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + false + false + true + + 3 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 16 + + + Version + 16 + + diff --git a/lib/efsw/project/qtcreator-linux/efsw.files b/lib/efsw/project/qtcreator-linux/efsw.files new file mode 100644 index 0000000..688b3f4 --- /dev/null +++ b/lib/efsw/project/qtcreator-linux/efsw.files @@ -0,0 +1,115 @@ +../../include/efsw/efsw.hpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/Thread.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/System.cpp +../../src/efsw/platform/platformimpl.hpp +../../src/efsw/platform/posix/ThreadImpl.hpp +../../src/efsw/platform/posix/MutexImpl.hpp +../../src/efsw/platform/posix/SystemImpl.hpp +../../src/efsw/platform/posix/ThreadImpl.cpp +../../src/efsw/platform/posix/MutexImpl.cpp +../../src/efsw/platform/posix/SystemImpl.cpp +../../src/efsw/platform/win/ThreadImpl.hpp +../../src/efsw/platform/win/MutexImpl.hpp +../../src/efsw/platform/win/SystemImpl.hpp +../../src/efsw/platform/win/ThreadImpl.cpp +../../src/efsw/platform/win/MutexImpl.cpp +../../src/efsw/platform/win/SystemImpl.cpp +../../src/efsw/base.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/platform/posix/FileSystemImpl.hpp +../../src/efsw/platform/posix/FileSystemImpl.cpp +../../src/efsw/platform/win/FileSystemImpl.hpp +../../src/efsw/platform/win/FileSystemImpl.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/base.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/sophist.h +../../src/efsw/base.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/Utf.inl +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/test/efsw-test.cpp +../../premake4.lua +../../src/efsw/WatcherKqueue.hpp +../../src/efsw/WatcherKqueue.cpp +../../src/efsw/Debug.hpp +../../src/efsw/Debug.cpp +../../src/efsw/WatcherGeneric.hpp +../../src/efsw/WatcherGeneric.cpp +../../src/efsw/DirWatcherGeneric.hpp +../../src/efsw/DirWatcherGeneric.cpp +../../src/efsw/Log.cpp +../../src/efsw/WatcherInotify.hpp +../../src/efsw/WatcherInotify.cpp +../../src/efsw/FileWatcherImpl.cpp +../../src/efsw/DirectorySnapshot.hpp +../../src/efsw/DirectorySnapshot.cpp +../../src/efsw/DirectorySnapshotDiff.hpp +../../src/efsw/DirectorySnapshotDiff.cpp +../../src/efsw/WatcherFSEvents.hpp +../../src/efsw/FileWatcherFSEvents.hpp +../../src/efsw/WatcherFSEvents.cpp +../../src/efsw/FileWatcherFSEvents.cpp +../../src/efsw/Watcher.hpp +../../src/efsw/Watcher.cpp +../../src/efsw/WatcherWin32.hpp +../../src/efsw/WatcherWin32.cpp +../../README.md +../../include/efsw/efsw.h +../../src/efsw/FileWatcherCWrapper.cpp +../../src/efsw/inotify-nosys.h diff --git a/lib/efsw/project/qtcreator-linux/efsw.includes b/lib/efsw/project/qtcreator-linux/efsw.includes new file mode 100644 index 0000000..1ab792a --- /dev/null +++ b/lib/efsw/project/qtcreator-linux/efsw.includes @@ -0,0 +1,2 @@ +../../include +../../src diff --git a/lib/efsw/project/qtcreator-osx/efsw.config b/lib/efsw/project/qtcreator-osx/efsw.config new file mode 100644 index 0000000..34b1123 --- /dev/null +++ b/lib/efsw/project/qtcreator-osx/efsw.config @@ -0,0 +1,2 @@ +// ADD PREDEFINED MACROS HERE! +#define EFSW_FSEVENTS_SUPPORTED diff --git a/lib/efsw/project/qtcreator-osx/efsw.creator b/lib/efsw/project/qtcreator-osx/efsw.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/lib/efsw/project/qtcreator-osx/efsw.creator @@ -0,0 +1 @@ +[General] diff --git a/lib/efsw/project/qtcreator-osx/efsw.creator.user b/lib/efsw/project/qtcreator-osx/efsw.creator.user new file mode 100644 index 0000000..7685319 --- /dev/null +++ b/lib/efsw/project/qtcreator-osx/efsw.creator.user @@ -0,0 +1,296 @@ + + + + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + true + true + 1 + true + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {03ce7d1a-f943-45a1-9d10-661febc7fb89} + 0 + 0 + 0 + + ../../make/macosx/ + + + true + --file=../../premake4.lua gmake + /usr/local/bin/premake4 + %{buildDir} + Custom Process Step + + ProjectExplorer.ProcessStep + + + + false + -j4 + + true + Make + + GenericProjectManager.GenericMakeStep + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Default + debug + GenericProjectManager.GenericBuildConfiguration + + + ../../make/macosx/ + + + true + --file=../../premake4.lua gmake + /usr/local/bin/premake4 + %{buildDir} + Custom Process Step + + ProjectExplorer.ProcessStep + + + + false + -j4 config=release + + true + Make + + GenericProjectManager.GenericMakeStep + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + config=release + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Default + release + GenericProjectManager.GenericBuildConfiguration + + 2 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + efsw-test-debug + false + %{buildDir}/../../bin/ + Run efsw-test-debug + debug + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + false + false + true + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + efsw-test + false + %{buildDir}/../../bin/ + Run efsw-test + release + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + false + false + true + + 2 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.EnvironmentId + {1e2eacf3-3fa1-45d9-bcd5-871df4d12ee9} + + + ProjectExplorer.Project.Updater.FileVersion + 15 + + diff --git a/lib/efsw/project/qtcreator-osx/efsw.files b/lib/efsw/project/qtcreator-osx/efsw.files new file mode 100644 index 0000000..0ab369f --- /dev/null +++ b/lib/efsw/project/qtcreator-osx/efsw.files @@ -0,0 +1,185 @@ +../../include/efsw/efsw.hpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/Thread.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/System.cpp +../../src/efsw/platform/platformimpl.hpp +../../src/efsw/platform/posix/ThreadImpl.hpp +../../src/efsw/platform/posix/MutexImpl.hpp +../../src/efsw/platform/posix/SystemImpl.hpp +../../src/efsw/platform/posix/ThreadImpl.cpp +../../src/efsw/platform/posix/MutexImpl.cpp +../../src/efsw/platform/posix/SystemImpl.cpp +../../src/efsw/platform/win/ThreadImpl.hpp +../../src/efsw/platform/win/MutexImpl.hpp +../../src/efsw/platform/win/SystemImpl.hpp +../../src/efsw/platform/win/ThreadImpl.cpp +../../src/efsw/platform/win/MutexImpl.cpp +../../src/efsw/platform/win/SystemImpl.cpp +../../src/efsw/base.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/platform/posix/FileSystemImpl.hpp +../../src/efsw/platform/posix/FileSystemImpl.cpp +../../src/efsw/platform/win/FileSystemImpl.hpp +../../src/efsw/platform/win/FileSystemImpl.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/base.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/sophist.h +../../src/efsw/base.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/Utf.inl +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/test/efsw-test.cpp +../../premake4.lua +../../src/efsw/WatcherKqueue.hpp +../../src/efsw/WatcherKqueue.cpp +../../src/efsw/WatcherKqueue.hpp +../../src/efsw/WatcherInotify.hpp +../../src/efsw/WatcherGeneric.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/sophist.h +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/DirWatcherGeneric.hpp +../../src/efsw/Debug.hpp +../../src/efsw/base.hpp +../../src/efsw/WatcherKqueue.cpp +../../src/efsw/WatcherInotify.cpp +../../src/efsw/WatcherGeneric.cpp +../../src/efsw/Utf.inl +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/Log.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/DirWatcherGeneric.cpp +../../src/efsw/Debug.cpp +../../src/efsw/FileWatcherImpl.cpp +../../src/efsw/DirectorySnapshotDiff.hpp +../../src/efsw/DirectorySnapshot.hpp +../../src/efsw/DirectorySnapshotDiff.cpp +../../src/efsw/DirectorySnapshot.cpp +../../src/efsw/WatcherFSEvents.hpp +../../src/efsw/FileWatcherFSEvents.hpp +../../src/efsw/WatcherFSEvents.cpp +../../src/efsw/FileWatcherFSEvents.cpp +../../src/efsw/WatcherWin32.hpp +../../src/efsw/WatcherKqueue.hpp +../../src/efsw/WatcherInotify.hpp +../../src/efsw/WatcherGeneric.hpp +../../src/efsw/WatcherFSEvents.hpp +../../src/efsw/Watcher.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/sophist.h +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileWatcherFSEvents.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/DirWatcherGeneric.hpp +../../src/efsw/DirectorySnapshotDiff.hpp +../../src/efsw/DirectorySnapshot.hpp +../../src/efsw/Debug.hpp +../../src/efsw/base.hpp +../../src/efsw/WatcherWin32.cpp +../../src/efsw/WatcherKqueue.cpp +../../src/efsw/WatcherInotify.cpp +../../src/efsw/WatcherGeneric.cpp +../../src/efsw/WatcherFSEvents.cpp +../../src/efsw/Watcher.cpp +../../src/efsw/Utf.inl +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/Log.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherImpl.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcherFSEvents.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/DirWatcherGeneric.cpp +../../src/efsw/DirectorySnapshotDiff.cpp +../../src/efsw/DirectorySnapshot.cpp +../../src/efsw/Debug.cpp diff --git a/lib/efsw/project/qtcreator-osx/efsw.includes b/lib/efsw/project/qtcreator-osx/efsw.includes new file mode 100644 index 0000000..0eeab56 --- /dev/null +++ b/lib/efsw/project/qtcreator-osx/efsw.includes @@ -0,0 +1,2 @@ +../../src +../../include diff --git a/lib/efsw/project/qtcreator-win/efsw.config b/lib/efsw/project/qtcreator-win/efsw.config new file mode 100644 index 0000000..8cec188 --- /dev/null +++ b/lib/efsw/project/qtcreator-win/efsw.config @@ -0,0 +1 @@ +// ADD PREDEFINED MACROS HERE! diff --git a/lib/efsw/project/qtcreator-win/efsw.creator b/lib/efsw/project/qtcreator-win/efsw.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/lib/efsw/project/qtcreator-win/efsw.creator @@ -0,0 +1 @@ +[General] diff --git a/lib/efsw/project/qtcreator-win/efsw.creator.user b/lib/efsw/project/qtcreator-win/efsw.creator.user new file mode 100644 index 0000000..deef753 --- /dev/null +++ b/lib/efsw/project/qtcreator-win/efsw.creator.user @@ -0,0 +1,285 @@ + + + + + + EnvironmentId + {af0f12c1-72f3-4999-9888-433d0162b517} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {3130e40f-4e0c-4a5b-bc9d-d9cf7a7e2d91} + 0 + 0 + 0 + + ../../make/windows/ + + + + false + -j2 + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Default + debug + GenericProjectManager.GenericBuildConfiguration + + + ../../make/windows/ + + + + false + -j2 config=release + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + config=release + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Default + release + GenericProjectManager.GenericBuildConfiguration + + 2 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + %{buildDir}/../../bin/efsw-test-debug.exe + false + %{buildDir}/../../bin/ + Run %{buildDir}\..\..\bin\efsw-test-debug.exe + debug + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + false + true + false + false + true + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + %{buildDir}/../../bin/efsw-test.exe + false + %{buildDir}/../../bin/ + Run %{buildDir}\..\..\bin\efsw-test.exe + release + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + false + true + false + false + true + + 2 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/lib/efsw/project/qtcreator-win/efsw.files b/lib/efsw/project/qtcreator-win/efsw.files new file mode 100644 index 0000000..5e567b5 --- /dev/null +++ b/lib/efsw/project/qtcreator-win/efsw.files @@ -0,0 +1,214 @@ +../../include/efsw/efsw.hpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/Thread.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/System.cpp +../../src/efsw/platform/platformimpl.hpp +../../src/efsw/platform/posix/ThreadImpl.hpp +../../src/efsw/platform/posix/MutexImpl.hpp +../../src/efsw/platform/posix/SystemImpl.hpp +../../src/efsw/platform/posix/ThreadImpl.cpp +../../src/efsw/platform/posix/MutexImpl.cpp +../../src/efsw/platform/posix/SystemImpl.cpp +../../src/efsw/platform/win/ThreadImpl.hpp +../../src/efsw/platform/win/MutexImpl.hpp +../../src/efsw/platform/win/SystemImpl.hpp +../../src/efsw/platform/win/ThreadImpl.cpp +../../src/efsw/platform/win/MutexImpl.cpp +../../src/efsw/platform/win/SystemImpl.cpp +../../src/efsw/base.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/platform/posix/FileSystemImpl.hpp +../../src/efsw/platform/posix/FileSystemImpl.cpp +../../src/efsw/platform/win/FileSystemImpl.hpp +../../src/efsw/platform/win/FileSystemImpl.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/base.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/sophist.h +../../src/efsw/base.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/Utf.inl +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/test/efsw-test.cpp +../../src/efsw/WatcherKqueue.hpp +../../src/efsw/WatcherInotify.hpp +../../src/efsw/WatcherGeneric.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/DirWatcherGeneric.hpp +../../src/efsw/Debug.hpp +../../src/efsw/base.hpp +../../src/efsw/sophist.h +../../src/efsw/Utf.inl +../../src/efsw/WatcherKqueue.cpp +../../src/efsw/WatcherInotify.cpp +../../src/efsw/WatcherGeneric.cpp +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/Log.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/DirWatcherGeneric.cpp +../../src/efsw/Debug.cpp +../../premake4.lua +../../src/efsw/WatcherKqueue.hpp +../../src/efsw/WatcherInotify.hpp +../../src/efsw/WatcherGeneric.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/sophist.h +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/DirWatcherGeneric.hpp +../../src/efsw/Debug.hpp +../../src/efsw/base.hpp +../../src/efsw/Utf.inl +../../src/efsw/WatcherKqueue.cpp +../../src/efsw/WatcherInotify.cpp +../../src/efsw/WatcherGeneric.cpp +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/Log.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherImpl.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/DirWatcherGeneric.cpp +../../src/efsw/Debug.cpp +../../src/efsw/WatcherWin32.hpp +../../src/efsw/WatcherKqueue.hpp +../../src/efsw/WatcherInotify.hpp +../../src/efsw/WatcherGeneric.hpp +../../src/efsw/WatcherFSEvents.hpp +../../src/efsw/Watcher.hpp +../../src/efsw/Utf.hpp +../../src/efsw/Thread.hpp +../../src/efsw/System.hpp +../../src/efsw/String.hpp +../../src/efsw/sophist.h +../../src/efsw/Mutex.hpp +../../src/efsw/FileWatcherWin32.hpp +../../src/efsw/FileWatcherKqueue.hpp +../../src/efsw/FileWatcherInotify.hpp +../../src/efsw/FileWatcherImpl.hpp +../../src/efsw/FileWatcherGeneric.hpp +../../src/efsw/FileWatcherFSEvents.hpp +../../src/efsw/FileSystem.hpp +../../src/efsw/FileInfo.hpp +../../src/efsw/DirWatcherGeneric.hpp +../../src/efsw/DirectorySnapshotDiff.hpp +../../src/efsw/DirectorySnapshot.hpp +../../src/efsw/Debug.hpp +../../src/efsw/base.hpp +../../src/efsw/Utf.inl +../../src/efsw/WatcherWin32.cpp +../../src/efsw/WatcherKqueue.cpp +../../src/efsw/WatcherInotify.cpp +../../src/efsw/WatcherGeneric.cpp +../../src/efsw/WatcherFSEvents.cpp +../../src/efsw/Watcher.cpp +../../src/efsw/Thread.cpp +../../src/efsw/System.cpp +../../src/efsw/String.cpp +../../src/efsw/Mutex.cpp +../../src/efsw/Log.cpp +../../src/efsw/FileWatcherWin32.cpp +../../src/efsw/FileWatcherKqueue.cpp +../../src/efsw/FileWatcherInotify.cpp +../../src/efsw/FileWatcherImpl.cpp +../../src/efsw/FileWatcherGeneric.cpp +../../src/efsw/FileWatcherFSEvents.cpp +../../src/efsw/FileWatcher.cpp +../../src/efsw/FileSystem.cpp +../../src/efsw/FileInfo.cpp +../../src/efsw/DirWatcherGeneric.cpp +../../src/efsw/DirectorySnapshotDiff.cpp +../../src/efsw/DirectorySnapshot.cpp +../../src/efsw/Debug.cpp +../../include/efsw/efsw.h +../../src/efsw/FileWatcherCWrapper.cpp diff --git a/lib/efsw/project/qtcreator-win/efsw.includes b/lib/efsw/project/qtcreator-win/efsw.includes new file mode 100644 index 0000000..0eeab56 --- /dev/null +++ b/lib/efsw/project/qtcreator-win/efsw.includes @@ -0,0 +1,2 @@ +../../src +../../include diff --git a/lib/efsw/src/efsw/Debug.cpp b/lib/efsw/src/efsw/Debug.cpp new file mode 100644 index 0000000..9c4ee02 --- /dev/null +++ b/lib/efsw/src/efsw/Debug.cpp @@ -0,0 +1,85 @@ +#include +#include + +#ifdef EFSW_COMPILER_MSVC +#define WIN32_LEAN_AND_MEAN +#include +#include +#endif + +#include +#include +#include + +namespace efsw { + +#ifdef DEBUG + +void efREPORT_ASSERT( const char * File, int Line, const char * Exp ) +{ + #ifdef EFSW_COMPILER_MSVC + _CrtDbgReport( _CRT_ASSERT, File, Line, "", Exp); + + DebugBreak(); + #else + std::cout << "ASSERT: " << Exp << " file: " << File << " line: " << Line << std::endl; + + #if defined(EFSW_COMPILER_GCC) && defined(EFSW_32BIT) && !defined(EFSW_ARM) + asm("int3"); + #else + assert( false ); + #endif + #endif +} + +void efPRINT( const char * format, ... ) +{ + char buf[2048]; + va_list args; + + va_start( args, format ); + + #ifdef EFSW_COMPILER_MSVC + _vsnprintf_s( buf, sizeof( buf ), sizeof( buf ) / sizeof( buf[0]), format, args ); + #else + vsnprintf( buf, sizeof( buf ) / sizeof( buf[0]), format, args ); + #endif + + va_end( args ); + + #ifdef EFSW_COMPILER_MSVC + OutputDebugStringA( buf ); + #else + std::cout << buf; + #endif +} + +void efPRINTC( unsigned int cond, const char * format, ...) +{ + if ( 0 == cond ) + return; + + char buf[2048]; + va_list args; + + va_start( args, format ); + + #ifdef EFSW_COMPILER_MSVC + _vsnprintf_s( buf, efARRAY_SIZE( buf ), efARRAY_SIZE( buf ), format, args ); + #else + vsnprintf( buf, sizeof( buf ) / sizeof( buf[0]), format, args ); + #endif + + va_end( args ); + + #ifdef EFSW_COMPILER_MSVC + OutputDebugStringA( buf ); + #else + std::cout << buf; + #endif +} + +#endif + +} + diff --git a/lib/efsw/src/efsw/Debug.hpp b/lib/efsw/src/efsw/Debug.hpp new file mode 100644 index 0000000..75d6dce --- /dev/null +++ b/lib/efsw/src/efsw/Debug.hpp @@ -0,0 +1,50 @@ +#ifndef EFSW_DEBUG_HPP +#define EFSW_DEBUG_HPP + +#include + +namespace efsw { + +#ifdef DEBUG + +void efREPORT_ASSERT( const char * File, const int Line, const char * Exp ); + +#define efASSERT( expr ) if ( !(expr) ) { efREPORT_ASSERT( __FILE__, __LINE__, #expr ); } +#define efASSERTM( expr, msg ) if ( !(expr) ) { efREPORT_ASSERT( __FILE__, __LINE__, #msg ); } + +void efPRINT ( const char * format, ... ); +void efPRINTC ( unsigned int cond, const char * format, ... ); + +#else + +#define efASSERT( expr ) +#define efASSERTM( expr, msg ) + +#ifndef EFSW_COMPILER_MSVC + #define efPRINT( format, args... ) {} + #define efPRINTC( cond, format, args... ) {} +#else + #define efPRINT + #define efPRINTC +#endif + +#endif + +#ifdef EFSW_VERBOSE + #define efDEBUG efPRINT + #define efDEBUGC efPRINTC +#else + + #ifndef EFSW_COMPILER_MSVC + #define efDEBUG( format, args... ) {} + #define efDEBUGC( cond, format, args... ) {} + #else + #define efDEBUG + #define efDEBUGC + #endif + +#endif + +} + +#endif diff --git a/lib/efsw/src/efsw/DirWatcherGeneric.cpp b/lib/efsw/src/efsw/DirWatcherGeneric.cpp new file mode 100644 index 0000000..b80c14d --- /dev/null +++ b/lib/efsw/src/efsw/DirWatcherGeneric.cpp @@ -0,0 +1,451 @@ +#include +#include +#include +#include + +namespace efsw { + +DirWatcherGeneric::DirWatcherGeneric( DirWatcherGeneric * parent, WatcherGeneric * ws, const std::string& directory, bool recursive, bool reportNewFiles ) : + Parent( parent ), + Watch( ws ), + Recursive( recursive ), + Deleted( false ) +{ + resetDirectory( directory ); + + if ( !reportNewFiles ) + { + DirSnap.scan(); + } + else + { + DirectorySnapshotDiff Diff = DirSnap.scan(); + + if ( Diff.changed() ) + { + FileInfoList::iterator it; + + DiffIterator( FilesCreated ) + { + handleAction( ( *it ).Filepath, Actions::Add ); + } + } + } +} + +DirWatcherGeneric::~DirWatcherGeneric() +{ + /// If the directory was deleted mark the files as deleted + if ( Deleted ) + { + DirectorySnapshotDiff Diff = DirSnap.scan(); + + if ( !DirSnap.exists() ) + { + FileInfoList::iterator it; + + DiffIterator( FilesDeleted ) + { + handleAction( (*it).Filepath, Actions::Delete ); + } + + DiffIterator( DirsDeleted ) + { + handleAction( (*it).Filepath, Actions::Delete ); + } + } + } + + DirWatchMap::iterator it = Directories.begin(); + + for ( ; it != Directories.end(); it++ ) + { + if ( Deleted ) + { + /// If the directory was deleted, mark the flag for file deletion + it->second->Deleted = true; + } + + efSAFE_DELETE( it->second ); + } +} + +void DirWatcherGeneric::resetDirectory( std::string directory ) +{ + std::string dir( directory ); + + /// Is this a recursive watch? + if ( Watch->Directory != directory ) + { + if ( !( directory.size() && ( directory.at(0) == FileSystem::getOSSlash() || directory.at( directory.size() - 1 ) == FileSystem::getOSSlash() ) ) ) + { + /// Get the real directory + if ( NULL != Parent ) + { + FileSystem::dirAddSlashAtEnd(directory); + + dir = Parent->DirSnap.DirectoryInfo.Filepath + directory; + } + else + { + efDEBUG( "resetDirectory(): Parent is NULL. Fatal error." ); + } + } + } + + DirSnap.setDirectoryInfo( dir ); +} + +void DirWatcherGeneric::handleAction( const std::string &filename, unsigned long action, std::string oldFilename) +{ + Watch->Listener->handleFileAction( Watch->ID, DirSnap.DirectoryInfo.Filepath, FileSystem::fileNameFromPath( filename ), (Action)action, oldFilename ); +} + +void DirWatcherGeneric::addChilds( bool reportNewFiles ) +{ + if ( Recursive ) + { + /// Create the subdirectories watchers + std::string dir; + + for ( FileInfoMap::iterator it = DirSnap.Files.begin(); it != DirSnap.Files.end(); it++ ) + { + if ( it->second.isDirectory() && it->second.isReadable() && !FileSystem::isRemoteFS( it->second.Filepath ) ) + { + /// Check if the directory is a symbolic link + std::string curPath; + std::string link( FileSystem::getLinkRealPath( it->second.Filepath, curPath ) ); + + dir = it->first; + + if ( "" != link ) + { + /// Avoid adding symlinks directories if it's now enabled + if ( !Watch->WatcherImpl->mFileWatcher->followSymlinks() ) + { + continue; + } + + /// If it's a symlink check if the realpath exists as a watcher, or + /// if the path is outside the current dir + if ( Watch->WatcherImpl->pathInWatches( link ) || Watch->pathInWatches( link ) || !Watch->WatcherImpl->linkAllowed( curPath, link ) ) + { + continue; + } + else + { + dir = link; + } + } + else + { + if ( Watch->pathInWatches( dir ) || Watch->WatcherImpl->pathInWatches( dir ) ) + { + continue; + } + } + + if ( reportNewFiles ) + { + handleAction( dir, Actions::Add ); + } + + Directories[dir] = new DirWatcherGeneric( this, Watch, dir, Recursive, reportNewFiles ); + + Directories[dir]->addChilds( reportNewFiles ); + } + } + } +} + +void DirWatcherGeneric::watch( bool reportOwnChange ) +{ + DirectorySnapshotDiff Diff = DirSnap.scan(); + + if ( reportOwnChange && Diff.DirChanged && NULL != Parent ) + { + Watch->Listener->handleFileAction( Watch->ID, FileSystem::pathRemoveFileName( DirSnap.DirectoryInfo.Filepath ), FileSystem::fileNameFromPath( DirSnap.DirectoryInfo.Filepath ), Actions::Modified ); + } + + if ( Diff.changed() ) + { + FileInfoList::iterator it; + MovedList::iterator mit; + + /// Files + DiffIterator( FilesCreated ) + { + handleAction( (*it).Filepath, Actions::Add ); + } + + DiffIterator( FilesModified ) + { + handleAction( (*it).Filepath, Actions::Modified ); + } + + DiffIterator( FilesDeleted ) + { + handleAction( (*it).Filepath, Actions::Delete ); + } + + DiffMovedIterator( FilesMoved ) + { + handleAction( (*mit).second.Filepath, Actions::Moved, (*mit).first ); + } + + /// Directories + DiffIterator( DirsCreated ) + { + createDirectory( (*it).Filepath ); + } + + DiffIterator( DirsModified ) + { + handleAction( (*it).Filepath, Actions::Modified ); + } + + DiffIterator( DirsDeleted ) + { + handleAction( (*it).Filepath, Actions::Delete ); + removeDirectory( (*it).Filepath ); + } + + DiffMovedIterator( DirsMoved ) + { + handleAction( (*mit).second.Filepath, Actions::Moved, (*mit).first ); + moveDirectory( (*mit).first, (*mit).second.Filepath ); + } + } + + /// Process the subdirectories looking for changes + for ( DirWatchMap::iterator dit = Directories.begin(); dit != Directories.end(); dit++ ) + { + /// Just watch + dit->second->watch(); + } +} + +void DirWatcherGeneric::watchDir( std::string &dir ) +{ + DirWatcherGeneric * watcher = Watch->WatcherImpl->mFileWatcher->allowOutOfScopeLinks() ? + findDirWatcher( dir ) : + findDirWatcherFast( dir ); + + if ( NULL != watcher ) + { + watcher->watch( true ); + } +} + +DirWatcherGeneric * DirWatcherGeneric::findDirWatcherFast( std::string dir ) +{ + // remove the common base ( dir should always start with the same base as the watcher ) + efASSERT( !dir.empty() ); + efASSERT( dir.size() >= DirSnap.DirectoryInfo.Filepath.size() ); + efASSERT( DirSnap.DirectoryInfo.Filepath == dir.substr( 0, DirSnap.DirectoryInfo.Filepath.size() ) ); + + if ( dir.size() >= DirSnap.DirectoryInfo.Filepath.size() ) + { + dir = dir.substr( DirSnap.DirectoryInfo.Filepath.size() - 1 ); + } + + if ( dir.size() == 1 ) + { + efASSERT( dir[0] == FileSystem::getOSSlash() ); + return this; + } + + size_t level = 0; + std::vector dirv = String::split( dir, FileSystem::getOSSlash(), false ); + + DirWatcherGeneric * watcher = this; + + while ( level < dirv.size() ) + { + // search the dir level in the current watcher + DirWatchMap::iterator it = watcher->Directories.find( dirv[ level ] ); + + // found? continue with the next level + if ( it != watcher->Directories.end() ) + { + watcher = it->second; + + level++; + } + else + { + // couldn't found the folder level? + // directory not watched + return NULL; + } + } + + return watcher; +} + +DirWatcherGeneric * DirWatcherGeneric::findDirWatcher( std::string dir ) +{ + if ( DirSnap.DirectoryInfo.Filepath == dir ) + { + return this; + } + else + { + DirWatcherGeneric * watcher = NULL; + + for ( DirWatchMap::iterator it = Directories.begin(); it != Directories.end(); it++ ) + { + watcher = it->second->findDirWatcher( dir ); + + if ( NULL != watcher ) + { + return watcher; + } + } + } + + return NULL; +} + +DirWatcherGeneric * DirWatcherGeneric::createDirectory( std::string newdir ) +{ + FileSystem::dirRemoveSlashAtEnd( newdir ); + newdir = FileSystem::fileNameFromPath( newdir ); + + DirWatcherGeneric * dw = NULL; + + /// Check if the directory is a symbolic link + std::string dir( DirSnap.DirectoryInfo.Filepath + newdir ); + + FileSystem::dirAddSlashAtEnd( dir ); + + FileInfo fi( dir ); + + if ( !fi.isDirectory() || !fi.isReadable() || FileSystem::isRemoteFS( dir ) ) + { + return NULL; + } + + std::string curPath; + std::string link( FileSystem::getLinkRealPath( dir, curPath ) ); + bool skip = false; + + if ( "" != link ) + { + /// Avoid adding symlinks directories if it's now enabled + if ( !Watch->WatcherImpl->mFileWatcher->followSymlinks() ) + { + skip = true; + } + + /// If it's a symlink check if the realpath exists as a watcher, or + /// if the path is outside the current dir + if ( Watch->WatcherImpl->pathInWatches( link ) || Watch->pathInWatches( link ) || !Watch->WatcherImpl->linkAllowed( curPath, link ) ) + { + skip = true; + } + else + { + dir = link; + } + } + else + { + if ( Watch->pathInWatches( dir ) || Watch->WatcherImpl->pathInWatches( dir ) ) + { + skip = true; + } + } + + if ( !skip ) + { + handleAction( newdir, Actions::Add ); + + /// Creates the new directory watcher of the subfolder and check for new files + dw = new DirWatcherGeneric( this, Watch, dir, Recursive ); + + dw->addChilds(); + + dw->watch(); + + /// Add it to the list of directories + Directories[ newdir ] = dw; + } + + return dw; +} + +void DirWatcherGeneric::removeDirectory( std::string dir ) +{ + FileSystem::dirRemoveSlashAtEnd( dir ); + dir = FileSystem::fileNameFromPath( dir ); + + DirWatcherGeneric * dw = NULL; + DirWatchMap::iterator dit; + + /// Folder deleted + + /// Search the folder, it should exists + dit = Directories.find( dir ); + + if ( dit != Directories.end() ) + { + dw = dit->second; + + /// Flag it as deleted so it fire the event for every file inside deleted + dw->Deleted = true; + + /// Delete the DirWatcherGeneric + efSAFE_DELETE( dw ); + + /// Remove the directory from the map + Directories.erase( dit->first ); + } +} + +void DirWatcherGeneric::moveDirectory( std::string oldDir, std::string newDir ) +{ + FileSystem::dirRemoveSlashAtEnd( oldDir ); + oldDir = FileSystem::fileNameFromPath( oldDir ); + + FileSystem::dirRemoveSlashAtEnd( newDir ); + newDir = FileSystem::fileNameFromPath( newDir ); + + DirWatcherGeneric * dw = NULL; + DirWatchMap::iterator dit; + + /// Directory existed? + dit = Directories.find( oldDir ); + + if ( dit != Directories.end() ) + { + dw = dit->second; + + /// Remove the directory from the map + Directories.erase( dit->first ); + + Directories[ newDir ] = dw; + + dw->resetDirectory( newDir ); + } +} + +bool DirWatcherGeneric::pathInWatches( std::string path ) +{ + if ( DirSnap.DirectoryInfo.Filepath == path ) + { + return true; + } + + for ( DirWatchMap::iterator it = Directories.begin(); it != Directories.end(); it++ ) + { + if ( it->second->pathInWatches( path ) ) + { + return true; + } + } + + return false; +} + +} diff --git a/lib/efsw/src/efsw/DirWatcherGeneric.hpp b/lib/efsw/src/efsw/DirWatcherGeneric.hpp new file mode 100644 index 0000000..a758190 --- /dev/null +++ b/lib/efsw/src/efsw/DirWatcherGeneric.hpp @@ -0,0 +1,55 @@ +#ifndef EFSW_DIRWATCHERGENERIC_HPP +#define EFSW_DIRWATCHERGENERIC_HPP + +#include +#include +#include +#include + +namespace efsw { + +class DirWatcherGeneric +{ + public: + typedef std::map DirWatchMap; + + DirWatcherGeneric * Parent; + WatcherGeneric * Watch; + DirectorySnapshot DirSnap; + DirWatchMap Directories; + bool Recursive; + + DirWatcherGeneric( DirWatcherGeneric * parent, WatcherGeneric * ws, const std::string& directory, bool recursive, bool reportNewFiles = false ); + + ~DirWatcherGeneric(); + + void watch( bool reportOwnChange = false ); + + void watchDir( std::string& dir ); + + static bool isDir( const std::string& directory ); + + bool pathInWatches( std::string path ); + + void addChilds( bool reportNewFiles = true ); + + DirWatcherGeneric * findDirWatcher( std::string dir ); + + DirWatcherGeneric * findDirWatcherFast( std::string dir ); + protected: + bool Deleted; + + DirWatcherGeneric * createDirectory( std::string newdir ); + + void removeDirectory( std::string dir ); + + void moveDirectory( std::string oldDir, std::string newDir ); + + void resetDirectory( std::string directory ); + + void handleAction( const std::string& filename, unsigned long action, std::string oldFilename = ""); +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/DirectorySnapshot.cpp b/lib/efsw/src/efsw/DirectorySnapshot.cpp new file mode 100644 index 0000000..e068048 --- /dev/null +++ b/lib/efsw/src/efsw/DirectorySnapshot.cpp @@ -0,0 +1,263 @@ +#include +#include + +namespace efsw { + +DirectorySnapshot::DirectorySnapshot() +{ +} + +DirectorySnapshot::DirectorySnapshot( std::string directory ) +{ + init( directory ); +} + +DirectorySnapshot::~DirectorySnapshot() +{ +} + +void DirectorySnapshot::init( std::string directory ) +{ + setDirectoryInfo( directory ); + initFiles(); +} + +bool DirectorySnapshot::exists() +{ + return DirectoryInfo.exists(); +} + +void DirectorySnapshot::deleteAll( DirectorySnapshotDiff& Diff ) +{ + FileInfo fi; + + for ( FileInfoMap::iterator it = Files.begin(); it != Files.end(); it++ ) + { + fi = it->second; + + if ( fi.isDirectory() ) + { + Diff.DirsDeleted.push_back( fi ); + } + else + { + Diff.FilesDeleted.push_back( fi ); + } + } + + Files.clear(); +} + +void DirectorySnapshot::setDirectoryInfo( std::string directory ) +{ + DirectoryInfo = FileInfo( directory ); +} + +void DirectorySnapshot::initFiles() +{ + Files = FileSystem::filesInfoFromPath( DirectoryInfo.Filepath ); + + FileInfoMap::iterator it = Files.begin(); + std::list eraseFiles; + + /// Remove all non regular files and non directories + for ( ; it != Files.end(); it++ ) + { + if ( !it->second.isRegularFile() && !it->second.isDirectory() ) + { + eraseFiles.push_back( it->first ); + } + } + + for ( std::list::iterator eit = eraseFiles.begin(); eit != eraseFiles.end(); eit++ ) + { + Files.erase( *eit ); + } +} + +DirectorySnapshotDiff DirectorySnapshot::scan() +{ + DirectorySnapshotDiff Diff; + + Diff.clear(); + + FileInfo curFI( DirectoryInfo.Filepath ); + + Diff.DirChanged = DirectoryInfo != curFI; + + if ( Diff.DirChanged ) + { + DirectoryInfo = curFI; + } + + /// If the directory was erased, create the events for files and directories deletion + if ( !curFI.exists() ) + { + deleteAll( Diff ); + + return Diff; + } + + FileInfoMap files = FileSystem::filesInfoFromPath( DirectoryInfo.Filepath ); + + if ( files.empty() && Files.empty() ) + { + return Diff; + } + + FileInfo fi; + FileInfoMap FilesCpy; + FileInfoMap::iterator it; + FileInfoMap::iterator fiIt; + + if ( Diff.DirChanged ) + { + FilesCpy = Files; + } + + for ( it = files.begin(); it != files.end(); it++ ) + { + fi = it->second; + + /// File existed before? + fiIt = Files.find( it->first ); + + if ( fiIt != Files.end() ) + { + /// Erase from the file list copy + FilesCpy.erase( it->first ); + + /// File changed? + if ( (*fiIt).second != fi ) + { + /// Update the new file info + Files[ it->first ] = fi; + + /// handle modified event + if ( fi.isDirectory() ) + { + Diff.DirsModified.push_back( fi ); + } + else + { + Diff.FilesModified.push_back( fi ); + } + } + } + /// Only add regular files or directories + else if ( fi.isRegularFile() || fi.isDirectory() ) + { + /// New file found + Files[ it->first ] = fi; + + FileInfoMap::iterator fit; + std::string oldFile = ""; + + /// Check if the same inode already existed + if ( ( fit = nodeInFiles( fi ) ) != Files.end() ) + { + oldFile = fit->first; + + /// Avoid firing a Delete event + FilesCpy.erase( fit->first ); + + /// Delete the old file name + Files.erase( fit->first ); + + if ( fi.isDirectory() ) + { + Diff.DirsMoved.push_back( std::make_pair( oldFile, fi ) ); + } + else + { + Diff.FilesMoved.push_back( std::make_pair( oldFile, fi ) ); + } + } + else + { + if ( fi.isDirectory() ) + { + Diff.DirsCreated.push_back( fi ); + } + else + { + Diff.FilesCreated.push_back( fi ); + } + } + } + } + + if ( !Diff.DirChanged ) + { + return Diff; + } + + /// The files or directories that remains were deleted + for ( it = FilesCpy.begin(); it != FilesCpy.end(); it++ ) + { + fi = it->second; + + if ( fi.isDirectory() ) + { + Diff.DirsDeleted.push_back( fi ); + } + else + { + Diff.FilesDeleted.push_back( fi ); + } + + /// Remove the file or directory from the list of files + Files.erase( it->first ); + } + + return Diff; +} + +FileInfoMap::iterator DirectorySnapshot::nodeInFiles( FileInfo& fi ) +{ + FileInfoMap::iterator it; + + if ( FileInfo::inodeSupported() ) + { + for ( it = Files.begin(); it != Files.end(); it++ ) + { + if ( it->second.sameInode( fi ) && it->second.Filepath != fi.Filepath ) + { + return it; + } + } + } + + return Files.end(); +} + +void DirectorySnapshot::addFile( std::string path ) +{ + std::string name( FileSystem::fileNameFromPath( path ) ); + Files[ name ] = FileInfo( path ); +} + +void DirectorySnapshot::removeFile( std::string path ) +{ + std::string name( FileSystem::fileNameFromPath( path ) ); + + FileInfoMap::iterator it = Files.find( name ); + + if ( Files.end() != it ) + { + Files.erase( it ); + } +} + +void DirectorySnapshot::moveFile( std::string oldPath, std::string newPath ) +{ + removeFile( oldPath ); + addFile( newPath ); +} + +void DirectorySnapshot::updateFile(std::string path) +{ + addFile( path ); +} + +} diff --git a/lib/efsw/src/efsw/DirectorySnapshot.hpp b/lib/efsw/src/efsw/DirectorySnapshot.hpp new file mode 100644 index 0000000..1ada66f --- /dev/null +++ b/lib/efsw/src/efsw/DirectorySnapshot.hpp @@ -0,0 +1,46 @@ +#ifndef EFSW_DIRECTORYSNAPSHOT_HPP +#define EFSW_DIRECTORYSNAPSHOT_HPP + +#include + +namespace efsw { + +class DirectorySnapshot +{ + public: + FileInfo DirectoryInfo; + FileInfoMap Files; + + void setDirectoryInfo( std::string directory ); + + DirectorySnapshot(); + + DirectorySnapshot( std::string directory ); + + ~DirectorySnapshot(); + + void init( std::string directory ); + + bool exists(); + + DirectorySnapshotDiff scan(); + + FileInfoMap::iterator nodeInFiles( FileInfo& fi ); + + void addFile( std::string path ); + + void removeFile( std::string path ); + + void moveFile( std::string oldPath, std::string newPath ); + + void updateFile( std::string path ); + protected: + void initFiles(); + + void deleteAll( DirectorySnapshotDiff &Diff ); +}; + +} + +#endif + diff --git a/lib/efsw/src/efsw/DirectorySnapshotDiff.cpp b/lib/efsw/src/efsw/DirectorySnapshotDiff.cpp new file mode 100644 index 0000000..eabc6fd --- /dev/null +++ b/lib/efsw/src/efsw/DirectorySnapshotDiff.cpp @@ -0,0 +1,29 @@ +#include + +namespace efsw { + +void DirectorySnapshotDiff::clear() +{ + FilesCreated.clear(); + FilesModified.clear(); + FilesMoved.clear(); + FilesDeleted.clear(); + DirsCreated.clear(); + DirsModified.clear(); + DirsMoved.clear(); + DirsDeleted.clear(); +} + +bool DirectorySnapshotDiff::changed() +{ + return !FilesCreated.empty() || + !FilesModified.empty() || + !FilesMoved.empty() || + !FilesDeleted.empty() || + !DirsCreated.empty() || + !DirsModified.empty() || + !DirsMoved.empty() || + !DirsDeleted.empty(); +} + +} diff --git a/lib/efsw/src/efsw/DirectorySnapshotDiff.hpp b/lib/efsw/src/efsw/DirectorySnapshotDiff.hpp new file mode 100644 index 0000000..042de9c --- /dev/null +++ b/lib/efsw/src/efsw/DirectorySnapshotDiff.hpp @@ -0,0 +1,35 @@ +#ifndef EFSW_DIRECTORYSNAPSHOTDIFF_HPP +#define EFSW_DIRECTORYSNAPSHOTDIFF_HPP + +#include + +namespace efsw { + +class DirectorySnapshotDiff +{ + public: + FileInfoList FilesDeleted; + FileInfoList FilesCreated; + FileInfoList FilesModified; + MovedList FilesMoved; + FileInfoList DirsDeleted; + FileInfoList DirsCreated; + FileInfoList DirsModified; + MovedList DirsMoved; + bool DirChanged; + + void clear(); + + bool changed(); +}; + +#define DiffIterator( FileInfoListName ) it = Diff.FileInfoListName.begin(); \ + for ( ; it != Diff.FileInfoListName.end(); it++ ) + +#define DiffMovedIterator( MovedListName ) mit = Diff.MovedListName.begin(); \ + for ( ; mit != Diff.MovedListName.end(); mit++ ) + +} + +#endif + diff --git a/lib/efsw/src/efsw/FileInfo.cpp b/lib/efsw/src/efsw/FileInfo.cpp new file mode 100644 index 0000000..7b40594 --- /dev/null +++ b/lib/efsw/src/efsw/FileInfo.cpp @@ -0,0 +1,279 @@ +#include +#include +#include + +#ifndef _DARWIN_FEATURE_64_BIT_INODE +#define _DARWIN_FEATURE_64_BIT_INODE +#endif + +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif + +#include + +#include +#include + +#ifdef EFSW_COMPILER_MSVC + #ifndef S_ISDIR + #define S_ISDIR(f) ((f)&_S_IFDIR) + #endif + + #ifndef S_ISREG + #define S_ISREG(f) ((f)&_S_IFREG) + #endif + + #ifndef S_ISRDBL + #define S_ISRDBL(f) ((f)&_S_IREAD) + #endif +#else + #include + + #ifndef S_ISRDBL + #define S_ISRDBL(f) ((f)&S_IRUSR) + #endif +#endif + +namespace efsw { + +bool FileInfo::exists( const std::string& filePath ) +{ + FileInfo fi( filePath ); + return fi.exists(); +} + +bool FileInfo::isLink( const std::string& filePath ) +{ + FileInfo fi( filePath, true ); + return fi.isLink(); +} + +bool FileInfo::inodeSupported() +{ + #if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + return true; + #else + return false; + #endif +} + +FileInfo::FileInfo() : + ModificationTime(0), + OwnerId(0), + GroupId(0), + Permissions(0), + Inode(0) +{} + +FileInfo::FileInfo( const std::string& filepath ) : + Filepath( filepath ), + ModificationTime(0), + OwnerId(0), + GroupId(0), + Permissions(0), + Inode(0) +{ + getInfo(); +} + +FileInfo::FileInfo( const std::string& filepath, bool linkInfo ) : + Filepath( filepath ), + ModificationTime(0), + OwnerId(0), + GroupId(0), + Permissions(0), + Inode(0) +{ + if ( linkInfo ) + { + getRealInfo(); + } + else + { + getInfo(); + } +} + +void FileInfo::getInfo() +{ + #if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + if ( Filepath.size() == 3 && Filepath[1] == ':' && Filepath[2] == FileSystem::getOSSlash() ) + { + Filepath += FileSystem::getOSSlash(); + } + #endif + + /// Why i'm doing this? stat in mingw32 doesn't work for directories if the dir path ends with a path slash + bool slashAtEnd = FileSystem::slashAtEnd( Filepath ); + + if ( slashAtEnd ) + { + FileSystem::dirRemoveSlashAtEnd( Filepath ); + } + + #if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + struct stat st; + int res = stat( Filepath.c_str(), &st ); + #else + struct _stat st; + int res = _wstat( String::fromUtf8( Filepath ).toWideString().c_str(), &st ); + #endif + + if ( 0 == res ) + { + ModificationTime = st.st_mtime; + Size = st.st_size; + OwnerId = st.st_uid; + GroupId = st.st_gid; + Permissions = st.st_mode; + Inode = st.st_ino; + } + + if ( slashAtEnd ) + { + FileSystem::dirAddSlashAtEnd( Filepath ); + } +} + +void FileInfo::getRealInfo() +{ + bool slashAtEnd = FileSystem::slashAtEnd( Filepath ); + + if ( slashAtEnd ) + { + FileSystem::dirRemoveSlashAtEnd( Filepath ); + } + + #if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + struct stat st; + int res = lstat( Filepath.c_str(), &st ); + #else + struct _stat st; + int res = _wstat( String::fromUtf8( Filepath ).toWideString().c_str(), &st ); + #endif + + if ( 0 == res ) + { + ModificationTime = st.st_mtime; + Size = st.st_size; + OwnerId = st.st_uid; + GroupId = st.st_gid; + Permissions = st.st_mode; + Inode = st.st_ino; + } + + if ( slashAtEnd ) + { + FileSystem::dirAddSlashAtEnd( Filepath ); + } +} + +bool FileInfo::operator==( const FileInfo& Other ) const +{ + return ( ModificationTime == Other.ModificationTime && + Size == Other.Size && + OwnerId == Other.OwnerId && + GroupId == Other.GroupId && + Permissions == Other.Permissions && + Inode == Other.Inode + ); +} + +bool FileInfo::isDirectory() +{ + return 0 != S_ISDIR(Permissions); +} + +bool FileInfo::isRegularFile() +{ + return 0 != S_ISREG(Permissions); +} + +bool FileInfo::isReadable() +{ +#if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + static bool isRoot = getuid() == 0; + return isRoot || 0 != S_ISRDBL(Permissions); +#else + return 0 != S_ISRDBL(Permissions); +#endif +} + +bool FileInfo::isLink() +{ +#if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + return S_ISLNK(Permissions); +#else + return false; +#endif +} + +std::string FileInfo::linksTo() +{ +#if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + if ( isLink() ) + { + char * ch = realpath( Filepath.c_str(), NULL); + + if ( NULL != ch ) + { + std::string tstr( ch ); + + free( ch ); + + return tstr; + } + } +#endif + return std::string(""); +} + +bool FileInfo::exists() +{ + bool slashAtEnd = FileSystem::slashAtEnd( Filepath ); + + if ( slashAtEnd ) + { + FileSystem::dirRemoveSlashAtEnd(Filepath); + } + +#if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + struct stat st; + int res = stat( Filepath.c_str(), &st ); +#else + struct _stat st; + int res = _wstat( String::fromUtf8( Filepath ).toWideString().c_str(), &st ); +#endif + + if (slashAtEnd) + { + FileSystem::dirAddSlashAtEnd(Filepath); + } + + return 0 == res; +} + +FileInfo& FileInfo::operator=( const FileInfo& Other ) +{ + this->Filepath = Other.Filepath; + this->Size = Other.Size; + this->ModificationTime = Other.ModificationTime; + this->GroupId = Other.GroupId; + this->OwnerId = Other.OwnerId; + this->Permissions = Other.Permissions; + this->Inode = Other.Inode; + return *this; +} + +bool FileInfo::sameInode( const FileInfo& Other ) const +{ + return inodeSupported() && Inode == Other.Inode; +} + +bool FileInfo::operator!=( const FileInfo& Other ) const +{ + return !(*this == Other); +} + +} diff --git a/lib/efsw/src/efsw/FileInfo.hpp b/lib/efsw/src/efsw/FileInfo.hpp new file mode 100644 index 0000000..45cca6a --- /dev/null +++ b/lib/efsw/src/efsw/FileInfo.hpp @@ -0,0 +1,66 @@ +#ifndef EFSW_FILEINFO_HPP +#define EFSW_FILEINFO_HPP + +#include +#include +#include +#include + +namespace efsw { + +class FileInfo +{ + public: + static bool exists( const std::string& filePath ); + + static bool isLink( const std::string& filePath ); + + static bool inodeSupported(); + + FileInfo(); + + FileInfo( const std::string& filepath ); + + FileInfo( const std::string& filepath, bool linkInfo ); + + bool operator==( const FileInfo& Other ) const; + + bool operator!=( const FileInfo& Other ) const; + + FileInfo& operator=( const FileInfo& Other ); + + bool isDirectory(); + + bool isRegularFile(); + + bool isReadable(); + + bool sameInode( const FileInfo& Other ) const; + + bool isLink(); + + std::string linksTo(); + + bool exists(); + + void getInfo(); + + void getRealInfo(); + + std::string Filepath; + Uint64 ModificationTime; + Uint64 Size; + Uint32 OwnerId; + Uint32 GroupId; + Uint32 Permissions; + Uint64 Inode; +}; + +typedef std::map FileInfoMap; +typedef std::list FileInfoList; +typedef std::list< std::pair< std::string, FileInfo> > MovedList; + +} + +#endif + diff --git a/lib/efsw/src/efsw/FileSystem.cpp b/lib/efsw/src/efsw/FileSystem.cpp new file mode 100644 index 0000000..e3afa0b --- /dev/null +++ b/lib/efsw/src/efsw/FileSystem.cpp @@ -0,0 +1,124 @@ +#include +#include + +#if EFSW_OS == EFSW_OS_MACOSX +#include +#endif + +namespace efsw { + +bool FileSystem::isDirectory( const std::string& path ) +{ + return Platform::FileSystem::isDirectory( path ); +} + +FileInfoMap FileSystem::filesInfoFromPath( std::string path ) { + dirAddSlashAtEnd( path ); + + return Platform::FileSystem::filesInfoFromPath( path ); +} + +char FileSystem::getOSSlash() +{ + return Platform::FileSystem::getOSSlash(); +} + +bool FileSystem::slashAtEnd( std::string &dir ) +{ + return ( dir.size() && dir[ dir.size() - 1 ] == getOSSlash() ); +} + +void FileSystem::dirAddSlashAtEnd( std::string& dir ) +{ + if ( dir.size() > 1 && dir[ dir.size() - 1 ] != getOSSlash() ) + { + dir.push_back( getOSSlash() ); + } +} + +void FileSystem::dirRemoveSlashAtEnd( std::string& dir ) +{ + if ( dir.size() > 1 && dir[ dir.size() - 1 ] == getOSSlash() ) + { + dir.erase( dir.size() - 1 ); + } +} + +std::string FileSystem::fileNameFromPath( std::string filepath ) +{ + dirRemoveSlashAtEnd( filepath ); + + size_t pos = filepath.find_last_of( getOSSlash() ); + + if ( pos != std::string::npos ) + { + return filepath.substr( pos + 1 ); + } + + return filepath; +} + +std::string FileSystem::pathRemoveFileName( std::string filepath ) +{ + dirRemoveSlashAtEnd( filepath ); + + size_t pos = filepath.find_last_of( getOSSlash() ); + + if ( pos != std::string::npos ) + { + return filepath.substr( 0, pos + 1 ); + } + + return filepath; +} + +std::string FileSystem::getLinkRealPath( std::string dir, std::string& curPath ) +{ + FileSystem::dirRemoveSlashAtEnd( dir ); + FileInfo fi( dir, true ); + + /// Check with lstat and see if it's a link + if ( fi.isLink() ) + { + /// get the real path of the link + std::string link( fi.linksTo() ); + + /// get the current path of the directory without the link dir path + curPath = FileSystem::pathRemoveFileName( dir ); + + /// ensure that ends with the os directory slash + FileSystem::dirAddSlashAtEnd( link ); + + return link; + } + + /// if it's not a link return nothing + return ""; +} + +std::string FileSystem::precomposeFileName( const std::string& name ) +{ +#if EFSW_OS == EFSW_OS_MACOSX + CFStringRef cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, name.c_str(), kCFStringEncodingUTF8); + CFMutableStringRef cfMutable = CFStringCreateMutableCopy(NULL, 0, cfStringRef); + + CFStringNormalize(cfMutable,kCFStringNormalizationFormC); + + char c_str[255 + 1]; + CFStringGetCString(cfMutable, c_str, sizeof(c_str)-1, kCFStringEncodingUTF8); + + CFRelease(cfStringRef); + CFRelease(cfMutable); + + return std::string(c_str); +#else + return name; +#endif +} + +bool FileSystem::isRemoteFS( const std::string& directory ) +{ + return Platform::FileSystem::isRemoteFS( directory ); +} + +} diff --git a/lib/efsw/src/efsw/FileSystem.hpp b/lib/efsw/src/efsw/FileSystem.hpp new file mode 100644 index 0000000..4e2e1ae --- /dev/null +++ b/lib/efsw/src/efsw/FileSystem.hpp @@ -0,0 +1,40 @@ +#ifndef EFSW_FILESYSTEM_HPP +#define EFSW_FILESYSTEM_HPP + +#include +#include +#include + +namespace efsw { + +class FileSystem +{ + public: + static bool isDirectory( const std::string& path ); + + static FileInfoMap filesInfoFromPath( std::string path ); + + static char getOSSlash(); + + static bool slashAtEnd( std::string& dir ); + + static void dirAddSlashAtEnd( std::string& dir ); + + static void dirRemoveSlashAtEnd( std::string& dir ); + + static std::string fileNameFromPath( std::string filepath ); + + static std::string pathRemoveFileName( std::string filepath ); + + static void realPath( std::string curdir, std::string& path ); + + static std::string getLinkRealPath( std::string dir, std::string& curPath ); + + static std::string precomposeFileName(const std::string& name); + + static bool isRemoteFS( const std::string& directory ); +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/FileWatcher.cpp b/lib/efsw/src/efsw/FileWatcher.cpp new file mode 100644 index 0000000..1ac98f6 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcher.cpp @@ -0,0 +1,145 @@ +#include +#include +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 +# include +# define FILEWATCHER_IMPL FileWatcherWin32 +# define BACKEND_NAME "Win32" +#elif EFSW_PLATFORM == EFSW_PLATFORM_INOTIFY +# include +# define FILEWATCHER_IMPL FileWatcherInotify +# define BACKEND_NAME "Inotify" +#elif EFSW_PLATFORM == EFSW_PLATFORM_KQUEUE +# include +# define FILEWATCHER_IMPL FileWatcherKqueue +# define BACKEND_NAME "Kqueue" +#elif EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS +# include +# define FILEWATCHER_IMPL FileWatcherFSEvents +# define BACKEND_NAME "FSEvents" +#else +# define FILEWATCHER_IMPL FileWatcherGeneric +# define BACKEND_NAME "Generic" +#endif + +#include + +namespace efsw { + +FileWatcher::FileWatcher() : + mFollowSymlinks(false), + mOutOfScopeLinks(false) +{ + efDEBUG( "Using backend: %s\n", BACKEND_NAME ); + + mImpl = new FILEWATCHER_IMPL( this ); + + if ( !mImpl->initOK() ) + { + efSAFE_DELETE( mImpl ); + + efDEBUG( "Falled back to backend: %s\n", BACKEND_NAME ); + + mImpl = new FileWatcherGeneric( this ); + } +} + +FileWatcher::FileWatcher( bool useGenericFileWatcher ) : + mFollowSymlinks(false), + mOutOfScopeLinks(false) +{ + if ( useGenericFileWatcher ) + { + efDEBUG( "Using backend: Generic\n" ); + + mImpl = new FileWatcherGeneric( this ); + } + else + { + efDEBUG( "Using backend: %s\n", BACKEND_NAME ); + + mImpl = new FILEWATCHER_IMPL( this ); + + if ( !mImpl->initOK() ) + { + efSAFE_DELETE( mImpl ); + + efDEBUG( "Falled back to backend: %s\n", BACKEND_NAME ); + + mImpl = new FileWatcherGeneric( this ); + } + } +} + +FileWatcher::~FileWatcher() +{ + efSAFE_DELETE( mImpl ); +} + +WatchID FileWatcher::addWatch(const std::string& directory, FileWatchListener* watcher) +{ + if ( mImpl->mIsGeneric || !FileSystem::isRemoteFS( directory ) ) + { + return mImpl->addWatch(directory, watcher, false); + } + else + { + return Errors::Log::createLastError( Errors::FileRemote, directory ); + } +} + +WatchID FileWatcher::addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive) +{ + if ( mImpl->mIsGeneric || !FileSystem::isRemoteFS( directory ) ) + { + return mImpl->addWatch(directory, watcher, recursive); + } + else + { + return Errors::Log::createLastError( Errors::FileRemote, directory ); + } +} + +void FileWatcher::removeWatch(const std::string& directory) +{ + mImpl->removeWatch(directory); +} + +void FileWatcher::removeWatch(WatchID watchid) +{ + mImpl->removeWatch(watchid); +} + +void FileWatcher::watch() +{ + mImpl->watch(); +} + +std::list FileWatcher::directories() +{ + return mImpl->directories(); +} + +void FileWatcher::followSymlinks( bool follow ) +{ + mFollowSymlinks = follow; +} + +const bool& FileWatcher::followSymlinks() const +{ + return mFollowSymlinks; +} + +void FileWatcher::allowOutOfScopeLinks( bool allow ) +{ + mOutOfScopeLinks = allow; +} + +const bool& FileWatcher::allowOutOfScopeLinks() const +{ + return mOutOfScopeLinks; +} + +} diff --git a/lib/efsw/src/efsw/FileWatcherCWrapper.cpp b/lib/efsw/src/efsw/FileWatcherCWrapper.cpp new file mode 100644 index 0000000..2739e75 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherCWrapper.cpp @@ -0,0 +1,132 @@ +#include +#include +#include + +#define TOBOOL(i) ((i) == 0 ? false : true) + +/*************************************************************************************************/ +class Watcher_CAPI : public efsw::FileWatchListener +{ +public: + efsw_watcher mWatcher; + efsw_pfn_fileaction_callback mFn; + void* mParam; +public: + Watcher_CAPI(efsw_watcher watcher, efsw_pfn_fileaction_callback fn, void* param) + { + mWatcher = watcher; + mFn = fn; + mParam = param; + } + + void handleFileAction(efsw::WatchID watchid, const std::string& dir, const std::string& filename, + efsw::Action action, std::string oldFilename = "") + { + mFn(mWatcher, watchid, dir.c_str(), filename.c_str(), (enum efsw_action)action, + oldFilename.c_str(), mParam ); + } +}; + +/************************************************************************************************* + * globals + */ +static std::vector g_callbacks; + +Watcher_CAPI* find_callback(efsw_watcher watcher, efsw_pfn_fileaction_callback fn) +{ + for (std::vector::iterator i = g_callbacks.begin(); i != g_callbacks.end(); i++ ) + { + Watcher_CAPI* callback = *i; + + if (callback->mFn == fn && callback->mWatcher == watcher) + return *i; + } + + return NULL; +} + +Watcher_CAPI* remove_callback(efsw_watcher watcher) +{ + std::vector::iterator i = g_callbacks.begin(); + + while (i != g_callbacks.end()) { + Watcher_CAPI* callback = *i; + + if (callback->mWatcher == watcher) + i = g_callbacks.erase(i); + else + i++; + } + + return NULL; +} + + +/*************************************************************************************************/ +efsw_watcher efsw_create(int generic_mode) +{ + return (efsw_watcher)new efsw::FileWatcher(TOBOOL(generic_mode)); +} + +void efsw_release(efsw_watcher watcher) +{ + remove_callback(watcher); + delete (efsw::FileWatcher*)watcher; +} + +const char* efsw_getlasterror() +{ + static std::string log_str; + log_str = efsw::Errors::Log::getLastErrorLog(); + return log_str.c_str(); +} + +efsw_watchid efsw_addwatch(efsw_watcher watcher, const char* directory, + efsw_pfn_fileaction_callback callback_fn, int recursive, void * param) +{ + Watcher_CAPI* callback = find_callback(watcher, callback_fn); + + if (callback == NULL) { + callback = new Watcher_CAPI(watcher, callback_fn, param); + g_callbacks.push_back(callback); + } + + return ((efsw::FileWatcher*)watcher)->addWatch(std::string(directory), callback, + TOBOOL(recursive)); +} + +void efsw_removewatch(efsw_watcher watcher, const char* directory) +{ + ((efsw::FileWatcher*)watcher)->removeWatch(std::string(directory)); +} + +void efsw_removewatch_byid(efsw_watcher watcher, efsw_watchid watchid) +{ + ((efsw::FileWatcher*)watcher)->removeWatch(watchid); +} + +void efsw_watch(efsw_watcher watcher) +{ + ((efsw::FileWatcher*)watcher)->watch(); +} + +void efsw_follow_symlinks(efsw_watcher watcher, int enable) +{ + ((efsw::FileWatcher*)watcher)->followSymlinks(TOBOOL(enable)); +} + +int efsw_follow_symlinks_isenabled(efsw_watcher watcher) +{ + return (int)((efsw::FileWatcher*)watcher)->followSymlinks(); +} + +void efsw_allow_outofscopelinks(efsw_watcher watcher, int allow) +{ + ((efsw::FileWatcher*)watcher)->allowOutOfScopeLinks(TOBOOL(allow)); +} + +int efsw_outofscopelinks_isallowed(efsw_watcher watcher) +{ + return (int)((efsw::FileWatcher*)watcher)->allowOutOfScopeLinks(); +} + diff --git a/lib/efsw/src/efsw/FileWatcherFSEvents.cpp b/lib/efsw/src/efsw/FileWatcherFSEvents.cpp new file mode 100644 index 0000000..524b6f1 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherFSEvents.cpp @@ -0,0 +1,270 @@ +#include +#include +#include +#include +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +#include + +namespace efsw +{ + +int getOSXReleaseNumber() +{ + static int osxR = -1; + + if ( -1 == osxR ) + { + struct utsname os; + + if ( -1 != uname( &os ) ) { + std::string release( os.release ); + + size_t pos = release.find_first_of( '.' ); + + if ( pos != std::string::npos ) + { + release = release.substr( 0, pos ); + } + + int rel = 0; + + if ( String::fromString( rel, release ) ) + { + osxR = rel; + } + } + } + + return osxR; +} + +bool FileWatcherFSEvents::isGranular() +{ + return getOSXReleaseNumber() >= 11; +} + +void FileWatcherFSEvents::FSEventCallback( ConstFSEventStreamRef streamRef, + void *userData, + size_t numEvents, + void *eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[] ) +{ + WatcherFSEvents * watcher = static_cast( userData ); + + std::vector events; + events.reserve( numEvents ); + + for ( size_t i = 0; i < numEvents; i++ ) + { + events.push_back( FSEvent( std::string( ((char**)eventPaths)[i] ), (long)eventFlags[i], (Uint64)eventIds[i] ) ); + } + + watcher->handleActions( events ); + + watcher->process(); + + efDEBUG( "\n" ); +} + +FileWatcherFSEvents::FileWatcherFSEvents( FileWatcher * parent ) : + FileWatcherImpl( parent ), + mRunLoopRef( NULL ), + mLastWatchID(0), + mThread( NULL ) +{ + mInitOK = true; + + watch(); +} + +FileWatcherFSEvents::~FileWatcherFSEvents() +{ + mInitOK = false; + + efSAFE_DELETE( mThread ); + + WatchMap::iterator iter = mWatches.begin(); + + for( ; iter != mWatches.end(); ++iter ) + { + WatcherFSEvents * watch = iter->second; + + efSAFE_DELETE( watch ); + } + + mWatches.clear(); +} + +WatchID FileWatcherFSEvents::addWatch( const std::string& directory, FileWatchListener* watcher, bool recursive ) +{ + /// Wait to the RunLoopRef to be ready + while ( NULL == mRunLoopRef ) + { + System::sleep( 1 ); + } + + std::string dir( directory ); + + FileInfo fi( dir ); + + if ( !fi.isDirectory() ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + else if ( !fi.isReadable() ) + { + return Errors::Log::createLastError( Errors::FileNotReadable, dir ); + } + + FileSystem::dirAddSlashAtEnd( dir ); + + if ( pathInWatches( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, directory ); + } + + /// Check if the directory is a symbolic link + std::string curPath; + std::string link( FileSystem::getLinkRealPath( dir, curPath ) ); + + if ( "" != link ) + { + /// If it's a symlink check if the realpath exists as a watcher, or + /// if the path is outside the current dir + if ( pathInWatches( link ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, directory ); + } + else if ( !linkAllowed( curPath, link ) ) + { + return Errors::Log::createLastError( Errors::FileOutOfScope, dir ); + } + else + { + dir = link; + } + } + + mLastWatchID++; + + WatcherFSEvents * pWatch = new WatcherFSEvents(); + pWatch->Listener = watcher; + pWatch->ID = mLastWatchID; + pWatch->Directory = dir; + pWatch->Recursive = recursive; + pWatch->FWatcher = this; + + pWatch->init(); + + Lock lock( mWatchesLock ); + mWatches.insert(std::make_pair(mLastWatchID, pWatch)); + + return pWatch->ID; +} + +void FileWatcherFSEvents::removeWatch(const std::string& directory) +{ + Lock lock( mWatchesLock ); + + WatchMap::iterator iter = mWatches.begin(); + + for(; iter != mWatches.end(); ++iter) + { + if( directory == iter->second->Directory ) + { + removeWatch( iter->second->ID ); + return; + } + } +} + +void FileWatcherFSEvents::removeWatch(WatchID watchid) +{ + Lock lock( mWatchesLock ); + + WatchMap::iterator iter = mWatches.find( watchid ); + + if( iter == mWatches.end() ) + return; + + WatcherFSEvents * watch = iter->second; + + mWatches.erase( iter ); + + efDEBUG( "Removed watch %s\n", watch->Directory.c_str() ); + + efSAFE_DELETE( watch ); +} + +void FileWatcherFSEvents::watch() +{ + if ( NULL == mThread ) + { + mThread = new Thread( &FileWatcherFSEvents::run, this ); + mThread->launch(); + } +} + +void FileWatcherFSEvents::run() +{ + mRunLoopRef = CFRunLoopGetCurrent(); + + while ( mInitOK ) + { + if ( !mNeedInit.empty() ) + { + for ( std::list::iterator it = mNeedInit.begin(); it != mNeedInit.end(); it++ ) + { + (*it)->initAsync(); + } + + mNeedInit.clear(); + } + + CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0.5, kCFRunLoopRunTimedOut ); + } + + CFRunLoopStop( mRunLoopRef ); + mRunLoopRef = NULL; +} + +void FileWatcherFSEvents::handleAction(Watcher* watch, const std::string& filename, unsigned long action, std::string oldFilename) +{ + /// Not used +} + +std::list FileWatcherFSEvents::directories() +{ + std::list dirs; + + Lock lock( mWatchesLock ); + + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + dirs.push_back( std::string( it->second->Directory ) ); + } + + return dirs; +} + +bool FileWatcherFSEvents::pathInWatches( const std::string& path ) +{ + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + if ( it->second->Directory == path ) + { + return true; + } + } + + return false; +} + +} + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherFSEvents.hpp b/lib/efsw/src/efsw/FileWatcherFSEvents.hpp new file mode 100644 index 0000000..6aafbc0 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherFSEvents.hpp @@ -0,0 +1,107 @@ +#ifndef EFSW_FILEWATCHERFSEVENTS_HPP +#define EFSW_FILEWATCHERFSEVENTS_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +#include +#include +#include +#include +#include +#include + +namespace efsw +{ + +/* OSX < 10.7 has no file events */ +/* So i declare the events constants */ +enum FSEventEvents +{ + efswFSEventStreamCreateFlagFileEvents = 0x00000010, + efswFSEventStreamEventFlagItemCreated = 0x00000100, + efswFSEventStreamEventFlagItemRemoved = 0x00000200, + efswFSEventStreamEventFlagItemInodeMetaMod = 0x00000400, + efswFSEventStreamEventFlagItemRenamed = 0x00000800, + efswFSEventStreamEventFlagItemModified = 0x00001000, + efswFSEventStreamEventFlagItemFinderInfoMod = 0x00002000, + efswFSEventStreamEventFlagItemChangeOwner = 0x00004000, + efswFSEventStreamEventFlagItemXattrMod = 0x00008000, + efswFSEventStreamEventFlagItemIsFile = 0x00010000, + efswFSEventStreamEventFlagItemIsDir = 0x00020000, + efswFSEventStreamEventFlagItemIsSymlink = 0x00040000, + efswFSEventsModified = efswFSEventStreamEventFlagItemFinderInfoMod | + efswFSEventStreamEventFlagItemModified | + efswFSEventStreamEventFlagItemInodeMetaMod | + efswFSEventStreamEventFlagItemChangeOwner | + efswFSEventStreamEventFlagItemXattrMod +}; + +/// Implementation for Win32 based on ReadDirectoryChangesW. +/// @class FileWatcherFSEvents +class FileWatcherFSEvents : public FileWatcherImpl +{ + friend class WatcherFSEvents; + public: + /// @return If FSEvents supports file-level notifications ( true if OS X >= 10.7 ) + static bool isGranular(); + + /// type for a map from WatchID to WatcherWin32 pointer + typedef std::map WatchMap; + + FileWatcherFSEvents( FileWatcher * parent ); + + virtual ~FileWatcherFSEvents(); + + /// Add a directory watch + /// On error returns WatchID with Error type. + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive); + + /// Remove a directory watch. This is a brute force lazy search O(nlogn). + void removeWatch(const std::string& directory); + + /// Remove a directory watch. This is a map lookup O(logn). + void removeWatch(WatchID watchid); + + /// Updates the watcher. Must be called often. + void watch(); + + /// Handles the action + void handleAction(Watcher* watch, const std::string& filename, unsigned long action, std::string oldFilename = ""); + + /// @return Returns a list of the directories that are being watched + std::list directories(); + protected: + static void FSEventCallback( ConstFSEventStreamRef streamRef, + void *userData, + size_t numEvents, + void *eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[] + ); + + CFRunLoopRef mRunLoopRef; + + /// Vector of WatcherWin32 pointers + WatchMap mWatches; + + /// The last watchid + WatchID mLastWatchID; + + Thread * mThread; + + Mutex mWatchesLock; + + bool pathInWatches( const std::string& path ); + + std::list mNeedInit; + private: + void run(); +}; + +} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherGeneric.cpp b/lib/efsw/src/efsw/FileWatcherGeneric.cpp new file mode 100644 index 0000000..6a37c02 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherGeneric.cpp @@ -0,0 +1,189 @@ +#include +#include +#include +#include + +namespace efsw +{ + +FileWatcherGeneric::FileWatcherGeneric( FileWatcher * parent ) : + FileWatcherImpl( parent ), + mThread( NULL ), + mLastWatchID( 0 ) +{ + mInitOK = true; + mIsGeneric = true; +} + +FileWatcherGeneric::~FileWatcherGeneric() +{ + mInitOK = false; + + efSAFE_DELETE( mThread ); + + /// Delete the watches + WatchList::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + efSAFE_DELETE( (*it) ); + } +} + +WatchID FileWatcherGeneric::addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive) +{ + std::string dir( directory ); + + FileSystem::dirAddSlashAtEnd( dir ); + + FileInfo fi( dir ); + + if ( !fi.isDirectory() ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + else if ( !fi.isReadable() ) + { + return Errors::Log::createLastError( Errors::FileNotReadable, dir ); + } + else if ( pathInWatches( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, dir ); + } + + std::string curPath; + std::string link( FileSystem::getLinkRealPath( dir, curPath ) ); + + if ( "" != link ) + { + if ( pathInWatches( link ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, dir ); + } + else if ( !linkAllowed( curPath, link ) ) + { + return Errors::Log::createLastError( Errors::FileOutOfScope, dir ); + } + else + { + dir = link; + } + } + + mLastWatchID++; + + WatcherGeneric * pWatch = new WatcherGeneric( mLastWatchID, dir, watcher, this, recursive ); + + Lock lock( mWatchesLock ); + mWatches.push_back(pWatch); + + return pWatch->ID; +} + +void FileWatcherGeneric::removeWatch( const std::string& directory ) +{ + WatchList::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + if ( (*it)->Directory == directory ) + { + WatcherGeneric * watch = (*it); + + Lock lock( mWatchesLock ); + + mWatches.erase( it ); + + efSAFE_DELETE( watch ) ; + + return; + } + } +} + +void FileWatcherGeneric::removeWatch(WatchID watchid) +{ + WatchList::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + if ( (*it)->ID == watchid ) + { + WatcherGeneric * watch = (*it); + + Lock lock( mWatchesLock ); + + mWatches.erase( it ); + + efSAFE_DELETE( watch ) ; + + return; + } + } +} + +void FileWatcherGeneric::watch() +{ + if ( NULL == mThread ) + { + mThread = new Thread( &FileWatcherGeneric::run, this ); + mThread->launch(); + } +} + +void FileWatcherGeneric::run() +{ + do + { + { + Lock lock( mWatchesLock); + + WatchList::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + ( *it )->watch(); + } + } + + if ( mInitOK ) System::sleep( 1000 ); + } while ( mInitOK ); +} + +void FileWatcherGeneric::handleAction(Watcher * watch, const std::string& filename, unsigned long action, std::string oldFilename) +{ + /// Not used +} + +std::list FileWatcherGeneric::directories() +{ + std::list dirs; + + Lock lock( mWatchesLock ); + + WatchList::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + dirs.push_back( (*it)->Directory ); + } + + return dirs; +} + +bool FileWatcherGeneric::pathInWatches( const std::string& path ) +{ + WatchList::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + if ( (*it)->Directory == path || (*it)->pathInWatches( path ) ) + { + return true; + } + } + + return false; +} + +} diff --git a/lib/efsw/src/efsw/FileWatcherGeneric.hpp b/lib/efsw/src/efsw/FileWatcherGeneric.hpp new file mode 100644 index 0000000..fc98265 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherGeneric.hpp @@ -0,0 +1,59 @@ +#ifndef EFSW_FILEWATCHERGENERIC_HPP +#define EFSW_FILEWATCHERGENERIC_HPP + +#include +#include +#include +#include + +namespace efsw +{ + +/// Implementation for Generic File Watcher. +/// @class FileWatcherGeneric +class FileWatcherGeneric : public FileWatcherImpl +{ + public: + typedef std::list WatchList; + + FileWatcherGeneric( FileWatcher * parent ); + + virtual ~FileWatcherGeneric(); + + /// Add a directory watch + /// On error returns WatchID with Error type. + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive); + + /// Remove a directory watch. This is a brute force lazy search O(nlogn). + void removeWatch(const std::string& directory); + + /// Remove a directory watch. This is a map lookup O(logn). + void removeWatch(WatchID watchid); + + /// Updates the watcher. Must be called often. + void watch(); + + /// Handles the action + void handleAction(Watcher * watch, const std::string& filename, unsigned long action, std::string oldFilename = ""); + + /// @return Returns a list of the directories that are being watched + std::list directories(); + protected: + Thread * mThread; + + /// The last watchid + WatchID mLastWatchID; + + /// Map of WatchID to WatchStruct pointers + WatchList mWatches; + + Mutex mWatchesLock; + + bool pathInWatches( const std::string& path ); + private: + void run(); +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherImpl.cpp b/lib/efsw/src/efsw/FileWatcherImpl.cpp new file mode 100644 index 0000000..f999657 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherImpl.cpp @@ -0,0 +1,29 @@ +#include +#include +#include + +namespace efsw { + +FileWatcherImpl::FileWatcherImpl( FileWatcher * parent ) : + mFileWatcher( parent ), + mInitOK( false ), + mIsGeneric( false ) +{ + System::maxFD(); +} + +FileWatcherImpl::~FileWatcherImpl() +{ +} + +bool FileWatcherImpl::initOK() +{ + return mInitOK; +} + +bool FileWatcherImpl::linkAllowed( const std::string& curPath, const std::string& link ) +{ + return ( mFileWatcher->followSymlinks() && mFileWatcher->allowOutOfScopeLinks() ) || -1 != String::strStartsWith( curPath, link ); +} + +} diff --git a/lib/efsw/src/efsw/FileWatcherImpl.hpp b/lib/efsw/src/efsw/FileWatcherImpl.hpp new file mode 100644 index 0000000..1572b76 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherImpl.hpp @@ -0,0 +1,54 @@ +#ifndef EFSW_FILEWATCHERIMPL_HPP +#define EFSW_FILEWATCHERIMPL_HPP + +#include +#include +#include +#include +#include + +namespace efsw { + +class FileWatcherImpl +{ + public: + FileWatcherImpl( FileWatcher * parent ); + + virtual ~FileWatcherImpl(); + + /// Add a directory watch + /// On error returns WatchID with Error type. + virtual WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive) = 0; + + /// Remove a directory watch. This is a brute force lazy search O(nlogn). + virtual void removeWatch(const std::string& directory) = 0; + + /// Remove a directory watch. This is a map lookup O(logn). + virtual void removeWatch(WatchID watchid) = 0; + + /// Updates the watcher. Must be called often. + virtual void watch() = 0; + + /// Handles the action + virtual void handleAction(Watcher * watch, const std::string& filename, unsigned long action, std::string oldFilename = "") = 0; + + /// @return Returns a list of the directories that are being watched + virtual std::list directories() = 0; + + /// @return true if the backend init successfully + virtual bool initOK(); + + /// @return If the link is allowed according to the current path and the state of out scope links + virtual bool linkAllowed( const std::string& curPath, const std::string& link ); + + /// Search if a directory already exists in the watches + virtual bool pathInWatches( const std::string& path ) = 0; + + FileWatcher * mFileWatcher; + bool mInitOK; + bool mIsGeneric; +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherInotify.cpp b/lib/efsw/src/efsw/FileWatcherInotify.cpp new file mode 100644 index 0000000..6c10271 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherInotify.cpp @@ -0,0 +1,525 @@ +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_INOTIFY + +#include +#include +#include +#include +#include +#include + +#ifdef EFSW_INOTIFY_NOSYS +#include +#else +#include +#endif + +#include +#include +#include +#include + +#define BUFF_SIZE ((sizeof(struct inotify_event)+FILENAME_MAX)*1024) + +namespace efsw +{ + +FileWatcherInotify::FileWatcherInotify( FileWatcher * parent ) : + FileWatcherImpl( parent ), + mFD(-1), + mThread(NULL) +{ + mFD = inotify_init(); + + if (mFD < 0) + { + efDEBUG( "Error: %s\n", strerror(errno) ); + } + else + { + mInitOK = true; + } +} + +FileWatcherInotify::~FileWatcherInotify() +{ + mInitOK = false; + + efSAFE_DELETE( mThread ); + + WatchMap::iterator iter = mWatches.begin(); + WatchMap::iterator end = mWatches.end(); + + for(; iter != end; ++iter) + { + efSAFE_DELETE( iter->second ); + } + + mWatches.clear(); + + if ( mFD != -1 ) + { + close(mFD); + mFD = -1; + } +} + +WatchID FileWatcherInotify::addWatch( const std::string& directory, FileWatchListener* watcher, bool recursive ) +{ + return addWatch( directory, watcher, recursive, NULL ); +} + +WatchID FileWatcherInotify::addWatch( const std::string& directory, FileWatchListener* watcher, bool recursive, WatcherInotify * parent ) +{ + std::string dir( directory ); + + FileSystem::dirAddSlashAtEnd( dir ); + + FileInfo fi( dir ); + + if ( !fi.isDirectory() ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + else if ( !fi.isReadable() ) + { + return Errors::Log::createLastError( Errors::FileNotReadable, dir ); + } + else if ( pathInWatches( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, directory ); + } + else if ( NULL != parent && FileSystem::isRemoteFS( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRemote, dir ); + } + + /// Check if the directory is a symbolic link + std::string curPath; + std::string link( FileSystem::getLinkRealPath( dir, curPath ) ); + + if ( "" != link ) + { + /// Avoid adding symlinks directories if it's now enabled + if ( NULL != parent && !mFileWatcher->followSymlinks() ) + { + return Errors::Log::createLastError( Errors::FileOutOfScope, dir ); + } + + /// If it's a symlink check if the realpath exists as a watcher, or + /// if the path is outside the current dir + if ( pathInWatches( link ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, directory ); + } + else if ( !linkAllowed( curPath, link ) ) + { + return Errors::Log::createLastError( Errors::FileOutOfScope, dir ); + } + else + { + dir = link; + } + } + + int wd = inotify_add_watch (mFD, dir.c_str(), IN_CLOSE_WRITE | IN_MOVED_TO | IN_CREATE | IN_MOVED_FROM | IN_DELETE | IN_MODIFY); + + if ( wd < 0 ) + { + if( errno == ENOENT ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + else + { + return Errors::Log::createLastError( Errors::Unspecified, std::string(strerror(errno)) ); + } + } + + efDEBUG( "Added watch %s with id: %d\n", dir.c_str(), wd ); + + WatcherInotify * pWatch = new WatcherInotify(); + pWatch->Listener = watcher; + pWatch->ID = wd; + pWatch->Directory = dir; + pWatch->Recursive = recursive; + pWatch->Parent = parent; + + { + Lock lock( mWatchesLock ); + mWatches.insert(std::make_pair(wd, pWatch)); + } + + if ( NULL == pWatch->Parent ) + { + mRealWatches[ pWatch->ID ] = pWatch; + } + + if ( pWatch->Recursive ) + { + std::map files = FileSystem::filesInfoFromPath( pWatch->Directory ); + std::map::iterator it = files.begin(); + + for ( ; it != files.end(); it++ ) + { + FileInfo fi = it->second; + + if ( fi.isDirectory() && fi.isReadable() ) + { + addWatch( fi.Filepath, watcher, recursive, pWatch ); + } + } + } + + return wd; +} + +void FileWatcherInotify::removeWatchLocked(WatchID watchid) +{ + WatchMap::iterator iter = mWatches.find( watchid ); + + WatcherInotify * watch = iter->second; + + if ( watch->Recursive ) + { + WatchMap::iterator it = mWatches.begin(); + std::list eraseWatches; + + for(; it != mWatches.end(); ++it) + { + if ( it->second != watch && + it->second->inParentTree( watch ) + ) + { + eraseWatches.push_back( it->second->ID ); + } + } + + for ( std::list::iterator eit = eraseWatches.begin(); eit != eraseWatches.end(); eit++ ) + { + removeWatch( *eit ); + } + } + + mWatches.erase( iter ); + + if ( NULL == watch->Parent ) + { + WatchMap::iterator eraseit = mRealWatches.find( watch->ID ); + + if ( eraseit != mRealWatches.end() ) + { + mRealWatches.erase( eraseit ); + } + } + + int err = inotify_rm_watch(mFD, watchid); + + if ( err < 0 ) + { + efDEBUG( "Error removing watch %d: %s\n", watchid, strerror(errno) ); + } + else + { + efDEBUG( "Removed watch %s with id: %d\n", watch->Directory.c_str(), watchid ); + } + + efSAFE_DELETE( watch ); +} + +void FileWatcherInotify::removeWatch(const std::string& directory) +{ + Lock lock( mWatchesLock ); + + WatchMap::iterator iter = mWatches.begin(); + + for(; iter != mWatches.end(); ++iter) + { + if( directory == iter->second->Directory ) + { + WatcherInotify * watch = iter->second; + + if ( watch->Recursive ) + { + WatchMap::iterator it = mWatches.begin(); + std::list eraseWatches; + + for(; it != mWatches.end(); ++it) + { + if ( it->second->inParentTree( watch ) ) + { + eraseWatches.push_back( it->second->ID ); + } + } + + for ( std::list::iterator eit = eraseWatches.begin(); eit != eraseWatches.end(); eit++ ) + { + removeWatchLocked( *eit ); + } + } + + mWatches.erase( iter ); + + if ( NULL == watch->Parent ) + { + WatchMap::iterator eraseit = mRealWatches.find( watch->ID ); + + if ( eraseit != mRealWatches.end() ) + { + mRealWatches.erase( eraseit ); + } + } + + int err = inotify_rm_watch(mFD, watch->ID); + + if ( err < 0 ) + { + efDEBUG( "Error removing watch %d: %s\n", watch->ID, strerror(errno) ); + } + else + { + efDEBUG( "Removed watch %s with id: %d\n", watch->Directory.c_str(), watch->ID ); + } + + efSAFE_DELETE( watch ); + + break; + } + } +} + +void FileWatcherInotify::removeWatch( WatchID watchid ) +{ + Lock lock( mWatchesLock ); + + WatchMap::iterator iter = mWatches.find( watchid ); + + if( iter == mWatches.end() ) + { + return; + } + + removeWatchLocked( watchid ); +} + +void FileWatcherInotify::watch() +{ + if ( NULL == mThread ) + { + mThread = new Thread( &FileWatcherInotify::run, this ); + mThread->launch(); + } +} + +void FileWatcherInotify::run() +{ + static char buff[BUFF_SIZE] = {0}; + WatchMap::iterator wit; + std::list movedOutsideWatches; + + do + { + fd_set rfds; + FD_ZERO (&rfds); + FD_SET (mFD, &rfds); + timeval timeout; + timeout.tv_sec=0; + timeout.tv_usec=100000; + + if( select (FD_SETSIZE, &rfds, NULL, NULL, &timeout) > 0 ) + { + ssize_t len, i = 0; + + len = read (mFD, buff, BUFF_SIZE); + + if (len != -1) + { + while (i < len) + { + struct inotify_event *pevent = (struct inotify_event *)&buff[i]; + + { + Lock lock( mWatchesLock ); + + wit = mWatches.find( pevent->wd ); + + if ( wit != mWatches.end() ) + { + handleAction(wit->second, pevent->name, pevent->mask); + + /// Keep track of the IN_MOVED_FROM events to known if the IN_MOVED_TO event is also fired + if ( !wit->second->OldFileName.empty() ) + { + movedOutsideWatches.push_back( wit->second ); + } + } + } + + i += sizeof(struct inotify_event) + pevent->len; + } + + if ( !movedOutsideWatches.empty() ) + { + /// In case that the IN_MOVED_TO is never fired means that the file was moved to other folder + for ( std::list::iterator it = movedOutsideWatches.begin(); it != movedOutsideWatches.end(); it++ ) + { + if ( !(*it)->OldFileName.empty() ) + { + /// So we send a IN_DELETE event for files that where moved outside of our scope + handleAction( *it, (*it)->OldFileName, IN_DELETE ); + + /// Remove the OldFileName + (*it)->OldFileName = ""; + } + } + + movedOutsideWatches.clear(); + } + } + } + } while( mInitOK ); +} + +void FileWatcherInotify::checkForNewWatcher( Watcher* watch, std::string fpath ) +{ + FileSystem::dirAddSlashAtEnd( fpath ); + + /// If the watcher is recursive, checks if the new file is a folder, and creates a watcher + if ( watch->Recursive && FileSystem::isDirectory( fpath ) ) + { + bool found = false; + + /// First check if exists + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + if ( it->second->Directory == fpath ) + { + found = true; + break; + } + } + + if ( !found ) + { + addWatch( fpath, watch->Listener, watch->Recursive, static_cast( watch ) ); + } + } +} + +void FileWatcherInotify::handleAction( Watcher* watch, const std::string& filename, unsigned long action, std::string oldFilename ) +{ + if ( !watch || !watch->Listener ) + { + return; + } + + std::string fpath( watch->Directory + filename ); + + if ( ( IN_CLOSE_WRITE & action ) || ( IN_MODIFY & action ) ) + { + watch->Listener->handleFileAction( watch->ID, watch->Directory, filename, Actions::Modified ); + } + else if( IN_MOVED_TO & action ) + { + /// If OldFileName doesn't exist means that the file has been moved from other folder, so we just send the Add event + if ( watch->OldFileName.empty() ) + { + watch->Listener->handleFileAction( watch->ID, watch->Directory, filename, Actions::Add ); + + watch->Listener->handleFileAction( watch->ID, watch->Directory, filename, Actions::Modified ); + + checkForNewWatcher( watch, fpath ); + } + else + { + watch->Listener->handleFileAction( watch->ID, watch->Directory, filename, Actions::Moved, watch->OldFileName ); + } + + if ( watch->Recursive && FileSystem::isDirectory( fpath ) ) + { + /// Update the new directory path + std::string opath( watch->Directory + watch->OldFileName ); + FileSystem::dirAddSlashAtEnd( opath ); + FileSystem::dirAddSlashAtEnd( fpath ); + + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + if ( it->second->Directory == opath && it->second->DirInfo.Inode == FileInfo( opath ).Inode ) + { + it->second->Directory = fpath; + it->second->DirInfo = FileInfo( fpath ); + + break; + } + } + } + + watch->OldFileName = ""; + } + else if( IN_CREATE & action ) + { + watch->Listener->handleFileAction( watch->ID, watch->Directory, filename, Actions::Add ); + + checkForNewWatcher( watch, fpath ); + } + else if ( IN_MOVED_FROM & action ) + { + watch->OldFileName = filename; + } + else if( IN_DELETE & action ) + { + watch->Listener->handleFileAction( watch->ID, watch->Directory, filename, Actions::Delete ); + + FileSystem::dirAddSlashAtEnd( fpath ); + + /// If the file erased is a directory and recursive is enabled, removes the directory erased + if ( watch->Recursive ) + { + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + if ( it->second->Directory == fpath ) + { + removeWatch( it->second->ID ); + break; + } + } + } + } +} + +std::list FileWatcherInotify::directories() +{ + std::list dirs; + + Lock lock( mWatchesLock ); + + WatchMap::iterator it = mRealWatches.begin(); + + for ( ; it != mRealWatches.end(); it++ ) + { + dirs.push_back( it->second->Directory ); + } + + return dirs; +} + +bool FileWatcherInotify::pathInWatches( const std::string& path ) +{ + /// Search in the real watches, since it must allow adding a watch already watched as a subdir + WatchMap::iterator it = mRealWatches.begin(); + + for ( ; it != mRealWatches.end(); it++ ) + { + if ( it->second->Directory == path ) + { + return true; + } + } + + return false; +} + +} + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherInotify.hpp b/lib/efsw/src/efsw/FileWatcherInotify.hpp new file mode 100644 index 0000000..43ee9ca --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherInotify.hpp @@ -0,0 +1,73 @@ +#ifndef EFSW_FILEWATCHERLINUX_HPP +#define EFSW_FILEWATCHERLINUX_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_INOTIFY + +#include +#include + +namespace efsw +{ + +/// Implementation for Linux based on inotify. +/// @class FileWatcherInotify +class FileWatcherInotify : public FileWatcherImpl +{ + public: + /// type for a map from WatchID to WatchStruct pointer + typedef std::map WatchMap; + + FileWatcherInotify( FileWatcher * parent ); + + virtual ~FileWatcherInotify(); + + /// Add a directory watch + /// On error returns WatchID with Error type. + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive); + + /// Remove a directory watch. This is a brute force lazy search O(nlogn). + void removeWatch(const std::string& directory); + + /// Remove a directory watch. This is a map lookup O(logn). + void removeWatch(WatchID watchid); + + /// Updates the watcher. Must be called often. + void watch(); + + /// Handles the action + void handleAction(Watcher * watch, const std::string& filename, unsigned long action, std::string oldFilename = ""); + + /// @return Returns a list of the directories that are being watched + std::list directories(); + protected: + /// Map of WatchID to WatchStruct pointers + WatchMap mWatches; + + /// User added watches + WatchMap mRealWatches; + + /// inotify file descriptor + int mFD; + + Thread * mThread; + + Mutex mWatchesLock; + + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive, WatcherInotify * parent = NULL ); + + bool pathInWatches( const std::string& path ); + private: + void run(); + + void removeWatchLocked(WatchID watchid); + + void checkForNewWatcher( Watcher* watch, std::string fpath ); +}; + +} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherKqueue.cpp b/lib/efsw/src/efsw/FileWatcherKqueue.cpp new file mode 100644 index 0000000..d8a76b8 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherKqueue.cpp @@ -0,0 +1,266 @@ +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_KQUEUE || EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace efsw +{ + +FileWatcherKqueue::FileWatcherKqueue( FileWatcher * parent ) : + FileWatcherImpl( parent ), + mLastWatchID(0), + mThread( NULL ), + mFileDescriptorCount( 1 ), + mAddingWatcher( false ) +{ + mTimeOut.tv_sec = 0; + mTimeOut.tv_nsec = 0; + mInitOK = true; +} + +FileWatcherKqueue::~FileWatcherKqueue() +{ + WatchMap::iterator iter = mWatches.begin(); + + for(; iter != mWatches.end(); ++iter) + { + efSAFE_DELETE( iter->second ); + } + + mWatches.clear(); + + mInitOK = false; + + efSAFE_DELETE( mThread ); +} + +WatchID FileWatcherKqueue::addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive) +{ + static bool s_ug = false; + + std::string dir( directory ); + + FileSystem::dirAddSlashAtEnd( dir ); + + FileInfo fi( dir ); + + if ( !fi.isDirectory() ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + else if ( !fi.isReadable() ) + { + return Errors::Log::createLastError( Errors::FileNotReadable, dir ); + } + else if ( pathInWatches( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, directory ); + } + + std::string curPath; + std::string link( FileSystem::getLinkRealPath( dir, curPath ) ); + + if ( "" != link ) + { + if ( pathInWatches( link ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, directory ); + } + else if ( !linkAllowed( curPath, link ) ) + { + return Errors::Log::createLastError( Errors::FileOutOfScope, dir ); + } + else + { + dir = link; + } + } + + /// Check first if are enough file descriptors available to create another kqueue watcher, otherwise it creates a generic watcher + if ( availablesFD() ) + { + mAddingWatcher = true; + + WatcherKqueue * watch = new WatcherKqueue( ++mLastWatchID, dir, watcher, recursive, this ); + + { + Lock lock( mWatchesLock ); + mWatches.insert(std::make_pair(mLastWatchID, watch)); + } + + watch->addAll(); + + // if failed to open the directory... erase the watcher + if ( !watch->initOK() ) + { + int le = watch->lastErrno(); + + mWatches.erase( watch->ID ); + + efSAFE_DELETE( watch ); + + mLastWatchID--; + + // Probably the folder has too many files, create a generic watcher + if ( EACCES != le ) + { + WatcherGeneric * watch = new WatcherGeneric( ++mLastWatchID, dir, watcher, this, recursive ); + + Lock lock( mWatchesLock ); + mWatches.insert(std::make_pair(mLastWatchID, watch)); + } + else + { + return Errors::Log::createLastError( Errors::Unspecified, link ); + } + } + + mAddingWatcher = false; + } + else + { + if ( !s_ug ) + { + efDEBUG( "Started using generic watcher, file descriptor limit reached: %ld\n", mFileDescriptorCount ); + s_ug = true; + } + + WatcherGeneric * watch = new WatcherGeneric( ++mLastWatchID, dir, watcher, this, recursive ); + + Lock lock( mWatchesLock ); + mWatches.insert(std::make_pair(mLastWatchID, watch)); + } + + return mLastWatchID; +} + +void FileWatcherKqueue::removeWatch(const std::string& directory) +{ + Lock lock( mWatchesLock ); + + WatchMap::iterator iter = mWatches.begin(); + + for(; iter != mWatches.end(); ++iter) + { + if(directory == iter->second->Directory) + { + removeWatch(iter->first); + return; + } + } +} + +void FileWatcherKqueue::removeWatch(WatchID watchid) +{ + Lock lock( mWatchesLock ); + + WatchMap::iterator iter = mWatches.find(watchid); + + if(iter == mWatches.end()) + return; + + Watcher* watch = iter->second; + + mWatches.erase(iter); + + efSAFE_DELETE( watch ); +} + +bool FileWatcherKqueue::isAddingWatcher() const +{ + return mAddingWatcher; +} + +void FileWatcherKqueue::watch() +{ + if ( NULL == mThread ) + { + mThread = new Thread( &FileWatcherKqueue::run, this ); + mThread->launch(); + } +} + +void FileWatcherKqueue::run() +{ + do + { + { + Lock lock( mWatchesLock ); + + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); ++it ) + { + it->second->watch(); + } + } + + System::sleep( 500 ); + } while( mInitOK ); +} + +void FileWatcherKqueue::handleAction(Watcher* watch, const std::string& filename, unsigned long action, std::string oldFilename) +{ +} + +std::list FileWatcherKqueue::directories() +{ + std::list dirs; + + Lock lock( mWatchesLock ); + + WatchMap::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + dirs.push_back( it->second->Directory ); + } + + return dirs; +} + +bool FileWatcherKqueue::pathInWatches( const std::string& path ) +{ + WatchMap::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + if ( it->second->Directory == path ) + { + return true; + } + } + + return false; +} + +void FileWatcherKqueue::addFD() +{ + mFileDescriptorCount++; +} + +void FileWatcherKqueue::removeFD() +{ + mFileDescriptorCount--; +} + +bool FileWatcherKqueue::availablesFD() +{ + return mFileDescriptorCount <= (Int64)System::getMaxFD() - 500; +} + +} + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherKqueue.hpp b/lib/efsw/src/efsw/FileWatcherKqueue.hpp new file mode 100644 index 0000000..0a2431e --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherKqueue.hpp @@ -0,0 +1,78 @@ +#ifndef EFSW_FILEWATCHEROSX_HPP +#define EFSW_FILEWATCHEROSX_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_KQUEUE || EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +#include + +namespace efsw +{ + +/// Implementation for OSX based on kqueue. +/// @class FileWatcherKqueue +class FileWatcherKqueue : public FileWatcherImpl +{ + friend class WatcherKqueue; + public: + FileWatcherKqueue( FileWatcher * parent ); + + virtual ~FileWatcherKqueue(); + + /// Add a directory watch + /// On error returns WatchID with Error type. + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive); + + /// Remove a directory watch. This is a brute force lazy search O(nlogn). + void removeWatch(const std::string& directory); + + /// Remove a directory watch. This is a map lookup O(logn). + void removeWatch(WatchID watchid); + + /// Updates the watcher. Must be called often. + void watch(); + + /// Handles the action + void handleAction(Watcher* watch, const std::string& filename, unsigned long action, std::string oldFilename = ""); + + /// @return Returns a list of the directories that are being watched + std::list directories(); + protected: + /// Map of WatchID to WatchStruct pointers + WatchMap mWatches; + + /// time out data + struct timespec mTimeOut; + + /// WatchID allocator + int mLastWatchID; + + Thread * mThread; + + Mutex mWatchesLock; + + std::list mRemoveList; + + long mFileDescriptorCount; + + bool mAddingWatcher; + + bool isAddingWatcher() const; + + bool pathInWatches( const std::string& path ); + + void addFD(); + + void removeFD(); + + bool availablesFD(); + private: + void run(); +}; + +} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherWin32.cpp b/lib/efsw/src/efsw/FileWatcherWin32.cpp new file mode 100644 index 0000000..5dcd8a0 --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherWin32.cpp @@ -0,0 +1,313 @@ +#include +#include +#include +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +namespace efsw +{ + +FileWatcherWin32::FileWatcherWin32( FileWatcher * parent ) : + FileWatcherImpl( parent ), + mLastWatchID(0), + mThread( NULL ) +{ + mInitOK = true; +} + +FileWatcherWin32::~FileWatcherWin32() +{ + mInitOK = false; + efSAFE_DELETE( mThread ); + removeAllWatches(); +} + +WatchID FileWatcherWin32::addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive) +{ + std::string dir( directory ); + + FileInfo fi( dir ); + + if ( !fi.isDirectory() ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + else if ( !fi.isReadable() ) + { + return Errors::Log::createLastError( Errors::FileNotReadable, dir ); + } + + FileSystem::dirAddSlashAtEnd( dir ); + + Lock lock( mWatchesLock ); + + if ( pathInWatches( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, dir ); + } + + WatchID watchid = ++mLastWatchID; + + WatcherStructWin32 * watch = CreateWatch( String::fromUtf8( dir ).toWideString().c_str(), recursive, FILE_NOTIFY_CHANGE_CREATION | + FILE_NOTIFY_CHANGE_LAST_WRITE | + FILE_NOTIFY_CHANGE_FILE_NAME | + FILE_NOTIFY_CHANGE_DIR_NAME | + FILE_NOTIFY_CHANGE_SIZE + ); + + if( NULL == watch ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + + // Add the handle to the handles vector + watch->Watch->ID = watchid; + watch->Watch->Watch = this; + watch->Watch->Listener = watcher; + watch->Watch->DirName = new char[dir.length()+1]; + strcpy(watch->Watch->DirName, dir.c_str()); + + mWatchesNew.insert( watch ); + mWatches.insert( watch ); + + return watchid; +} + +void FileWatcherWin32::removeWatch(const std::string& directory) +{ + Lock lock( mWatchesLock ); + + Watches::iterator iter = mWatches.begin(); + + for(; iter != mWatches.end(); ++iter) + { + if(directory == (*iter)->Watch->DirName) + { + removeWatch(*iter); + break; + } + } +} + +void FileWatcherWin32::removeWatch(WatchID watchid) +{ + Lock lock( mWatchesLock ); + + Watches::iterator iter = mWatches.begin(); + + for(; iter != mWatches.end(); ++iter) + { + // Find the watch ID + if ( (*iter)->Watch->ID == watchid ) + { + removeWatch(*iter); + return; + } + } +} + +void FileWatcherWin32::removeWatch(WatcherStructWin32* watch) +{ + mWatchesRemoved.insert(watch); + + if( NULL == mThread ) + { + removeWatches(); + } +} + +void FileWatcherWin32::removeWatches() +{ + Lock lock( mWatchesLock ); + + Watches::iterator remWatchIter = mWatchesRemoved.begin(); + + for( ; remWatchIter != mWatchesRemoved.end(); ++remWatchIter ) + { + Watches::iterator iter = mWatches.find(*remWatchIter); + + if( iter != mWatches.end() ) + { + DestroyWatch(*iter); + + mWatches.erase( iter ); + } + + iter = mWatchesNew.find(*remWatchIter); + + if( iter != mWatchesNew.end() ) + { + mWatchesNew.erase( iter ); + } + } + + mWatchesRemoved.clear(); +} + +void FileWatcherWin32::watch() +{ + if ( NULL == mThread ) + { + mThread = new Thread( &FileWatcherWin32::run, this ); + mThread->launch(); + } +} + +void FileWatcherWin32::removeAllWatches() +{ + Lock lock( mWatchesLock ); + + Watches::iterator iter = mWatches.begin(); + + for( ; iter != mWatches.end(); ++iter ) + { + DestroyWatch((*iter)); + } + + mWatches.clear(); + mWatchesRemoved.clear(); + mWatchesNew.clear(); +} + +void FileWatcherWin32::run() +{ + do + { + if ( !mWatches.empty() ) + { + { + Lock lock( mWatchesLock ); + + for( Watches::iterator iter = mWatches.begin() ; iter != mWatches.end(); ++iter ) + { + WatcherStructWin32 * watch = *iter; + + if ( HasOverlappedIoCompleted( &watch->Overlapped ) ) + { + DWORD bytes; + + if ( GetOverlappedResult( watch->Watch->DirHandle, &watch->Overlapped, &bytes, FALSE ) ) + { + WatchCallback( ERROR_SUCCESS, bytes, &watch->Overlapped ); + } + } + } + } + + if ( mInitOK ) + { + System::sleep( 10 ); + } + } + else + { + // Wait for a new handle to be added + System::sleep( 10 ); + } + + removeWatches(); + + for ( Watches::iterator it = mWatchesNew.begin(); it != mWatchesNew.end(); it++ ) + { + RefreshWatch(*it); + } + + mWatchesNew.clear(); + } while ( mInitOK ); + + removeAllWatches(); +} + +void FileWatcherWin32::handleAction(Watcher* watch, const std::string& filename, unsigned long action, std::string oldFilename) +{ + Action fwAction; + + switch(action) + { + case FILE_ACTION_RENAMED_OLD_NAME: + watch->OldFileName = filename; + return; + case FILE_ACTION_ADDED: + fwAction = Actions::Add; + break; + case FILE_ACTION_RENAMED_NEW_NAME: + { + fwAction = Actions::Moved; + + std::string fpath( watch->Directory + filename ); + + // Update the directory path + if ( watch->Recursive && FileSystem::isDirectory( fpath ) ) + { + // Update the new directory path + std::string opath( watch->Directory + watch->OldFileName ); + FileSystem::dirAddSlashAtEnd( opath ); + FileSystem::dirAddSlashAtEnd( fpath ); + + for ( Watches::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + if ( (*it)->Watch->Directory == opath ) + { + (*it)->Watch->Directory = fpath; + + break; + } + } + } + + watch->Listener->handleFileAction(watch->ID, static_cast( watch )->DirName, filename, fwAction, watch->OldFileName); + return; + } + case FILE_ACTION_REMOVED: + fwAction = Actions::Delete; + break; + case FILE_ACTION_MODIFIED: + fwAction = Actions::Modified; + break; + }; + + std::string folderPath( static_cast( watch )->DirName ); + std::string realFilename = filename; + std::size_t sepPos = filename.find_last_of("/\\"); + + if ( sepPos != std::string::npos ) + { + folderPath += filename.substr( 0, sepPos ); + realFilename = filename.substr( sepPos + 1 ); + } + + watch->Listener->handleFileAction(watch->ID, folderPath, realFilename, fwAction); +} + +std::list FileWatcherWin32::directories() +{ + std::list dirs; + + Lock lock( mWatchesLock ); + + for ( Watches::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + dirs.push_back( std::string( (*it)->Watch->DirName ) ); + } + + return dirs; +} + +bool FileWatcherWin32::pathInWatches( const std::string& path ) +{ + for ( Watches::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + if ( (*it)->Watch->DirName == path ) + { + return true; + } + } + + return false; +} + +} + +#endif diff --git a/lib/efsw/src/efsw/FileWatcherWin32.hpp b/lib/efsw/src/efsw/FileWatcherWin32.hpp new file mode 100644 index 0000000..4a80cab --- /dev/null +++ b/lib/efsw/src/efsw/FileWatcherWin32.hpp @@ -0,0 +1,74 @@ +#ifndef EFSW_FILEWATCHERWIN32_HPP +#define EFSW_FILEWATCHERWIN32_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +#include +#include +#include + +namespace efsw +{ + +/// Implementation for Win32 based on ReadDirectoryChangesW. +/// @class FileWatcherWin32 +class FileWatcherWin32 : public FileWatcherImpl +{ + public: + /// type for a map from WatchID to WatcherWin32 pointer + typedef std::set Watches; + + FileWatcherWin32( FileWatcher * parent ); + + virtual ~FileWatcherWin32(); + + /// Add a directory watch + /// On error returns WatchID with Error type. + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive); + + /// Remove a directory watch. This is a brute force lazy search O(nlogn). + void removeWatch(const std::string& directory); + + /// Remove a directory watch. This is a map lookup O(logn). + void removeWatch(WatchID watchid); + + /// Updates the watcher. Must be called often. + void watch(); + + /// Handles the action + void handleAction(Watcher* watch, const std::string& filename, unsigned long action, std::string oldFilename = ""); + + /// @return Returns a list of the directories that are being watched + std::list directories(); + protected: + Watches mWatches; + Watches mWatchesRemoved; + Watches mWatchesNew; + + /// The last watchid + WatchID mLastWatchID; + + Thread * mThread; + + Mutex mWatchesLock; + + bool pathInWatches( const std::string& path ); + + /// Remove all directory watches. + void removeAllWatches(); + + /// Remove needed directory watches. + void removeWatches(); + + void removeWatch(WatcherStructWin32* watch); + private: + void run(); +}; + +} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/Lock.hpp b/lib/efsw/src/efsw/Lock.hpp new file mode 100644 index 0000000..5dbf11e --- /dev/null +++ b/lib/efsw/src/efsw/Lock.hpp @@ -0,0 +1,27 @@ +#ifndef EFSW_LOCK_HPP +#define EFSW_LOCK_HPP + +#include + +namespace efsw { + +/** Simple mutex class */ +class Lock { + public: + explicit Lock( Mutex& mutex ) : + mMutex( mutex ) + { + mMutex.lock(); + } + + ~Lock() + { + mMutex.unlock(); + } + private: + Mutex& mMutex; +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/Log.cpp b/lib/efsw/src/efsw/Log.cpp new file mode 100644 index 0000000..8e2860a --- /dev/null +++ b/lib/efsw/src/efsw/Log.cpp @@ -0,0 +1,27 @@ +#include + +namespace efsw { namespace Errors { + +static std::string LastError; + +std::string Log::getLastErrorLog() +{ + return LastError; +} + +Error Log::createLastError( Error err, std::string log ) +{ + switch ( err ) + { + case FileNotFound: LastError = "File not found ( " + log + " )"; break; + case FileRepeated: LastError = "File reapeated in watches ( " + log + " )"; break; + case FileOutOfScope: LastError = "Symlink file out of scope ( " + log + " )"; break; + case FileRemote: LastError = "File is located in a remote file system, use a generic watcher. ( " + log + " )"; break; + case Unspecified: + default: LastError = log; + } + + return err; +} + +}} diff --git a/lib/efsw/src/efsw/Mutex.cpp b/lib/efsw/src/efsw/Mutex.cpp new file mode 100644 index 0000000..b34ba06 --- /dev/null +++ b/lib/efsw/src/efsw/Mutex.cpp @@ -0,0 +1,26 @@ +#include +#include + +namespace efsw { + +Mutex::Mutex() : + mMutexImpl( new Platform::MutexImpl() ) +{ +} + +Mutex::~Mutex() +{ + efSAFE_DELETE( mMutexImpl ); +} + +void Mutex::lock() +{ + mMutexImpl->lock(); +} + +void Mutex::unlock() +{ + mMutexImpl->unlock(); +} + +} diff --git a/lib/efsw/src/efsw/Mutex.hpp b/lib/efsw/src/efsw/Mutex.hpp new file mode 100644 index 0000000..e6e89de --- /dev/null +++ b/lib/efsw/src/efsw/Mutex.hpp @@ -0,0 +1,28 @@ +#ifndef EFSW_MUTEX_HPP +#define EFSW_MUTEX_HPP + +#include + +namespace efsw { + +namespace Platform { class MutexImpl; } + +/** Simple mutex class */ +class Mutex { + public: + Mutex(); + + ~Mutex(); + + /** Lock the mutex */ + void lock(); + + /** Unlock the mutex */ + void unlock(); + private: + Platform::MutexImpl * mMutexImpl; +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/String.cpp b/lib/efsw/src/efsw/String.cpp new file mode 100644 index 0000000..f703d25 --- /dev/null +++ b/lib/efsw/src/efsw/String.cpp @@ -0,0 +1,813 @@ +#include +#include +#include + +namespace efsw { + +const std::size_t String::InvalidPos = StringType::npos; + +std::vector < std::string > String::split ( const std::string& str, const char& splitchar, const bool& pushEmptyString ) +{ + std::vector < std::string > tmp; + std::string tmpstr; + + for ( size_t i = 0; i < str.size(); i++ ) + { + if ( str[i] == splitchar ) + { + if ( pushEmptyString || tmpstr.size() ) + { + tmp.push_back(tmpstr); + tmpstr = ""; + } + } + else + { + tmpstr += str[i]; + } + } + + if ( tmpstr.size() ) + { + tmp.push_back( tmpstr ); + } + + return tmp; +} + +std::vector < String > String::split ( const String& str, const Uint32& splitchar, const bool& pushEmptyString ) +{ + std::vector < String > tmp; + String tmpstr; + + for ( size_t i = 0; i < str.size(); i++ ) + { + if ( str[i] == splitchar ) + { + if ( pushEmptyString || tmpstr.size() ) + { + tmp.push_back(tmpstr); + tmpstr = ""; + } + } + else + { + tmpstr += str[i]; + } + } + + if ( tmpstr.size() ) + { + tmp.push_back( tmpstr ); + } + + return tmp; +} + +int String::strStartsWith( const std::string& start, const std::string& str ) +{ + int pos = -1; + size_t size = start.size(); + + if ( str.size() >= size ) + { + for ( std::size_t i = 0; i < size; i++ ) + { + if ( start[i] == str[i] ) + { + pos = (int)i; + } + else + { + pos = -1; + break; + } + } + } + + return pos; +} + +int String::strStartsWith( const String& start, const String& str ) +{ + int pos = -1; + size_t size = start.size(); + + if ( str.size() >= size ) + { + for ( std::size_t i = 0; i < size; i++ ) + { + if ( start[i] == str[i] ) + { + pos = (int)i; + } + else + { + pos = -1; + break; + } + } + } + + return pos; +} + +String::String() +{ +} + +String::String(char ansiChar, const std::locale& locale) +{ + mString += Utf32::DecodeAnsi(ansiChar, locale); +} + +#ifndef EFSW_NO_WIDECHAR +String::String(wchar_t wideChar) +{ + mString += Utf32::DecodeWide(wideChar); +} +#endif + +String::String(StringBaseType utf32Char) +{ + mString += utf32Char; +} + +String::String( const char* uf8String ) { + if (uf8String) + { + std::size_t length = strlen(uf8String); + + if (length > 0) + { + mString.reserve(length + 1); + + Utf8::ToUtf32(uf8String, uf8String + length, std::back_inserter(mString)); + } + } +} + +String::String( const std::string& utf8String ) { + mString.reserve( utf8String.length() + 1 ); + + Utf8::ToUtf32( utf8String.begin(), utf8String.end(), std::back_inserter( mString ) ); +} + +String::String(const char* ansiString, const std::locale& locale) +{ + if (ansiString) + { + std::size_t length = strlen(ansiString); + if (length > 0) + { + mString.reserve(length + 1); + Utf32::FromAnsi(ansiString, ansiString + length, std::back_inserter(mString), locale); + } + } +} + +String::String(const std::string& ansiString, const std::locale& locale) +{ + mString.reserve(ansiString.length() + 1); + Utf32::FromAnsi(ansiString.begin(), ansiString.end(), std::back_inserter(mString), locale); +} + +#ifndef EFSW_NO_WIDECHAR +String::String(const wchar_t* wideString) +{ + if (wideString) + { + std::size_t length = std::wcslen(wideString); + if (length > 0) + { + mString.reserve(length + 1); + Utf32::FromWide(wideString, wideString + length, std::back_inserter(mString)); + } + } +} + +String::String(const std::wstring& wideString) +{ + mString.reserve(wideString.length() + 1); + Utf32::FromWide(wideString.begin(), wideString.end(), std::back_inserter(mString)); +} +#endif + +String::String(const StringBaseType* utf32String) +{ + if (utf32String) + mString = utf32String; +} + +String::String(const StringType& utf32String) : +mString(utf32String) +{ +} + +String::String(const String& str) : +mString(str.mString) +{ +} + +String String::fromUtf8( const std::string& utf8String ) +{ + String::StringType utf32; + + utf32.reserve( utf8String.length() + 1 ); + + Utf8::ToUtf32( utf8String.begin(), utf8String.end(), std::back_inserter( utf32 ) ); + + return String( utf32 ); +} + +String::operator std::string() const +{ + return toAnsiString(); +} + +std::string String::toAnsiString(const std::locale& locale) const +{ + // Prepare the output string + std::string output; + output.reserve(mString.length() + 1); + + // Convert + Utf32::ToAnsi(mString.begin(), mString.end(), std::back_inserter(output), 0, locale); + + return output; +} + +#ifndef EFSW_NO_WIDECHAR +std::wstring String::toWideString() const +{ + // Prepare the output string + std::wstring output; + output.reserve(mString.length() + 1); + + // Convert + Utf32::ToWide(mString.begin(), mString.end(), std::back_inserter(output), 0); + + return output; +} +#endif + +std::string String::toUtf8() const { + // Prepare the output string + std::string output; + output.reserve(mString.length() + 1); + + // Convert + Utf32::toUtf8(mString.begin(), mString.end(), std::back_inserter(output) ); + + return output; +} + +String& String::operator =(const String& right) +{ + mString = right.mString; + return *this; +} + +String& String::operator =( const StringBaseType& right ) +{ + mString = right; + return *this; +} + +String& String::operator +=(const String& right) +{ + mString += right.mString; + return *this; +} + +String& String::operator +=( const StringBaseType& right ) +{ + mString += right; + return *this; +} + + +String::StringBaseType String::operator [](std::size_t index) const +{ + return mString[index]; +} + +String::StringBaseType& String::operator [](std::size_t index) +{ + return mString[index]; +} + +String::StringBaseType String::at( std::size_t index ) const +{ + return mString.at( index ); +} + +void String::push_back( StringBaseType c ) +{ + mString.push_back( c ); +} + +void String::swap ( String& str ) +{ + mString.swap( str.mString ); +} + +void String::clear() +{ + mString.clear(); +} + +std::size_t String::size() const +{ + return mString.size(); +} + +std::size_t String::length() const +{ + return mString.length(); +} + +bool String::empty() const +{ + return mString.empty(); +} + +void String::erase(std::size_t position, std::size_t count) +{ + mString.erase(position, count); +} + +String& String::insert(std::size_t position, const String& str) +{ + mString.insert(position, str.mString); + return *this; +} + +String& String::insert( std::size_t pos1, const String& str, std::size_t pos2, std::size_t n ) +{ + mString.insert( pos1, str.mString, pos2, n ); + return *this; +} + +String& String::insert ( size_t pos1, const char* s, size_t n ) +{ + String tmp( s ); + + mString.insert( pos1, tmp.data(), n ); + + return *this; +} + +String& String::insert ( size_t pos1, size_t n, char c ) +{ + mString.insert( pos1, n, c ); + return *this; +} + +String& String::insert ( size_t pos1, const char* s ) +{ + String tmp( s ); + + mString.insert( pos1, tmp.data() ); + + return *this; +} + +String::Iterator String::insert ( Iterator p, char c ) +{ + return mString.insert( p, c ); +} + +void String::insert ( Iterator p, size_t n, char c ) +{ + mString.insert( p, n, c ); +} + +const String::StringBaseType* String::c_str() const +{ + return mString.c_str(); +} + +const String::StringBaseType* String::data() const +{ + return mString.data(); +} + +String::Iterator String::begin() +{ + return mString.begin(); +} + +String::ConstIterator String::begin() const +{ + return mString.begin(); +} + +String::Iterator String::end() +{ + return mString.end(); +} + +String::ConstIterator String::end() const +{ + return mString.end(); +} + +String::ReverseIterator String::rbegin() +{ + return mString.rbegin(); +} + +String::ConstReverseIterator String::rbegin() const +{ + return mString.rbegin(); +} + +String::ReverseIterator String::rend() +{ + return mString.rend(); +} + +String::ConstReverseIterator String::rend() const +{ + return mString.rend(); +} + +void String::resize( std::size_t n, StringBaseType c ) +{ + mString.resize( n, c ); +} + +void String::resize( std::size_t n ) +{ + mString.resize( n ); +} + +std::size_t String::max_size() const +{ + return mString.max_size(); +} + +void String::reserve( size_t res_arg ) +{ + mString.reserve( res_arg ); +} + +std::size_t String::capacity() const +{ + return mString.capacity(); +} + +String& String::assign ( const String& str ) +{ + mString.assign( str.mString ); + return *this; +} + +String& String::assign ( const String& str, size_t pos, size_t n ) +{ + mString.assign( str.mString, pos, n ); + return *this; +} + +String& String::assign ( const char* s, size_t n ) +{ + String tmp( s ); + + mString.assign( tmp.mString ); + + return *this; +} + +String& String::assign ( const char* s ) +{ + String tmp( s ); + + mString.assign( tmp.mString ); + + return *this; +} + +String& String::assign ( size_t n, char c ) +{ + mString.assign( n, c ); + + return *this; +} + +String& String::append ( const String& str ) +{ + mString.append( str.mString ); + + return *this; +} + +String& String::append ( const String& str, size_t pos, size_t n ) +{ + mString.append( str.mString, pos, n ); + + return *this; +} + +String& String::append ( const char* s, size_t n ) +{ + String tmp( s ); + + mString.append( tmp.mString ); + + return *this; +} + +String& String::append ( const char* s ) +{ + String tmp( s ); + + mString.append( tmp.mString ); + + return *this; +} + +String& String::append ( size_t n, char c ) +{ + mString.append( n, c ); + + return *this; +} + +String& String::append ( std::size_t n, StringBaseType c ) +{ + mString.append( n, c ); + + return *this; +} + +String& String::replace ( size_t pos1, size_t n1, const String& str ) +{ + mString.replace( pos1, n1, str.mString ); + + return *this; +} + +String& String::replace ( Iterator i1, Iterator i2, const String& str ) +{ + mString.replace( i1, i2, str.mString ); + + return *this; +} + +String& String::replace ( size_t pos1, size_t n1, const String& str, size_t pos2, size_t n2 ) +{ + mString.replace( pos1, n1, str.mString, pos2, n2 ); + + return *this; +} + +String& String::replace ( size_t pos1, size_t n1, const char* s, size_t n2 ) +{ + String tmp( s ); + + mString.replace( pos1, n1, tmp.data(), n2 ); + + return *this; +} + +String& String::replace ( Iterator i1, Iterator i2, const char* s, size_t n2 ) +{ + String tmp( s ); + + mString.replace( i1, i2, tmp.data(), n2 ); + + return *this; +} + +String& String::replace ( size_t pos1, size_t n1, const char* s ) +{ + String tmp( s ); + + mString.replace( pos1, n1, tmp.mString ); + + return *this; +} + +String& String::replace ( Iterator i1, Iterator i2, const char* s ) +{ + String tmp( s ); + + mString.replace( i1, i2, tmp.mString ); + + return *this; +} + +String& String::replace ( size_t pos1, size_t n1, size_t n2, char c ) +{ + mString.replace( pos1, n1, n2, (StringBaseType)c ); + + return *this; +} + +String& String::replace ( Iterator i1, Iterator i2, size_t n2, char c ) +{ + mString.replace( i1, i2, n2, (StringBaseType)c ); + + return *this; +} + +std::size_t String::find( const String& str, std::size_t start ) const +{ + return mString.find( str.mString, start ); +} + +std::size_t String::find ( const char* s, std::size_t pos, std::size_t n ) const +{ + return find( String( s ), pos ); +} + +std::size_t String::find ( const char* s, std::size_t pos ) const +{ + return find( String( s ), pos ); +} + +size_t String::find ( char c, std::size_t pos ) const +{ + return mString.find( (StringBaseType)c, pos ); +} + +std::size_t String::rfind ( const String& str, std::size_t pos ) const +{ + return mString.rfind( str.mString, pos ); +} + +std::size_t String::rfind ( const char* s, std::size_t pos, std::size_t n ) const +{ + return rfind( String( s ), pos ); +} + +std::size_t String::rfind ( const char* s, std::size_t pos ) const +{ + return rfind( String( s ), pos ); +} + +std::size_t String::rfind ( char c, std::size_t pos ) const +{ + return mString.rfind( c, pos ); +} + +std::size_t String::copy ( StringBaseType* s, std::size_t n, std::size_t pos ) const +{ + return mString.copy( s, n, pos ); +} + +String String::substr ( std::size_t pos, std::size_t n ) const +{ + return String( mString.substr( pos, n ) ); +} + +int String::compare ( const String& str ) const +{ + return mString.compare( str.mString ); +} + +int String::compare ( const char* s ) const +{ + return compare( String( s ) ); +} + +int String::compare ( std::size_t pos1, std::size_t n1, const String& str ) const +{ + return mString.compare( pos1, n1, str.mString ); +} + +int String::compare ( std::size_t pos1, std::size_t n1, const char* s) const +{ + return compare( pos1, n1, String( s ) ); +} + +int String::compare ( std::size_t pos1, std::size_t n1, const String& str, std::size_t pos2, std::size_t n2 ) const +{ + return mString.compare( pos1, n1, str.mString, pos2, n2 ); +} + +int String::compare ( std::size_t pos1, std::size_t n1, const char* s, std::size_t n2) const +{ + return compare( pos1, n1, String( s ), 0, n2 ); +} + +std::size_t String::find_first_of ( const String& str, std::size_t pos ) const +{ + return mString.find_first_of( str.mString, pos ); +} + +std::size_t String::find_first_of ( const char* s, std::size_t pos, std::size_t n ) const +{ + return find_first_of( String( s ), pos ); +} + +std::size_t String::find_first_of ( const char* s, std::size_t pos ) const +{ + return find_first_of( String( s ), pos ); +} + +std::size_t String::find_first_of ( StringBaseType c, std::size_t pos ) const +{ + return mString.find_first_of( c, pos ); +} + +std::size_t String::find_last_of ( const String& str, std::size_t pos ) const +{ + return mString.find_last_of( str.mString, pos ); +} + +std::size_t String::find_last_of ( const char* s, std::size_t pos, std::size_t n ) const +{ + return find_last_of( String( s ), pos ); +} + +std::size_t String::find_last_of ( const char* s, std::size_t pos ) const +{ + return find_last_of( String( s ), pos ); +} + +std::size_t String::find_last_of ( StringBaseType c, std::size_t pos) const +{ + return mString.find_last_of( c, pos ); +} + +std::size_t String::find_first_not_of ( const String& str, std::size_t pos ) const +{ + return mString.find_first_not_of( str.mString, pos ); +} + +std::size_t String::find_first_not_of ( const char* s, std::size_t pos, std::size_t n ) const +{ + return find_first_not_of( String( s ), pos ); +} + +std::size_t String::find_first_not_of ( const char* s, std::size_t pos ) const +{ + return find_first_not_of( String( s ), pos ); +} + +std::size_t String::find_first_not_of ( StringBaseType c, std::size_t pos ) const +{ + return mString.find_first_not_of( c, pos ); +} + +std::size_t String::find_last_not_of ( const String& str, std::size_t pos ) const +{ + return mString.find_last_not_of( str.mString, pos ); +} + +std::size_t String::find_last_not_of ( const char* s, std::size_t pos, std::size_t n ) const +{ + return find_last_not_of( String( s ), pos ); +} + +std::size_t String::find_last_not_of ( const char* s, std::size_t pos ) const +{ + return find_last_not_of( String( s ), pos ); +} + +std::size_t String::find_last_not_of ( StringBaseType c, std::size_t pos ) const +{ + return mString.find_last_not_of( c, pos ); +} + +bool operator ==(const String& left, const String& right) +{ + return left.mString == right.mString; +} + +bool operator !=(const String& left, const String& right) +{ + return !(left == right); +} + +bool operator <(const String& left, const String& right) +{ + return left.mString < right.mString; +} + +bool operator >(const String& left, const String& right) +{ + return right < left; +} + +bool operator <=(const String& left, const String& right) +{ + return !(right < left); +} + +bool operator >=(const String& left, const String& right) +{ + return !(left < right); +} + +String operator +(const String& left, const String& right) +{ + String string = left; + string += right; + + return string; +} + +} diff --git a/lib/efsw/src/efsw/String.hpp b/lib/efsw/src/efsw/String.hpp new file mode 100644 index 0000000..ce7e3b7 --- /dev/null +++ b/lib/efsw/src/efsw/String.hpp @@ -0,0 +1,629 @@ +/** NOTE: +* This code is based on the Utf implementation from SFML2. License zlib/png ( http://www.sfml-dev.org/license.php ) +* The class was modified to fit efsw own needs. This is not the original implementation from SFML2. +* Functions and methods are the same that in std::string to facilitate portability. +**/ + +#ifndef EFSW_STRING_HPP +#define EFSW_STRING_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace efsw { + +/** @brief Utility string class that automatically handles conversions between types and encodings **/ +class String +{ + public : + typedef Uint32 StringBaseType; + typedef std::basic_string StringType; + typedef StringType::iterator Iterator; //! Iterator type + typedef StringType::const_iterator ConstIterator; //! Constant iterator type + typedef StringType::reverse_iterator ReverseIterator; //! Reverse Iterator type + typedef StringType::const_reverse_iterator ConstReverseIterator; //! Constant iterator type + + static const std::size_t InvalidPos; ///< Represents an invalid position in the string + + template + static std::string toStr(const T& i) { + std::ostringstream ss; + ss << i; + return ss.str(); + } + + /** Converts from a string to type */ + template + static bool fromString(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&) = std::dec ) { + std::istringstream iss(s); + return !(iss >> f >> t).fail(); + } + + /** Converts from a String to type */ + template + static bool fromString(T& t, const String& s, std::ios_base& (*f)(std::ios_base&) = std::dec ) { + std::istringstream iss( s.toUtf8() ); + return !(iss >> f >> t).fail(); + } + + /** Split a string and hold it on a vector */ + static std::vector < std::string > split( const std::string& str, const char& splitchar, const bool& pushEmptyString = false ); + + /** Split a string and hold it on a vector */ + static std::vector < String > split( const String& str, const Uint32& splitchar, const bool& pushEmptyString = false ); + + /** Determine if a string starts with the string passed + ** @param start The substring expected to start + ** @param str The string to compare + ** @return -1 if the substring is no in str, otherwise the size of the substring + */ + static int strStartsWith( const std::string& start, const std::string& str ); + + static int strStartsWith( const String& start, const String& str ); + + /** @brief Construct from an UTF-8 string to UTF-32 according + ** @param uf8String UTF-8 string to convert + **/ + static String fromUtf8( const std::string& utf8String ); + + /** @brief Default constructor + ** This constructor creates an empty string. + **/ + String(); + + /** @brief Construct from a single ANSI character and a locale + ** The source character is converted to UTF-32 according + ** to the given locale. If you want to use the current global + ** locale, rather use the other constructor. + ** @param ansiChar ANSI character to convert + ** @param locale Locale to use for conversion + **/ + String( char ansiChar, const std::locale& locale = std::locale() ); + +#ifndef EFSW_NO_WIDECHAR + /** @brief Construct from single wide character + ** @param wideChar Wide character to convert + **/ + String( wchar_t wideChar ); +#endif + + /** @brief Construct from single UTF-32 character + ** @param utf32Char UTF-32 character to convert + **/ + String( StringBaseType utf32Char ); + + /** @brief Construct from an from a null-terminated C-style UTF-8 string to UTF-32 + ** @param uf8String UTF-8 string to convert + **/ + String( const char* uf8String ); + + /** @brief Construct from an UTF-8 string to UTF-32 according + ** @param uf8String UTF-8 string to convert + **/ + String( const std::string& utf8String ); + + /** @brief Construct from a null-terminated C-style ANSI string and a locale + ** The source string is converted to UTF-32 according + ** to the given locale. If you want to use the current global + ** locale, rather use the other constructor. + ** @param ansiString ANSI string to convert + ** @param locale Locale to use for conversion + **/ + String( const char* ansiString, const std::locale& locale ); + + /** @brief Construct from an ANSI string and a locale + ** The source string is converted to UTF-32 according + ** to the given locale. If you want to use the current global + ** locale, rather use the other constructor. + ** @param ansiString ANSI string to convert + ** @param locale Locale to use for conversion + **/ + String( const std::string& ansiString, const std::locale& locale ); + +#ifndef EFSW_NO_WIDECHAR + /** @brief Construct from null-terminated C-style wide string + ** @param wideString Wide string to convert + **/ + String( const wchar_t* wideString ); + + /** @brief Construct from a wide string + ** @param wideString Wide string to convert + **/ + String( const std::wstring& wideString ); +#endif + + /** @brief Construct from a null-terminated C-style UTF-32 string + ** @param utf32String UTF-32 string to assign + **/ + String( const StringBaseType* utf32String ); + + /** @brief Construct from an UTF-32 string + ** @param utf32String UTF-32 string to assign + **/ + String( const StringType& utf32String ); + + + /** @brief Copy constructor + ** @param str Instance to copy + **/ + String( const String& str ); + + /** @brief Implicit cast operator to std::string (ANSI string) + ** The current global locale is used for conversion. If you + ** want to explicitely specify a locale, see toAnsiString. + ** Characters that do not fit in the target encoding are + ** discarded from the returned string. + ** This operator is defined for convenience, and is equivalent + ** to calling toAnsiString(). + ** @return Converted ANSI string + ** @see toAnsiString, operator String + **/ + operator std::string() const; + + /** @brief Convert the unicode string to an ANSI string + ** The UTF-32 string is converted to an ANSI string in + ** the encoding defined by \a locale. If you want to use + ** the current global locale, see the other overload + ** of toAnsiString. + ** Characters that do not fit in the target encoding are + ** discarded from the returned string. + ** @param locale Locale to use for conversion + ** @return Converted ANSI string + ** @see toWideString, operator std::string + **/ + std::string toAnsiString( const std::locale& locale = std::locale() ) const; + +#ifndef EFSW_NO_WIDECHAR + /** @brief Convert the unicode string to a wide string + ** Characters that do not fit in the target encoding are + ** discarded from the returned string. + ** @return Converted wide string + ** @see toAnsiString, operator String + **/ + std::wstring toWideString() const; +#endif + + std::string toUtf8() const; + + /** @brief Overload of assignment operator + ** @param right Instance to assign + ** @return Reference to self + **/ + String& operator =(const String& right); + + String& operator =( const StringBaseType& right ); + + /** @brief Overload of += operator to append an UTF-32 string + ** @param right String to append + ** @return Reference to self + **/ + String& operator +=(const String& right); + + String& operator +=( const StringBaseType& right ); + + /** @brief Overload of [] operator to access a character by its position + ** This function provides read-only access to characters. + ** Note: this function doesn't throw if \a index is out of range. + ** @param index Index of the character to get + ** @return Character at position \a index + **/ + StringBaseType operator [](std::size_t index) const; + + /** @brief Overload of [] operator to access a character by its position + ** This function provides read and write access to characters. + ** Note: this function doesn't throw if \a index is out of range. + ** @param index Index of the character to get + ** @return Reference to the character at position \a index + **/ + + StringBaseType& operator [](std::size_t index); + + /** @brief Get character in string + ** Performs a range check, throwing an exception of type out_of_range in case that pos is not an actual position in the string. + ** @return The character at position pos in the string. + */ + StringBaseType at( std::size_t index ) const; + + /** @brief clear the string + ** This function removes all the characters from the string. + ** @see empty, erase + **/ + void clear(); + + /** @brief Get the size of the string + ** @return Number of characters in the string + ** @see empty + **/ + std::size_t size() const; + + /** @see size() */ + std::size_t length() const; + + /** @brief Check whether the string is empty or not + ** @return True if the string is empty (i.e. contains no character) + ** @see clear, size + **/ + bool empty() const; + + /** @brief Erase one or more characters from the string + ** This function removes a sequence of \a count characters + ** starting from \a position. + ** @param position Position of the first character to erase + ** @param count Number of characters to erase + **/ + void erase(std::size_t position, std::size_t count = 1); + + + /** @brief Insert one or more characters into the string + ** This function inserts the characters of \a str + ** into the string, starting from \a position. + ** @param position Position of insertion + ** @param str Characters to insert + **/ + String& insert(std::size_t position, const String& str); + + String& insert( std::size_t pos1, const String& str, std::size_t pos2, std::size_t n ); + + String& insert ( std::size_t pos1, const char* s, std::size_t n ); + + String& insert ( std::size_t pos1, const char* s ); + + String& insert ( std::size_t pos1, size_t n, char c ); + + Iterator insert ( Iterator p, char c ); + + void insert ( Iterator p, std::size_t n, char c ); + + template + void insert ( Iterator p, InputIterator first, InputIterator last ) + { + mString.insert( p, first, last ); + } + + /** @brief Find a sequence of one or more characters in the string + ** This function searches for the characters of \a str + ** into the string, starting from \a start. + ** @param str Characters to find + ** @param start Where to begin searching + ** @return Position of \a str in the string, or String::InvalidPos if not found + **/ + std::size_t find( const String& str, std::size_t start = 0 ) const; + + std::size_t find ( const char* s, std::size_t pos, std::size_t n ) const; + + std::size_t find ( const char* s, std::size_t pos = 0 ) const; + + std::size_t find ( char c, std::size_t pos = 0 ) const; + + /** @brief Get a pointer to the C-style array of characters + ** This functions provides a read-only access to a + ** null-terminated C-style representation of the string. + ** The returned pointer is temporary and is meant only for + ** immediate use, thus it is not recommended to store it. + ** @return Read-only pointer to the array of characters + **/ + const StringBaseType* c_str() const; + + /** @brief Get string data + ** Notice that no terminating null character is appended (see member c_str for such a functionality). + ** The returned array points to an internal location which should not be modified directly in the program. + ** Its contents are guaranteed to remain unchanged only until the next call to a non-constant member function of the string object. + ** @return Pointer to an internal array containing the same content as the string. + **/ + const StringBaseType* data() const; + + /** @brief Return an iterator to the beginning of the string + ** @return Read-write iterator to the beginning of the string characters + ** @see end + **/ + Iterator begin(); + + /** @brief Return an iterator to the beginning of the string + ** @return Read-only iterator to the beginning of the string characters + ** @see end + **/ + ConstIterator begin() const; + + /** @brief Return an iterator to the beginning of the string + ** The end iterator refers to 1 position past the last character; + ** thus it represents an invalid character and should never be + ** accessed. + ** @return Read-write iterator to the end of the string characters + ** @see begin + **/ + Iterator end(); + + /** @brief Return an iterator to the beginning of the string + ** The end iterator refers to 1 position past the last character; + ** thus it represents an invalid character and should never be + ** accessed. + ** @return Read-only iterator to the end of the string characters + ** @see begin + **/ + ConstIterator end() const; + + /** @brief Return an reverse iterator to the beginning of the string + ** @return Read-write reverse iterator to the beginning of the string characters + ** @see end + **/ + ReverseIterator rbegin(); + + /** @brief Return an reverse iterator to the beginning of the string + ** @return Read-only reverse iterator to the beginning of the string characters + ** @see end + **/ + ConstReverseIterator rbegin() const; + + /** @brief Return an reverse iterator to the beginning of the string + ** The end reverse iterator refers to 1 position past the last character; + ** thus it represents an invalid character and should never be + ** accessed. + ** @return Read-write reverse iterator to the end of the string characters + ** @see begin + **/ + ReverseIterator rend(); + + + /** @brief Return an reverse iterator to the beginning of the string + ** The end reverse iterator refers to 1 position past the last character; + ** thus it represents an invalid character and should never be + ** accessed. + ** @return Read-only reverse iterator to the end of the string characters + ** @see begin + **/ + ConstReverseIterator rend() const; + + /** @brief Resize String */ + void resize ( std::size_t n, StringBaseType c ); + + /** @brief Resize String */ + void resize ( std::size_t n ); + + /** @return Maximum size of string */ + std::size_t max_size() const; + + /** @brief Request a change in capacity */ + void reserve ( size_t res_arg=0 ); + + /** @return Size of allocated storage */ + std::size_t capacity() const; + + /** @brief Append character to string */ + void push_back( StringBaseType c ); + + /** @brief Swap contents with another string */ + void swap ( String& str ); + + String& assign ( const String& str ); + + String& assign ( const String& str, std::size_t pos, std::size_t n ); + + String& assign ( const char* s, std::size_t n ); + + String& assign ( const char* s ); + + String& assign ( std::size_t n, char c ); + + template + String& assign ( InputIterator first, InputIterator last ) + { + mString.assign( first, last ); + return *this; + } + + String& append ( const String& str ); + + String& append ( const String& str, std::size_t pos, std::size_t n ); + + String& append ( const char* s, std::size_t n ); + + String& append ( const char* s ); + + String& append ( std::size_t n, char c ); + + String& append ( std::size_t n, StringBaseType c ); + + template + String& append ( InputIterator first, InputIterator last ) + { + mString.append( first, last ); + return *this; + } + + String& replace ( std::size_t pos1, std::size_t n1, const String& str ); + + String& replace ( Iterator i1, Iterator i2, const String& str ); + + String& replace ( std::size_t pos1, std::size_t n1, const String& str, std::size_t pos2, std::size_t n2 ); + + String& replace ( std::size_t pos1, std::size_t n1, const char* s, std::size_t n2 ); + + String& replace ( Iterator i1, Iterator i2, const char* s, std::size_t n2 ); + + String& replace ( std::size_t pos1, std::size_t n1, const char* s ); + + String& replace ( Iterator i1, Iterator i2, const char* s ); + + String& replace ( std::size_t pos1, std::size_t n1, std::size_t n2, char c ); + + String& replace ( Iterator i1, Iterator i2, std::size_t n2, char c ); + + template + String& replace ( Iterator i1, Iterator i2, InputIterator j1, InputIterator j2 ) + { + mString.replace( i1, i2, j1, j2 ); + return *this; + } + + std::size_t rfind ( const String& str, std::size_t pos = StringType::npos ) const; + + std::size_t rfind ( const char* s, std::size_t pos, std::size_t n ) const; + + std::size_t rfind ( const char* s, std::size_t pos = StringType::npos ) const; + + std::size_t rfind ( char c, std::size_t pos = StringType::npos ) const; + + String substr ( std::size_t pos = 0, std::size_t n = StringType::npos ) const; + + std::size_t copy ( StringBaseType* s, std::size_t n, std::size_t pos = 0 ) const; + + int compare ( const String& str ) const; + + int compare ( const char* s ) const; + + int compare ( std::size_t pos1, std::size_t n1, const String& str ) const; + + int compare ( std::size_t pos1, std::size_t n1, const char* s) const; + + int compare ( std::size_t pos1, std::size_t n1, const String& str, std::size_t pos2, std::size_t n2 ) const; + + int compare ( std::size_t pos1, std::size_t n1, const char* s, std::size_t n2) const; + + std::size_t find_first_of ( const String& str, std::size_t pos = 0 ) const; + + std::size_t find_first_of ( const char* s, std::size_t pos, std::size_t n ) const; + + std::size_t find_first_of ( const char* s, std::size_t pos = 0 ) const; + + std::size_t find_first_of ( StringBaseType c, std::size_t pos = 0 ) const; + + std::size_t find_last_of ( const String& str, std::size_t pos = StringType::npos ) const; + + std::size_t find_last_of ( const char* s, std::size_t pos, std::size_t n ) const; + + std::size_t find_last_of ( const char* s, std::size_t pos = StringType::npos ) const; + + std::size_t find_last_of ( StringBaseType c, std::size_t pos = StringType::npos ) const; + + std::size_t find_first_not_of ( const String& str, std::size_t pos = 0 ) const; + + std::size_t find_first_not_of ( const char* s, std::size_t pos, std::size_t n ) const; + + std::size_t find_first_not_of ( const char* s, std::size_t pos = 0 ) const; + + std::size_t find_first_not_of ( StringBaseType c, std::size_t pos = 0 ) const; + + std::size_t find_last_not_of ( const String& str, std::size_t pos = StringType::npos ) const; + + std::size_t find_last_not_of ( const char* s, std::size_t pos, std::size_t n ) const; + + std::size_t find_last_not_of ( const char* s, std::size_t pos = StringType::npos ) const; + + std::size_t find_last_not_of ( StringBaseType c, std::size_t pos = StringType::npos ) const; +private : + friend bool operator ==(const String& left, const String& right); + friend bool operator <(const String& left, const String& right); + + StringType mString; ///< Internal string of UTF-32 characters +}; + +/** @relates String +** @brief Overload of == operator to compare two UTF-32 strings +** @param left Left operand (a string) +** @param right Right operand (a string) +** @return True if both strings are equal +**/ + bool operator ==(const String& left, const String& right); + +/** @relates String +** @brief Overload of != operator to compare two UTF-32 strings +** @param left Left operand (a string) +** @param right Right operand (a string) +** @return True if both strings are different +**/ + bool operator !=(const String& left, const String& right); + +/** @relates String +** @brief Overload of < operator to compare two UTF-32 strings +** @param left Left operand (a string) +** @param right Right operand (a string) +** @return True if \a left is alphabetically lesser than \a right +**/ + bool operator <(const String& left, const String& right); + +/** @relates String +** @brief Overload of > operator to compare two UTF-32 strings +** @param left Left operand (a string) +** @param right Right operand (a string) +** @return True if \a left is alphabetically greater than \a right +**/ + bool operator >(const String& left, const String& right); + +/** @relates String +** @brief Overload of <= operator to compare two UTF-32 strings +** @param left Left operand (a string) +** @param right Right operand (a string) +** @return True if \a left is alphabetically lesser or equal than \a right +**/ + bool operator <=(const String& left, const String& right); + +/** @relates String +** @brief Overload of >= operator to compare two UTF-32 strings +** @param left Left operand (a string) +** @param right Right operand (a string) +** @return True if \a left is alphabetically greater or equal than \a right +**/ + bool operator >=(const String& left, const String& right); + +/** @relates String +** @brief Overload of binary + operator to concatenate two strings +** @param left Left operand (a string) +** @param right Right operand (a string) +** @return Concatenated string +**/ + String operator +( const String& left, const String& right ); + +} + +#endif + +/** @class efsw::String +** @ingroup system +** efsw::String is a utility string class defined mainly for +** convenience. It is a Unicode string (implemented using +** UTF-32), thus it can store any character in the world +** (european, chinese, arabic, hebrew, etc.). +** It automatically handles conversions from/to ANSI and +** wide strings, so that you can work with standard string +** classes and still be compatible with functions taking a +** efsw::String. +** @code +** efsw::String s; +** std::string s1 = s; // automatically converted to ANSI string +** String s2 = s; // automatically converted to wide string +** s = "hello"; // automatically converted from ANSI string +** s = L"hello"; // automatically converted from wide string +** s += 'a'; // automatically converted from ANSI string +** s += L'a'; // automatically converted from wide string +** @endcode +** Conversions involving ANSI strings use the default user locale. However +** it is possible to use a custom locale if necessary: +** @code +** std::locale locale; +** efsw::String s; +** ... +** std::string s1 = s.toAnsiString(locale); +** s = efsw::String("hello", locale); +** @endcode +** +** efsw::String defines the most important functions of the +** standard std::string class: removing, random access, iterating, +** appending, comparing, etc. However it is a simple class +** provided for convenience, and you may have to consider using +** a more optimized class if your program requires complex string +** handling. The automatic conversion functions will then take +** care of converting your string to efsw::String whenever EE +** requires it. +** +** Please note that EE also defines a low-level, generic +** interface for Unicode handling, see the efsw::Utf classes. +** +** All credits to Laurent Gomila, i just modified and expanded a little bit the implementation. +**/ diff --git a/lib/efsw/src/efsw/System.cpp b/lib/efsw/src/efsw/System.cpp new file mode 100644 index 0000000..f8767cb --- /dev/null +++ b/lib/efsw/src/efsw/System.cpp @@ -0,0 +1,26 @@ +#include +#include + +namespace efsw { + +void System::sleep( const unsigned long& ms ) +{ + Platform::System::sleep( ms ); +} + +std::string System::getProcessPath() +{ + return Platform::System::getProcessPath(); +} + +void System::maxFD() +{ + Platform::System::maxFD(); +} + +Uint64 System::getMaxFD() +{ + return Platform::System::getMaxFD(); +} + +} diff --git a/lib/efsw/src/efsw/System.hpp b/lib/efsw/src/efsw/System.hpp new file mode 100644 index 0000000..1d6f4a7 --- /dev/null +++ b/lib/efsw/src/efsw/System.hpp @@ -0,0 +1,26 @@ +#ifndef EFSW_SYSTEM_HPP +#define EFSW_SYSTEM_HPP + +#include + +namespace efsw { + +class System +{ + public: + /// Sleep for x milliseconds + static void sleep( const unsigned long& ms ); + + /// @return The process binary path + static std::string getProcessPath(); + + /// Maximize the number of file descriptors allowed per process in the current OS + static void maxFD(); + + /// @return The number of supported file descriptors for the process + static Uint64 getMaxFD(); +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/Thread.cpp b/lib/efsw/src/efsw/Thread.cpp new file mode 100644 index 0000000..fff4151 --- /dev/null +++ b/lib/efsw/src/efsw/Thread.cpp @@ -0,0 +1,51 @@ +#include +#include + +namespace efsw { + +Thread::Thread() : + mThreadImpl(NULL), + mEntryPoint(NULL) +{ +} + +Thread::~Thread() +{ + wait(); + + efSAFE_DELETE( mEntryPoint ); +} + +void Thread::launch() +{ + wait(); + + mThreadImpl = new Platform::ThreadImpl( this ); +} + +void Thread::wait() +{ + if ( mThreadImpl ) + { + mThreadImpl->wait(); + + efSAFE_DELETE( mThreadImpl ); + } +} + +void Thread::terminate() +{ + if ( mThreadImpl ) + { + mThreadImpl->terminate(); + + efSAFE_DELETE( mThreadImpl ); + } +} + +void Thread::run() +{ + mEntryPoint->run(); +} + +} diff --git a/lib/efsw/src/efsw/Thread.hpp b/lib/efsw/src/efsw/Thread.hpp new file mode 100644 index 0000000..c7da9e8 --- /dev/null +++ b/lib/efsw/src/efsw/Thread.hpp @@ -0,0 +1,111 @@ +#ifndef EFSW_THREAD_HPP +#define EFSW_THREAD_HPP + +#include + +namespace efsw { + +namespace Platform { class ThreadImpl; } +namespace Private { struct ThreadFunc; } + +/** @brief Thread manager class */ +class Thread { + public: + typedef void (*FuncType)(void*); + + template + Thread( F function ); + + template + Thread( F function, A argument ); + + template + Thread( void(C::*function)(), C* object ); + + virtual ~Thread(); + + /** Launch the thread */ + virtual void launch(); + + /** Wait the thread until end */ + void wait(); + + /** Terminate the thread */ + void terminate(); + protected: + Thread(); + private: + friend class Platform::ThreadImpl; + + /** The virtual function to run in the thread */ + virtual void run(); + + Platform::ThreadImpl * mThreadImpl; ///< OS-specific implementation of the thread + Private::ThreadFunc * mEntryPoint; ///< Abstraction of the function to run +}; + +//! NOTE: Taken from SFML2 threads +namespace Private { + +// Base class for abstract thread functions +struct ThreadFunc +{ + virtual ~ThreadFunc() {} + virtual void run() = 0; +}; + +// Specialization using a functor (including free functions) with no argument +template +struct ThreadFunctor : ThreadFunc +{ + ThreadFunctor(T functor) : m_functor(functor) {} + virtual void run() {m_functor();} + T m_functor; +}; + +// Specialization using a functor (including free functions) with one argument +template +struct ThreadFunctorWithArg : ThreadFunc +{ + ThreadFunctorWithArg(F function, A arg) : m_function(function), m_arg(arg) {} + virtual void run() {m_function(m_arg);} + F m_function; + A m_arg; +}; + +// Specialization using a member function +template +struct ThreadMemberFunc : ThreadFunc +{ + ThreadMemberFunc(void(C::*function)(), C* object) : m_function(function), m_object(object) {} + virtual void run() {(m_object->*m_function)();} + void(C::*m_function)(); + C* m_object; +}; + +} + +template +Thread::Thread(F functor) : + mThreadImpl (NULL), + mEntryPoint( new Private::ThreadFunctor(functor) ) +{ +} + +template +Thread::Thread(F function, A argument) : + mThreadImpl(NULL), + mEntryPoint( new Private::ThreadFunctorWithArg(function, argument) ) +{ +} + +template +Thread::Thread(void(C::*function)(), C* object) : + mThreadImpl(NULL), + mEntryPoint( new Private::ThreadMemberFunc(function, object) ) +{ +} + +} + +#endif diff --git a/lib/efsw/src/efsw/Utf.hpp b/lib/efsw/src/efsw/Utf.hpp new file mode 100644 index 0000000..c674048 --- /dev/null +++ b/lib/efsw/src/efsw/Utf.hpp @@ -0,0 +1,748 @@ +/** NOTE: +* This code is based on the Utf implementation from SFML2. License zlib/png ( http://www.sfml-dev.org/license.php ) +* The class was modified to fit efsw own needs. This is not the original implementation from SFML2. +* */ + +#ifndef EFSW_UTF_HPP +#define EFSW_UTF_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + +namespace efsw { + +template +class Utf; + +//////////////////////////////////////////////////////////// +/// \brief Specialization of the Utf template for UTF-8 +/// +//////////////////////////////////////////////////////////// +template <> +class Utf<8> { +public : + //////////////////////////////////////////////////////////// + /// \brief Decode a single UTF-8 character + /// + /// Decoding a character means finding its unique 32-bits + /// code (called the codepoint) in the Unicode standard. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Codepoint of the decoded UTF-8 character + /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In Decode(In begin, In end, Uint32& output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-8 character + /// + /// Encoding a character means converting a unique 32-bits + /// code (called the codepoint) in the target encoding, UTF-8. + /// + /// \param input Codepoint to encode as UTF-8 + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to UTF-8 (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out Encode(Uint32 input, Out output, Uint8 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Advance to the next UTF-8 character + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In Next(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Count the number of characters of a UTF-8 sequence + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element, thus the + /// total size can be different from (begin - end). + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static std::size_t Count(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Convert an ANSI characters range to UTF-8 + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert a wide characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromWide(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromLatin1(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-8 characters range to ANSI characters + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale()); + +#ifndef EFSW_NO_WIDECHAR + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-8 characters range to wide characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToWide(In begin, In end, Out output, wchar_t replacement = 0); +#endif + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-8 characters range to latin-1 (ISO-5589-1) characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToLatin1(In begin, In end, Out output, char replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-8 characters range to UTF-8 + /// + /// This functions does nothing more than a direct copy; + /// it is defined only to provide the same interface as other + /// specializations of the efsw::Utf<> template, and allow + /// generic code to be written on top of it. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf8(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-8 characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToUtf16(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-8 characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToUtf32(In begin, In end, Out output); +}; + +//////////////////////////////////////////////////////////// +/// \brief Specialization of the Utf template for UTF-16 +/// +//////////////////////////////////////////////////////////// +template <> +class Utf<16> +{ +public : + + //////////////////////////////////////////////////////////// + /// \brief Decode a single UTF-16 character + /// + /// Decoding a character means finding its unique 32-bits + /// code (called the codepoint) in the Unicode standard. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Codepoint of the decoded UTF-16 character + /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In Decode(In begin, In end, Uint32& output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-16 character + /// + /// Encoding a character means converting a unique 32-bits + /// code (called the codepoint) in the target encoding, UTF-16. + /// + /// \param input Codepoint to encode as UTF-16 + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to UTF-16 (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out Encode(Uint32 input, Out output, Uint16 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Advance to the next UTF-16 character + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In Next(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Count the number of characters of a UTF-16 sequence + /// + /// This function is necessary for multi-elements encodings, as + /// a single character may use more than 1 storage element, thus the + /// total size can be different from (begin - end). + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static std::size_t Count(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Convert an ANSI characters range to UTF-16 + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert a wide characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromWide(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromLatin1(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to ANSI characters + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale()); + +#ifndef EFSW_NO_WIDECHAR + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to wide characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToWide(In begin, In end, Out output, wchar_t replacement = 0); +#endif + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToLatin1(In begin, In end, Out output, char replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-16 characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf8(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-16 characters range to UTF-16 + /// + /// This functions does nothing more than a direct copy; + /// it is defined only to provide the same interface as other + /// specializations of the efsw::Utf<> template, and allow + /// generic code to be written on top of it. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToUtf16(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-16 characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToUtf32(In begin, In end, Out output); +}; + +//////////////////////////////////////////////////////////// +/// \brief Specialization of the Utf template for UTF-32 +/// +//////////////////////////////////////////////////////////// +template <> +class Utf<32> +{ +public : + + //////////////////////////////////////////////////////////// + /// \brief Decode a single UTF-32 character + /// + /// Decoding a character means finding its unique 32-bits + /// code (called the codepoint) in the Unicode standard. + /// For UTF-32, the character value is the same as the codepoint. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Codepoint of the decoded UTF-32 character + /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In Decode(In begin, In end, Uint32& output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-32 character + /// + /// Encoding a character means converting a unique 32-bits + /// code (called the codepoint) in the target encoding, UTF-32. + /// For UTF-32, the codepoint is the same as the character value. + /// + /// \param input Codepoint to encode as UTF-32 + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to UTF-32 (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out Encode(Uint32 input, Out output, Uint32 replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Advance to the next UTF-32 character + /// + /// This function is trivial for UTF-32, which can store + /// every character in a single storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static In Next(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Count the number of characters of a UTF-32 sequence + /// + /// This function is trivial for UTF-32, which can store + /// every character in a single storage element. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// + /// \return Iterator pointing to one past the last read element of the input sequence + /// + //////////////////////////////////////////////////////////// + template + static std::size_t Count(In begin, In end); + + //////////////////////////////////////////////////////////// + /// \brief Convert an ANSI characters range to UTF-32 + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Convert a wide characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromWide(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-32 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out FromLatin1(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-32 characters range to ANSI characters + /// + /// The current global locale will be used by default, unless you + /// pass a custom one in the \a locale parameter. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale()); + +#ifndef EFSW_NO_WIDECHAR + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-32 characters range to wide characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToWide(In begin, In end, Out output, wchar_t replacement = 0); +#endif + + //////////////////////////////////////////////////////////// + /// \brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToLatin1(In begin, In end, Out output, char replacement = 0); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-32 characters range to UTF-8 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out toUtf8(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-32 characters range to UTF-16 + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToUtf16(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Convert a UTF-32 characters range to UTF-32 + /// + /// This functions does nothing more than a direct copy; + /// it is defined only to provide the same interface as other + /// specializations of the efsw::Utf<> template, and allow + /// generic code to be written on top of it. + /// + /// \param begin Iterator pointing to the beginning of the input sequence + /// \param end Iterator pointing to the end of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out ToUtf32(In begin, In end, Out output); + + //////////////////////////////////////////////////////////// + /// \brief Decode a single ANSI character to UTF-32 + /// + /// This function does not exist in other specializations + /// of efsw::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param input Input ANSI character + /// \param locale Locale to use for conversion + /// + /// \return Converted character + /// + //////////////////////////////////////////////////////////// + template + static Uint32 DecodeAnsi(In input, const std::locale& locale = std::locale()); + + //////////////////////////////////////////////////////////// + /// \brief Decode a single wide character to UTF-32 + /// + /// This function does not exist in other specializations + /// of efsw::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param input Input wide character + /// + /// \return Converted character + /// + //////////////////////////////////////////////////////////// + template + static Uint32 DecodeWide(In input); + + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-32 character to ANSI + /// + /// This function does not exist in other specializations + /// of efsw::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param codepoint Iterator pointing to the beginning of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement if the input character is not convertible to ANSI (use 0 to skip it) + /// \param locale Locale to use for conversion + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out EncodeAnsi(Uint32 codepoint, Out output, char replacement = 0, const std::locale& locale = std::locale()); + +#ifndef EFSW_NO_WIDECHAR + //////////////////////////////////////////////////////////// + /// \brief Encode a single UTF-32 character to wide + /// + /// This function does not exist in other specializations + /// of efsw::Utf<>, it is defined for convenience (it is used by + /// several other conversion functions). + /// + /// \param codepoint Iterator pointing to the beginning of the input sequence + /// \param output Iterator pointing to the beginning of the output sequence + /// \param replacement Replacement if the input character is not convertible to wide (use 0 to skip it) + /// + /// \return Iterator to the end of the output sequence which has been written + /// + //////////////////////////////////////////////////////////// + template + static Out EncodeWide(Uint32 codepoint, Out output, wchar_t replacement = 0); +#endif +}; + +#include "Utf.inl" + +// Make typedefs to get rid of the template syntax +typedef Utf<8> Utf8; +typedef Utf<16> Utf16; +typedef Utf<32> Utf32; + +} +#endif + +//////////////////////////////////////////////////////////// +/// \class efsw::Utf +/// \ingroup system +/// +/// Utility class providing generic functions for UTF conversions. +/// +/// efsw::Utf is a low-level, generic interface for counting, iterating, +/// encoding and decoding Unicode characters and strings. It is able +/// to handle ANSI, wide, UTF-8, UTF-16 and UTF-32 encodings. +/// +/// efsw::Utf functions are all static, these classes are not meant to +/// be instanciated. All the functions are template, so that you +/// can use any character / string type for a given encoding. +/// +/// It has 3 specializations: +/// \li efsw::Utf<8> (typedef'd to efsw::Utf8) +/// \li efsw::Utf<16> (typedef'd to efsw::Utf16) +/// \li efsw::Utf<32> (typedef'd to efsw::Utf32) +/// +//////////////////////////////////////////////////////////// diff --git a/lib/efsw/src/efsw/Utf.inl b/lib/efsw/src/efsw/Utf.inl new file mode 100644 index 0000000..fddac42 --- /dev/null +++ b/lib/efsw/src/efsw/Utf.inl @@ -0,0 +1,671 @@ +// References : +// http://www.unicode.org/ +// http://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c +// http://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.h +// http://people.w3.org/rishida/scripts/uniview/conversion +//////////////////////////////////////////////////////////// + +template +In Utf<8>::Decode(In begin, In end, Uint32& output, Uint32 replacement) +{ + // Some useful precomputed data + static const int trailing[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5 + }; + static const Uint32 offsets[6] = + { + 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080 + }; + + // Decode the character + int trailingBytes = trailing[static_cast(*begin)]; + if (begin + trailingBytes < end) + { + output = 0; + switch (trailingBytes) + { + case 5 : output += static_cast(*begin++); output <<= 6; + case 4 : output += static_cast(*begin++); output <<= 6; + case 3 : output += static_cast(*begin++); output <<= 6; + case 2 : output += static_cast(*begin++); output <<= 6; + case 1 : output += static_cast(*begin++); output <<= 6; + case 0 : output += static_cast(*begin++); + } + output -= offsets[trailingBytes]; + } + else + { + // Incomplete character + begin = end; + output = replacement; + } + + return begin; +} + +template +Out Utf<8>::Encode(Uint32 input, Out output, Uint8 replacement) +{ + // Some useful precomputed data + static const Uint8 firstBytes[7] = + { + 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC + }; + + // Encode the character + if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF))) + { + // Invalid character + if (replacement) + *output++ = replacement; + } + else + { + // Valid character + + // Get the number of bytes to write + int bytesToWrite = 1; + if (input < 0x80) bytesToWrite = 1; + else if (input < 0x800) bytesToWrite = 2; + else if (input < 0x10000) bytesToWrite = 3; + else if (input <= 0x0010FFFF) bytesToWrite = 4; + + // Extract the bytes to write + Uint8 bytes[4]; + switch (bytesToWrite) + { + case 4 : bytes[3] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 3 : bytes[2] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 2 : bytes[1] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 1 : bytes[0] = static_cast (input | firstBytes[bytesToWrite]); + } + + // Add them to the output + const Uint8* currentByte = bytes; + switch (bytesToWrite) + { + case 4 : *output++ = *currentByte++; + case 3 : *output++ = *currentByte++; + case 2 : *output++ = *currentByte++; + case 1 : *output++ = *currentByte++; + } + } + + return output; +} + +template +In Utf<8>::Next(In begin, In end) +{ + Uint32 codepoint; + return Decode(begin, end, codepoint); +} + +template +std::size_t Utf<8>::Count(In begin, In end) +{ + std::size_t length = 0; + while (begin < end) + { + begin = Next(begin, end); + ++length; + } + + return length; +} + +template +Out Utf<8>::FromAnsi(In begin, In end, Out output, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::DecodeAnsi(*begin++, locale); + output = Encode(codepoint, output); + } + + return output; +} + +template +Out Utf<8>::FromWide(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::DecodeWide(*begin++); + output = Encode(codepoint, output); + } + + return output; +} + +template +Out Utf<8>::FromLatin1(In begin, In end, Out output) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + output = Encode(*begin++, output); + + return output; +} + +template +Out Utf<8>::ToAnsi(In begin, In end, Out output, char replacement, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + output = Utf<32>::EncodeAnsi(codepoint, output, replacement, locale); + } + + return output; +} + +#ifndef EFSW_NO_WIDECHAR +template +Out Utf<8>::ToWide(In begin, In end, Out output, wchar_t replacement) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + output = Utf<32>::EncodeWide(codepoint, output, replacement); + } + + return output; +} +#endif + +template +Out Utf<8>::ToLatin1(In begin, In end, Out output, char replacement) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + *output++ = codepoint < 256 ? static_cast(codepoint) : replacement; + } + + return output; +} + +template +Out Utf<8>::toUtf8(In begin, In end, Out output) +{ + while (begin < end) + *output++ = *begin++; + + return output; +} + +template +Out Utf<8>::ToUtf16(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + output = Utf<16>::Encode(codepoint, output); + } + + return output; +} + +template +Out Utf<8>::ToUtf32(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + *output++ = codepoint; + } + + return output; +} + +template +In Utf<16>::Decode(In begin, In end, Uint32& output, Uint32 replacement) +{ + Uint16 first = *begin++; + + // If it's a surrogate pair, first convert to a single UTF-32 character + if ((first >= 0xD800) && (first <= 0xDBFF)) + { + if (begin < end) + { + Uint32 second = *begin++; + if ((second >= 0xDC00) && (second <= 0xDFFF)) + { + // The second element is valid: convert the two elements to a UTF-32 character + output = static_cast(((first - 0xD800) << 10) + (second - 0xDC00) + 0x0010000); + } + else + { + // Invalid character + output = replacement; + } + } + else + { + // Invalid character + begin = end; + output = replacement; + } + } + else + { + // We can make a direct copy + output = first; + } + + return begin; +} + +template +Out Utf<16>::Encode(Uint32 input, Out output, Uint16 replacement) +{ + if (input < 0xFFFF) + { + // The character can be copied directly, we just need to check if it's in the valid range + if ((input >= 0xD800) && (input <= 0xDFFF)) + { + // Invalid character (this range is reserved) + if (replacement) + *output++ = replacement; + } + else + { + // Valid character directly convertible to a single UTF-16 character + *output++ = static_cast(input); + } + } + else if (input > 0x0010FFFF) + { + // Invalid character (greater than the maximum unicode value) + if (replacement) + *output++ = replacement; + } + else + { + // The input character will be converted to two UTF-16 elements + input -= 0x0010000; + *output++ = static_cast((input >> 10) + 0xD800); + *output++ = static_cast((input & 0x3FFUL) + 0xDC00); + } + + return output; +} + +template +In Utf<16>::Next(In begin, In end) +{ + Uint32 codepoint; + return Decode(begin, end, codepoint); +} + +template +std::size_t Utf<16>::Count(In begin, In end) +{ + std::size_t length = 0; + while (begin < end) + { + begin = Next(begin, end); + ++length; + } + + return length; +} + +template +Out Utf<16>::FromAnsi(In begin, In end, Out output, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::DecodeAnsi(*begin++, locale); + output = Encode(codepoint, output); + } + + return output; +} + +template +Out Utf<16>::FromWide(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint = Utf<32>::DecodeWide(*begin++); + output = Encode(codepoint, output); + } + + return output; +} + +template +Out Utf<16>::FromLatin1(In begin, In end, Out output) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + *output++ = *begin++; + + return output; +} + +template +Out Utf<16>::ToAnsi(In begin, In end, Out output, char replacement, const std::locale& locale) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + output = Utf<32>::EncodeAnsi(codepoint, output, replacement, locale); + } + + return output; +} + +#ifndef EFSW_NO_WIDECHAR +template +Out Utf<16>::ToWide(In begin, In end, Out output, wchar_t replacement) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + output = Utf<32>::EncodeWide(codepoint, output, replacement); + } + + return output; +} +#endif + +template +Out Utf<16>::ToLatin1(In begin, In end, Out output, char replacement) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + { + *output++ = *begin < 256 ? static_cast(*begin) : replacement; + begin++; + } + + return output; +} + +template +Out Utf<16>::toUtf8(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + output = Utf<8>::Encode(codepoint, output); + } + + return output; +} + +template +Out Utf<16>::ToUtf16(In begin, In end, Out output) +{ + while (begin < end) + *output++ = *begin++; + + return output; +} + +template +Out Utf<16>::ToUtf32(In begin, In end, Out output) +{ + while (begin < end) + { + Uint32 codepoint; + begin = Decode(begin, end, codepoint); + *output++ = codepoint; + } + + return output; +} + +template +In Utf<32>::Decode(In begin, In end, Uint32& output, Uint32) +{ + output = *begin++; + return begin; +} + +template +Out Utf<32>::Encode(Uint32 input, Out output, Uint32 replacement) +{ + *output++ = input; + return output; +} + +template +In Utf<32>::Next(In begin, In end) +{ + return ++begin; +} + +template +std::size_t Utf<32>::Count(In begin, In end) +{ + return begin - end; +} + +template +Out Utf<32>::FromAnsi(In begin, In end, Out output, const std::locale& locale) +{ + while (begin < end) + *output++ = DecodeAnsi(*begin++, locale); + + return output; +} + +template +Out Utf<32>::FromWide(In begin, In end, Out output) +{ + while (begin < end) + *output++ = DecodeWide(*begin++); + + return output; +} + +template +Out Utf<32>::FromLatin1(In begin, In end, Out output) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + *output++ = *begin++; + + return output; +} + +template +Out Utf<32>::ToAnsi(In begin, In end, Out output, char replacement, const std::locale& locale) +{ + while (begin < end) + output = EncodeAnsi(*begin++, output, replacement, locale); + + return output; +} + +#ifndef EFSW_NO_WIDECHAR +template +Out Utf<32>::ToWide(In begin, In end, Out output, wchar_t replacement) +{ + while (begin < end) + output = EncodeWide(*begin++, output, replacement); + + return output; +} +#endif + +template +Out Utf<32>::ToLatin1(In begin, In end, Out output, char replacement) +{ + // Latin-1 is directly compatible with Unicode encodings, + // and can thus be treated as (a sub-range of) UTF-32 + while (begin < end) + { + *output++ = *begin < 256 ? static_cast(*begin) : replacement; + begin++; + } + + return output; +} + +template +Out Utf<32>::toUtf8(In begin, In end, Out output) +{ + while (begin < end) + output = Utf<8>::Encode(*begin++, output); + + return output; +} + +template +Out Utf<32>::ToUtf16(In begin, In end, Out output) +{ + while (begin < end) + output = Utf<16>::Encode(*begin++, output); + + return output; +} + +template +Out Utf<32>::ToUtf32(In begin, In end, Out output) +{ + while (begin < end) + *output++ = *begin++; + + return output; +} + +template +Uint32 Utf<32>::DecodeAnsi(In input, const std::locale& locale) +{ + // On Windows, gcc's standard library (glibc++) has almost + // no support for Unicode stuff. As a consequence, in this + // context we can only use the default locale and ignore + // the one passed as parameter. + + #if EFSW_PLATFORM == EFSW_PLATFORM_WIN && /* if Windows ... */ \ + (defined(__GLIBCPP__) || defined (__GLIBCXX__)) && /* ... and standard library is glibc++ ... */ \ + !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */ + + wchar_t character = 0; + mbtowc(&character, &input, 1); + return static_cast(character); + + #else + // Get the facet of the locale which deals with character conversion + #ifndef EFSW_NO_WIDECHAR + const std::ctype& facet = std::use_facet< std::ctype >(locale); + #else + const std::ctype& facet = std::use_facet< std::ctype >(locale); + #endif + + // Use the facet to convert each character of the input string + return static_cast(facet.widen(input)); + + #endif +} + +template +Uint32 Utf<32>::DecodeWide(In input) +{ + // The encoding of wide characters is not well defined and is left to the system; + // however we can safely assume that it is UCS-2 on Windows and + // UCS-4 on Unix systems. + // In both cases, a simple copy is enough (UCS-2 is a subset of UCS-4, + // and UCS-4 *is* UTF-32). + + return input; +} + +template +Out Utf<32>::EncodeAnsi(Uint32 codepoint, Out output, char replacement, const std::locale& locale) +{ + // On Windows, gcc's standard library (glibc++) has almost + // no support for Unicode stuff. As a consequence, in this + // context we can only use the default locale and ignore + // the one passed as parameter. + + #if EFSW_PLATFORM == EFSW_PLATFORM_WIN && /* if Windows ... */ \ + (defined(__GLIBCPP__) || defined (__GLIBCXX__)) && /* ... and standard library is glibc++ ... */ \ + !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */ + + char character = 0; + if (wctomb(&character, static_cast(codepoint)) >= 0) + *output++ = character; + else if (replacement) + *output++ = replacement; + + return output; + + #else + // Get the facet of the locale which deals with character conversion + #ifndef EFSW_NO_WIDECHAR + const std::ctype& facet = std::use_facet< std::ctype >(locale); + #else + const std::ctype& facet = std::use_facet< std::ctype >(locale); + #endif + + // Use the facet to convert each character of the input string + *output++ = facet.narrow(static_cast(codepoint), replacement); + + return output; + + #endif +} + +#ifndef EFSW_NO_WIDECHAR +template +Out Utf<32>::EncodeWide(Uint32 codepoint, Out output, wchar_t replacement) +{ + // The encoding of wide characters is not well defined and is left to the system; + // however we can safely assume that it is UCS-2 on Windows and + // UCS-4 on Unix systems. + // For UCS-2 we need to check if the source characters fits in (UCS-2 is a subset of UCS-4). + // For UCS-4 we can do a direct copy (UCS-4 *is* UTF-32). + + switch (sizeof(wchar_t)) + { + case 4: + { + *output++ = static_cast(codepoint); + break; + } + + default: + { + if ((codepoint <= 0xFFFF) && ((codepoint < 0xD800) || (codepoint > 0xDFFF))) + { + *output++ = static_cast(codepoint); + } + else if (replacement) + { + *output++ = replacement; + } + break; + } + } + + return output; +} +#endif diff --git a/lib/efsw/src/efsw/Watcher.cpp b/lib/efsw/src/efsw/Watcher.cpp new file mode 100644 index 0000000..d81c842 --- /dev/null +++ b/lib/efsw/src/efsw/Watcher.cpp @@ -0,0 +1,21 @@ +#include + +namespace efsw { + +Watcher::Watcher() : + ID(0), + Directory(""), + Listener(NULL), + Recursive(false) +{ +} + +Watcher::Watcher( WatchID id, std::string directory, FileWatchListener * listener, bool recursive ) : + ID( id ), + Directory( directory ), + Listener( listener ), + Recursive( recursive ) +{ +} + +} diff --git a/lib/efsw/src/efsw/Watcher.hpp b/lib/efsw/src/efsw/Watcher.hpp new file mode 100644 index 0000000..5a35cb9 --- /dev/null +++ b/lib/efsw/src/efsw/Watcher.hpp @@ -0,0 +1,30 @@ +#ifndef EFSW_WATCHERIMPL_HPP +#define EFSW_WATCHERIMPL_HPP + +#include +#include + +namespace efsw { + +/** @brief Base Watcher class */ +class Watcher +{ + public: + Watcher(); + + Watcher( WatchID id, std::string directory, FileWatchListener * listener, bool recursive ); + + virtual ~Watcher() {} + + virtual void watch() {} + + WatchID ID; + std::string Directory; + FileWatchListener * Listener; + bool Recursive; + std::string OldFileName; +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/WatcherFSEvents.cpp b/lib/efsw/src/efsw/WatcherFSEvents.cpp new file mode 100644 index 0000000..a13a743 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherFSEvents.cpp @@ -0,0 +1,264 @@ +#include +#include +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +namespace efsw { + +WatcherFSEvents::WatcherFSEvents() : + Watcher(), + FWatcher( NULL ), + FSStream( NULL ), + WatcherGen( NULL ), + initializedAsync( false ) +{ +} + +WatcherFSEvents::WatcherFSEvents( WatchID id, std::string directory, FileWatchListener * listener, bool recursive, WatcherFSEvents * parent ) : + Watcher( id, directory, listener, recursive ), + FWatcher( NULL ), + FSStream( NULL ), + WatcherGen( NULL ), + initializedAsync( false ) +{ +} + +WatcherFSEvents::~WatcherFSEvents() +{ + if ( NULL != FSStream ) + { + if ( initializedAsync ) + { + FSEventStreamStop( FSStream ); + } + + FSEventStreamInvalidate( FSStream ); + FSEventStreamRelease( FSStream ); + } + + efSAFE_DELETE( WatcherGen ); +} + +void WatcherFSEvents::init() +{ + CFStringRef CFDirectory = CFStringCreateWithCString( NULL, Directory.c_str(), kCFStringEncodingUTF8 ); + CFArrayRef CFDirectoryArray = CFArrayCreate( NULL, (const void **)&CFDirectory, 1, NULL ); + + Uint32 streamFlags = kFSEventStreamCreateFlagNone; + + if ( FileWatcherFSEvents::isGranular() ) + { + streamFlags = efswFSEventStreamCreateFlagFileEvents; + } + else + { + WatcherGen = new WatcherGeneric( ID, Directory, Listener, FWatcher, Recursive ); + } + + FSEventStreamContext ctx; + /* Initialize context */ + ctx.version = 0; + ctx.info = this; + ctx.retain = NULL; + ctx.release = NULL; + ctx.copyDescription = NULL; + + FSStream = FSEventStreamCreate( kCFAllocatorDefault, &FileWatcherFSEvents::FSEventCallback, &ctx, CFDirectoryArray, kFSEventStreamEventIdSinceNow, 0.25, streamFlags ); + + FWatcher->mNeedInit.push_back( this ); + + CFRelease( CFDirectoryArray ); + CFRelease( CFDirectory ); +} + +void WatcherFSEvents::initAsync() +{ + FSEventStreamScheduleWithRunLoop( FSStream, FWatcher->mRunLoopRef, kCFRunLoopDefaultMode ); + FSEventStreamStart( FSStream ); + initializedAsync = true; +} + +void WatcherFSEvents::sendFileAction( WatchID watchid, const std::string& dir, const std::string& filename, Action action, std::string oldFilename ) +{ + Listener->handleFileAction( watchid, FileSystem::precomposeFileName( dir ), FileSystem::precomposeFileName( filename ), action, oldFilename ); +} + +void WatcherFSEvents::handleAddModDel( const Uint32& flags, const std::string& path, std::string& dirPath, std::string& filePath ) +{ + if ( flags & efswFSEventStreamEventFlagItemCreated ) + { + if ( FileInfo::exists( path ) ) + { + sendFileAction( ID, dirPath, filePath, Actions::Add ); + } + } + + if ( flags & efswFSEventsModified ) + { + sendFileAction( ID, dirPath, filePath, Actions::Modified ); + } + + if ( flags & efswFSEventStreamEventFlagItemRemoved ) + { + // Since i don't know the order, at least i try to keep the data consistent with the real state + if ( !FileInfo::exists( path ) ) + { + sendFileAction( ID, dirPath, filePath, Actions::Delete ); + } + } +} + +void WatcherFSEvents::handleActions( std::vector& events ) +{ + size_t esize = events.size(); + + for ( size_t i = 0; i < esize; i++ ) + { + FSEvent& event = events[i]; + + if ( event.Flags & ( kFSEventStreamEventFlagUserDropped | + kFSEventStreamEventFlagKernelDropped | + kFSEventStreamEventFlagEventIdsWrapped | + kFSEventStreamEventFlagHistoryDone | + kFSEventStreamEventFlagMount | + kFSEventStreamEventFlagUnmount | + kFSEventStreamEventFlagRootChanged ) ) + { + continue; + } + + if ( !Recursive ) + { + /** In case that is not recursive the watcher, ignore the events from subfolders */ + if ( event.Path.find_last_of( FileSystem::getOSSlash() ) != Directory.size() - 1 ) + { + continue; + } + } + + if ( FileWatcherFSEvents::isGranular() ) + { + std::string dirPath( FileSystem::pathRemoveFileName( event.Path ) ); + std::string filePath( FileSystem::fileNameFromPath( event.Path ) ); + + if ( event.Flags & ( efswFSEventStreamEventFlagItemCreated | + efswFSEventStreamEventFlagItemRemoved | + efswFSEventStreamEventFlagItemRenamed ) + ) + { + if ( dirPath != Directory ) + { + DirsChanged.insert( dirPath ); + } + } + + // This is a mess. But it's FSEvents faults, because shrinks events from the same file in one single event ( so there's no order for them ) + // For example a file could have been added modified and erased, but i can't know if first was erased and then added and modified, or added, then modified and then erased. + // I don't know what they were thinking by doing this... + efDEBUG( "Event in: %s - flags: %ld\n", path.c_str(), event.Flags ); + + if ( event.Flags & efswFSEventStreamEventFlagItemRenamed ) + { + if ( ( i + 1 < esize ) && + ( events[ i + 1 ].Flags & efswFSEventStreamEventFlagItemRenamed ) && + ( events[ i + 1 ].Id == event.Id + 1 ) + ) + { + FSEvent& nEvent = events[ i + 1 ]; + std::string newDir( FileSystem::pathRemoveFileName( nEvent.Path ) ); + std::string newFilepath( FileSystem::fileNameFromPath( nEvent.Path ) ); + + if ( event.Path != nEvent.Path ) + { + if ( dirPath == newDir ) + { + if ( !FileInfo::exists( event.Path ) ) + { + sendFileAction( ID, dirPath, newFilepath, Actions::Moved, filePath ); + } + else + { + sendFileAction( ID, dirPath, filePath, Actions::Moved, newFilepath ); + } + } + else + { + sendFileAction( ID, dirPath, filePath, Actions::Delete ); + sendFileAction( ID, newDir, newFilepath, Actions::Add ); + + if ( nEvent.Flags & efswFSEventsModified ) + { + sendFileAction( ID, newDir, newFilepath, Actions::Modified ); + } + } + } + else + { + handleAddModDel( nEvent.Flags, nEvent.Path, dirPath, filePath ); + } + + if ( nEvent.Flags & ( efswFSEventStreamEventFlagItemCreated | + efswFSEventStreamEventFlagItemRemoved | + efswFSEventStreamEventFlagItemRenamed ) + ) + { + if ( newDir != Directory ) + { + DirsChanged.insert( newDir ); + } + } + + // Skip the renamed file + i++; + } + else if ( FileInfo::exists( event.Path ) ) + { + sendFileAction( ID, dirPath, filePath, Actions::Add ); + + if ( event.Flags & efswFSEventsModified ) + { + sendFileAction( ID, dirPath, filePath, Actions::Modified ); + } + } + else + { + sendFileAction( ID, dirPath, filePath, Actions::Delete ); + } + } + else + { + handleAddModDel( event.Flags, event.Path, dirPath, filePath ); + } + } + else + { + efDEBUG( "Directory: %s changed\n", event.Path.c_str() ); + DirsChanged.insert( event.Path ); + } + } +} + +void WatcherFSEvents::process() +{ + std::set::iterator it = DirsChanged.begin(); + + for ( ; it != DirsChanged.end(); it++ ) + { + if ( !FileWatcherFSEvents::isGranular() ) + { + WatcherGen->watchDir( (*it) ); + } + else + { + sendFileAction( ID, FileSystem::pathRemoveFileName( (*it) ), FileSystem::fileNameFromPath( (*it) ), Actions::Modified ); + } + } + + DirsChanged.clear(); +} + +} + +#endif diff --git a/lib/efsw/src/efsw/WatcherFSEvents.hpp b/lib/efsw/src/efsw/WatcherFSEvents.hpp new file mode 100644 index 0000000..d4fc5c9 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherFSEvents.hpp @@ -0,0 +1,70 @@ +#ifndef EFSW_WATCHERINOTIFY_HPP +#define EFSW_WATCHERINOTIFY_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +#include +#include +#include +#include +#include +#include + +namespace efsw { + +class FileWatcherFSEvents; + +class FSEvent +{ + public: + FSEvent( std::string path, long flags, Uint64 id ) : + Path( path ), + Flags( flags ), + Id ( id ) + { + } + + std::string Path; + long Flags; + Uint64 Id; +}; + +class WatcherFSEvents : public Watcher +{ + public: + WatcherFSEvents(); + + WatcherFSEvents( WatchID id, std::string directory, FileWatchListener * listener, bool recursive, WatcherFSEvents * parent = NULL ); + + ~WatcherFSEvents(); + + void init(); + + void initAsync(); + + void handleActions( std::vector & events ); + + void process(); + + FileWatcherFSEvents * FWatcher; + + FSEventStreamRef FSStream; + protected: + void handleAddModDel( const Uint32 &flags, const std::string &path, std::string &dirPath, std::string &filePath ); + + WatcherGeneric * WatcherGen; + + bool initializedAsync; + + std::set DirsChanged; + + void sendFileAction( WatchID watchid, const std::string& dir, const std::string& filename, Action action, std::string oldFilename = "" ); +}; + +} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/WatcherGeneric.cpp b/lib/efsw/src/efsw/WatcherGeneric.cpp new file mode 100644 index 0000000..94170d3 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherGeneric.cpp @@ -0,0 +1,40 @@ +#include +#include +#include + +namespace efsw +{ + +WatcherGeneric::WatcherGeneric( WatchID id, const std::string& directory, FileWatchListener * fwl, FileWatcherImpl * fw, bool recursive ) : + Watcher( id, directory, fwl, recursive ), + WatcherImpl( fw ), + DirWatch( NULL ) +{ + FileSystem::dirAddSlashAtEnd( Directory ); + + DirWatch = new DirWatcherGeneric( NULL, this, directory, recursive, false ); + + DirWatch->addChilds( false ); +} + +WatcherGeneric::~WatcherGeneric() +{ + efSAFE_DELETE( DirWatch ); +} + +void WatcherGeneric::watch() +{ + DirWatch->watch(); +} + +void WatcherGeneric::watchDir( std::string dir ) +{ + DirWatch->watchDir( dir ); +} + +bool WatcherGeneric::pathInWatches( std::string path ) +{ + return DirWatch->pathInWatches( path ); +} + +} diff --git a/lib/efsw/src/efsw/WatcherGeneric.hpp b/lib/efsw/src/efsw/WatcherGeneric.hpp new file mode 100644 index 0000000..8794e92 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherGeneric.hpp @@ -0,0 +1,30 @@ +#ifndef EFSW_WATCHERGENERIC_HPP +#define EFSW_WATCHERGENERIC_HPP + +#include + +namespace efsw +{ + +class DirWatcherGeneric; + +class WatcherGeneric : public Watcher +{ + public: + FileWatcherImpl * WatcherImpl; + DirWatcherGeneric * DirWatch; + + WatcherGeneric( WatchID id, const std::string& directory, FileWatchListener * fwl, FileWatcherImpl * fw, bool recursive ); + + ~WatcherGeneric(); + + void watch(); + + void watchDir( std::string dir ); + + bool pathInWatches( std::string path ); +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/WatcherInotify.cpp b/lib/efsw/src/efsw/WatcherInotify.cpp new file mode 100644 index 0000000..741641b --- /dev/null +++ b/lib/efsw/src/efsw/WatcherInotify.cpp @@ -0,0 +1,35 @@ +#include + +namespace efsw { + +WatcherInotify::WatcherInotify() : + Watcher(), + Parent( NULL ) +{ +} + +WatcherInotify::WatcherInotify( WatchID id, std::string directory, FileWatchListener * listener, bool recursive, WatcherInotify * parent ) : + Watcher( id, directory, listener, recursive ), + Parent( parent ), + DirInfo( directory ) +{ +} + +bool WatcherInotify::inParentTree( WatcherInotify * parent ) +{ + WatcherInotify * tNext = Parent; + + while ( NULL != tNext ) + { + if ( tNext == parent ) + { + return true; + } + + tNext = tNext->Parent; + } + + return false; +} + +} diff --git a/lib/efsw/src/efsw/WatcherInotify.hpp b/lib/efsw/src/efsw/WatcherInotify.hpp new file mode 100644 index 0000000..1caf399 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherInotify.hpp @@ -0,0 +1,25 @@ +#ifndef EFSW_WATCHERINOTIFY_HPP +#define EFSW_WATCHERINOTIFY_HPP + +#include +#include + +namespace efsw { + +class WatcherInotify : public Watcher +{ + public: + WatcherInotify(); + + WatcherInotify( WatchID id, std::string directory, FileWatchListener * listener, bool recursive, WatcherInotify * parent = NULL ); + + bool inParentTree( WatcherInotify * parent ); + + WatcherInotify * Parent; + + FileInfo DirInfo; +}; + +} + +#endif diff --git a/lib/efsw/src/efsw/WatcherKqueue.cpp b/lib/efsw/src/efsw/WatcherKqueue.cpp new file mode 100644 index 0000000..8347fb5 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherKqueue.cpp @@ -0,0 +1,667 @@ +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_KQUEUE || EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define KEVENT_RESERVE_VALUE (10) + +#ifndef O_EVTONLY +#define O_EVTONLY (O_RDONLY | O_NONBLOCK) +#endif + +namespace efsw { + +int comparator(const void* ke1, const void* ke2) +{ + const KEvent * kev1 = reinterpret_cast( ke1 ); + const KEvent * kev2 = reinterpret_cast( ke2 ); + + if ( NULL != kev2->udata ) + { + FileInfo * fi1 = reinterpret_cast( kev1->udata ); + FileInfo * fi2 = reinterpret_cast( kev2->udata ); + + return strcmp( fi1->Filepath.c_str(), fi2->Filepath.c_str() ); + } + + return 1; +} + +WatcherKqueue::WatcherKqueue(WatchID watchid, const std::string& dirname, FileWatchListener* listener, bool recursive, FileWatcherKqueue * watcher, WatcherKqueue * parent ) : + Watcher( watchid, dirname, listener, recursive ), + mLastWatchID(0), + mChangeListCount( 0 ), + mKqueue( kqueue() ), + mWatcher( watcher ), + mParent( parent ), + mInitOK( true ), + mErrno(0) +{ + if ( -1 == mKqueue ) + { + efDEBUG( "kqueue() returned invalid descriptor for directory %s. File descriptors count: %ld\n", Directory.c_str(), mWatcher->mFileDescriptorCount ); + + mInitOK = false; + mErrno = errno; + } + else + { + mWatcher->addFD(); + } +} + +WatcherKqueue::~WatcherKqueue() +{ + // Remove the childs watchers ( sub-folders watches ) + removeAll(); + + for ( size_t i = 0; i < mChangeListCount; i++ ) + { + if ( NULL != mChangeList[i].udata ) + { + FileInfo * fi = reinterpret_cast( mChangeList[i].udata ); + + efSAFE_DELETE( fi ); + } + } + + close( mKqueue ); + + mWatcher->removeFD(); +} + +void WatcherKqueue::addAll() +{ + if ( -1 == mKqueue ) + { + return; + } + + // scan directory and call addFile(name, false) on each file + FileSystem::dirAddSlashAtEnd( Directory ); + + efDEBUG( "addAll(): Added folder: %s\n", Directory.c_str()); + + // add base dir + int fd = open( Directory.c_str(), O_EVTONLY ); + + if ( -1 == fd ) + { + efDEBUG( "addAll(): Couldn't open folder: %s\n", Directory.c_str() ); + + if ( EACCES != errno ) + { + mInitOK = false; + } + + mErrno = errno; + + return; + } + + mDirSnap.setDirectoryInfo( Directory ); + mDirSnap.scan(); + + mChangeList.resize( KEVENT_RESERVE_VALUE ); + + // Creates the kevent for the folder + EV_SET( + &mChangeList[0], + fd, + EVFILT_VNODE, + EV_ADD | EV_ENABLE | EV_ONESHOT, + NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB | NOTE_RENAME, + 0, + 0 + ); + + mWatcher->addFD(); + + // Get the files and directories from the directory + FileInfoMap files = FileSystem::filesInfoFromPath( Directory ); + + for ( FileInfoMap::iterator it = files.begin(); it != files.end(); it++ ) + { + FileInfo& fi = it->second; + + if ( fi.isRegularFile() ) + { + // Add the regular files kevent + addFile( fi.Filepath , false ); + } + else if ( Recursive && fi.isDirectory() && fi.isReadable() ) + { + // Create another watcher for the subfolders ( if recursive ) + WatchID id = addWatch( fi.Filepath, Listener, Recursive, this ); + + // If the watcher is not adding the watcher means that the directory was created + if ( id > 0 && !mWatcher->isAddingWatcher() ) + { + handleFolderAction( fi.Filepath, Actions::Add ); + } + } + } +} + +void WatcherKqueue::removeAll() +{ + efDEBUG( "removeAll(): Removing all child watchers\n" ); + + std::list erase; + + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); it++ ) + { + efDEBUG( "removeAll(): Removed child watcher %s\n", it->second->Directory.c_str() ); + + erase.push_back( it->second->ID ); + } + + for ( std::list::iterator eit = erase.begin(); eit != erase.end(); eit++ ) + { + removeWatch( *eit ); + } +} + +void WatcherKqueue::addFile(const std::string& name, bool emitEvents) +{ + efDEBUG( "addFile(): Added: %s\n", name.c_str() ); + + // Open the file to get the file descriptor + int fd = open( name.c_str(), O_EVTONLY ); + + if( fd == -1 ) + { + efDEBUG( "addFile(): Could open file descriptor for %s. File descriptor count: %ld\n", name.c_str(), mWatcher->mFileDescriptorCount ); + + Errors::Log::createLastError( Errors::FileNotReadable, name ); + + if ( EACCES != errno ) + { + mInitOK = false; + } + + mErrno = errno; + + return; + } + + mWatcher->addFD(); + + // increase the file kevent file count + mChangeListCount++; + + if ( mChangeListCount + KEVENT_RESERVE_VALUE > mChangeList.size() && + mChangeListCount % KEVENT_RESERVE_VALUE == 0 ) + { + size_t reserve_size = mChangeList.size() + KEVENT_RESERVE_VALUE; + mChangeList.resize( reserve_size ); + efDEBUG( "addFile(): Reserverd more KEvents space for %s, space reserved %ld, list actual size %ld.\n", Directory.c_str(), reserve_size, mChangeListCount ); + } + + // create entry + FileInfo * entry = new FileInfo( name ); + + // set the event data at the end of the list + EV_SET( + &mChangeList[mChangeListCount], + fd, + EVFILT_VNODE, + EV_ADD | EV_ENABLE | EV_ONESHOT, + NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB | NOTE_RENAME, + 0, + (void*)entry + ); + + // qsort sort the list by name + qsort(&mChangeList[1], mChangeListCount, sizeof(KEvent), comparator); + + // handle action + if( emitEvents ) + { + handleAction(name, Actions::Add); + } +} + +void WatcherKqueue::removeFile( const std::string& name, bool emitEvents ) +{ + efDEBUG( "removeFile(): Trying to remove file: %s\n", name.c_str() ); + + // bsearch + KEvent target; + + // Create a temporary file info to search the kevent ( searching the directory ) + FileInfo tempEntry( name ); + + target.udata = &tempEntry; + + // Search the kevent + KEvent * ke = (KEvent*)bsearch(&target, &mChangeList[0], mChangeListCount + 1, sizeof(KEvent), comparator); + + // Trying to remove a non-existing file? + if( !ke ) + { + Errors::Log::createLastError( Errors::FileNotFound, name ); + efDEBUG( "File not removed\n" ); + return; + } + + efDEBUG( "File removed\n" ); + + // handle action + if ( emitEvents ) + { + handleAction( name, Actions::Delete ); + } + + // Delete the user data ( FileInfo ) from the kevent closed + FileInfo * del = reinterpret_cast( ke->udata ); + + efSAFE_DELETE( del ); + + // close the file descriptor from the kevent + close( ke->ident ); + + mWatcher->removeFD(); + + memset(ke, 0, sizeof(KEvent)); + + // move end to current + memcpy(ke, &mChangeList[mChangeListCount], sizeof(KEvent)); + memset(&mChangeList[mChangeListCount], 0, sizeof(KEvent)); + --mChangeListCount; +} + +void WatcherKqueue::rescan() +{ + efDEBUG( "rescan(): Rescanning: %s\n", Directory.c_str() ); + + DirectorySnapshotDiff Diff = mDirSnap.scan(); + + if ( Diff.DirChanged ) + { + sendDirChanged(); + } + + if ( Diff.changed() ) + { + FileInfoList::iterator it; + MovedList::iterator mit; + + /// Files + DiffIterator( FilesCreated ) + { + addFile( (*it).Filepath ); + } + + DiffIterator( FilesModified ) + { + handleAction( (*it).Filepath, Actions::Modified ); + } + + DiffIterator( FilesDeleted ) + { + removeFile( (*it).Filepath ); + } + + DiffMovedIterator( FilesMoved ) + { + handleAction( (*mit).second.Filepath, Actions::Moved, (*mit).first ); + removeFile( Directory + (*mit).first, false ); + addFile( (*mit).second.Filepath, false ); + } + + /// Directories + DiffIterator( DirsCreated ) + { + handleFolderAction( (*it).Filepath, Actions::Add ); + addWatch( (*it).Filepath, Listener, Recursive, this ); + } + + DiffIterator( DirsModified ) + { + handleFolderAction( (*it).Filepath, Actions::Modified ); + } + + DiffIterator( DirsDeleted ) + { + handleFolderAction( (*it).Filepath, Actions::Delete ); + + Watcher * watch = findWatcher( (*it).Filepath ); + + if ( NULL != watch ) + { + removeWatch( watch->ID ); + + } + } + + DiffMovedIterator( DirsMoved ) + { + moveDirectory( Directory + (*mit).first, (*mit).second.Filepath ); + } + } +} + +WatchID WatcherKqueue::watchingDirectory( std::string dir ) +{ + Watcher * watch = findWatcher( dir ); + + if ( NULL != watch ) + { + return watch->ID; + } + + return Errors::FileNotFound; +} + +void WatcherKqueue::handleAction( const std::string& filename, efsw::Action action, const std::string& oldFilename ) +{ + Listener->handleFileAction( ID, Directory, FileSystem::fileNameFromPath( filename ), action, FileSystem::fileNameFromPath( oldFilename ) ); +} + +void WatcherKqueue::handleFolderAction( std::string filename, efsw::Action action , const std::string &oldFilename ) +{ + FileSystem::dirRemoveSlashAtEnd( filename ); + + handleAction( filename, action, oldFilename ); +} + +void WatcherKqueue::sendDirChanged() +{ + if ( NULL != mParent ) + { + Listener->handleFileAction( mParent->ID, mParent->Directory, FileSystem::fileNameFromPath( Directory ), Actions::Modified ); + } +} + +void WatcherKqueue::watch() +{ + if ( -1 == mKqueue ) + { + return; + } + + int nev = 0; + KEvent event; + + // First iterate the childs, to get the events from the deepest folder, to the watcher childs + for ( WatchMap::iterator it = mWatches.begin(); it != mWatches.end(); ++it ) + { + it->second->watch(); + } + + bool needScan = false; + + // Then we get the the events of the current folder + while( ( nev = kevent( mKqueue, &mChangeList[0], mChangeListCount + 1, &event, 1, &mWatcher->mTimeOut ) ) != 0 ) + { + // An error ocurred? + if( nev == -1 ) + { + efDEBUG( "watch(): Error on directory %s\n", Directory.c_str() ); + perror("kevent"); + break; + } + else + { + FileInfo * entry = NULL; + + // If udate == NULL means that it is the fisrt element of the change list, the folder. + // otherwise it is an event of some file inside the folder + if( ( entry = reinterpret_cast ( event.udata ) ) != NULL ) + { + efDEBUG( "watch(): File: %s ", entry->Filepath.c_str() ); + + // If the event flag is delete... the file was deleted + if ( event.fflags & NOTE_DELETE ) + { + efDEBUG( "deleted\n" ); + + mDirSnap.removeFile( entry->Filepath ); + + removeFile( entry->Filepath ); + } + else if ( event.fflags & NOTE_EXTEND || + event.fflags & NOTE_WRITE || + event.fflags & NOTE_ATTRIB + ) + { + // The file was modified + efDEBUG( "modified\n" ); + + FileInfo fi( entry->Filepath ); + + if ( fi != *entry ) + { + *entry = fi; + + mDirSnap.updateFile( entry->Filepath ); + + handleAction( entry->Filepath, efsw::Actions::Modified ); + } + } + else if ( event.fflags & NOTE_RENAME ) + { + efDEBUG( "moved\n" ); + + needScan = true; + } + } + else + { + needScan = true; + } + } + } + + if ( needScan ) + { + rescan(); + } +} + +Watcher * WatcherKqueue::findWatcher( const std::string path ) +{ + WatchMap::iterator it = mWatches.begin(); + + for ( ; it != mWatches.end(); it++ ) + { + if ( it->second->Directory == path ) + { + return it->second; + } + } + + return NULL; +} + +void WatcherKqueue::moveDirectory( std::string oldPath, std::string newPath, bool emitEvents ) +{ + // Update the directory path if it's a watcher + std::string opath2( oldPath ); + FileSystem::dirAddSlashAtEnd( opath2 ); + + Watcher * watch = findWatcher( opath2 ); + + if ( NULL != watch ) + { + watch->Directory = opath2; + } + + if ( emitEvents ) + { + handleFolderAction( newPath, efsw::Actions::Moved, oldPath ); + } +} + +WatchID WatcherKqueue::addWatch( const std::string& directory, FileWatchListener* watcher, bool recursive , WatcherKqueue *parent) +{ + static long s_fc = 0; + static bool s_ug = false; + + std::string dir( directory ); + + FileSystem::dirAddSlashAtEnd( dir ); + + // This should never happen here + if( !FileSystem::isDirectory( dir ) ) + { + return Errors::Log::createLastError( Errors::FileNotFound, dir ); + } + else if ( pathInWatches( dir ) || pathInParent( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, directory ); + } + else if ( NULL != parent && FileSystem::isRemoteFS( dir ) ) + { + return Errors::Log::createLastError( Errors::FileRemote, dir ); + } + + std::string curPath; + std::string link( FileSystem::getLinkRealPath( dir, curPath ) ); + + if ( "" != link ) + { + /// Avoid adding symlinks directories if it's now enabled + if ( NULL != parent && !mWatcher->mFileWatcher->followSymlinks() ) + { + return Errors::Log::createLastError( Errors::FileOutOfScope, dir ); + } + + if ( pathInWatches( link ) || pathInParent( link ) ) + { + return Errors::Log::createLastError( Errors::FileRepeated, link ); + } + else if ( !mWatcher->linkAllowed( curPath, link ) ) + { + return Errors::Log::createLastError( Errors::FileOutOfScope, link ); + } + else + { + dir = link; + } + } + + if ( mWatcher->availablesFD() ) + { + WatcherKqueue* watch = new WatcherKqueue( ++mLastWatchID, dir, watcher, recursive, mWatcher, parent ); + + mWatches.insert(std::make_pair(mLastWatchID, watch)); + + watch->addAll(); + + s_fc++; + + // if failed to open the directory... erase the watcher + if ( !watch->initOK() ) + { + int le = watch->lastErrno(); + + mWatches.erase( watch->ID ); + + efSAFE_DELETE( watch ); + + mLastWatchID--; + + // Probably the folder has too many files, create a generic watcher + if ( EACCES != le ) + { + WatcherGeneric * watch = new WatcherGeneric( ++mLastWatchID, dir, watcher, mWatcher, recursive ); + + mWatches.insert(std::make_pair(mLastWatchID, watch)); + } + else + { + return Errors::Log::createLastError( Errors::Unspecified, link ); + } + } + } + else + { + if ( !s_ug ) + { + efDEBUG( "Started using WatcherGeneric, reached file descriptors limit: %ld. Folders added: %ld\n", mWatcher->mFileDescriptorCount, s_fc ); + s_ug = true; + } + + WatcherGeneric * watch = new WatcherGeneric( ++mLastWatchID, dir, watcher, mWatcher, recursive ); + + mWatches.insert(std::make_pair(mLastWatchID, watch)); + } + + return mLastWatchID; +} + +bool WatcherKqueue::initOK() +{ + return mInitOK; +} + +void WatcherKqueue::removeWatch( WatchID watchid ) +{ + WatchMap::iterator iter = mWatches.find(watchid); + + if(iter == mWatches.end()) + return; + + Watcher * watch = iter->second; + + mWatches.erase(iter); + + efSAFE_DELETE( watch ); +} + +bool WatcherKqueue::pathInWatches( const std::string& path ) +{ + return NULL != findWatcher( path ); +} + +bool WatcherKqueue::pathInParent( const std::string &path ) +{ + WatcherKqueue * pNext = mParent; + + while ( NULL != pNext ) + { + if ( pNext->pathInWatches( path ) ) + { + return true; + } + + pNext = pNext->mParent; + } + + if ( mWatcher->pathInWatches( path ) ) + { + return true; + } + + if ( path == Directory ) + { + return true; + } + + return false; +} + +int WatcherKqueue::lastErrno() +{ + return mErrno; +} + +} + +#endif diff --git a/lib/efsw/src/efsw/WatcherKqueue.hpp b/lib/efsw/src/efsw/WatcherKqueue.hpp new file mode 100644 index 0000000..4babbe7 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherKqueue.hpp @@ -0,0 +1,94 @@ +#ifndef EFSW_WATCHEROSX_HPP +#define EFSW_WATCHEROSX_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_KQUEUE || EFSW_PLATFORM == EFSW_PLATFORM_FSEVENTS + +#include +#include +#include +#include +#include + +namespace efsw +{ + +class FileWatcherKqueue; +class WatcherKqueue; + +typedef struct kevent KEvent; + +/// type for a map from WatchID to WatcherKqueue pointer +typedef std::map WatchMap; + +class WatcherKqueue : public Watcher +{ + public: + WatcherKqueue( WatchID watchid, const std::string& dirname, FileWatchListener* listener, bool recursive, FileWatcherKqueue * watcher, WatcherKqueue * parent = NULL ); + + virtual ~WatcherKqueue(); + + void addFile( const std::string& name, bool emitEvents = true ); + + void removeFile( const std::string& name, bool emitEvents = true ); + + // called when the directory is actually changed + // means a file has been added or removed + // rescans the watched directory adding/removing files and sending notices + void rescan(); + + void handleAction( const std::string& filename, efsw::Action action, const std::string& oldFilename = "" ); + + void handleFolderAction( std::string filename, efsw::Action action, const std::string& oldFilename = "" ); + + void addAll(); + + void removeAll(); + + WatchID watchingDirectory( std::string dir ); + + void watch(); + + WatchID addWatch(const std::string& directory, FileWatchListener* watcher, bool recursive, WatcherKqueue * parent); + + void removeWatch (WatchID watchid ); + + bool initOK(); + + int lastErrno(); + protected: + WatchMap mWatches; + int mLastWatchID; + + // index 0 is always the directory + std::vector mChangeList; + size_t mChangeListCount; + DirectorySnapshot mDirSnap; + + /// The descriptor for the kqueue + int mKqueue; + + FileWatcherKqueue * mWatcher; + + WatcherKqueue * mParent; + + bool mInitOK; + int mErrno; + + bool pathInWatches( const std::string& path ); + + bool pathInParent( const std::string& path ); + + Watcher * findWatcher( const std::string path ); + + void moveDirectory( std::string oldPath, std::string newPath, bool emitEvents = true ); + + void sendDirChanged(); +}; + +} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/WatcherWin32.cpp b/lib/efsw/src/efsw/WatcherWin32.cpp new file mode 100644 index 0000000..4d2dc7e --- /dev/null +++ b/lib/efsw/src/efsw/WatcherWin32.cpp @@ -0,0 +1,144 @@ +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +namespace efsw +{ + +/// Unpacks events and passes them to a user defined callback. +void CALLBACK WatchCallback(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) +{ + char szFile[MAX_PATH]; + PFILE_NOTIFY_INFORMATION pNotify; + WatcherStructWin32 * tWatch = (WatcherStructWin32*) lpOverlapped; + WatcherWin32 * pWatch = tWatch->Watch; + size_t offset = 0; + + if (dwNumberOfBytesTransfered == 0) + { + RefreshWatch(tWatch); // If dwNumberOfBytesTransfered == 0, it means the buffer overflowed (too many changes between GetOverlappedResults calls). Those events are lost, but at least we can refresh so subsequent changes are seen again. + return; + } + + if (dwErrorCode == ERROR_SUCCESS) + { + do + { + bool skip = false; + + pNotify = (PFILE_NOTIFY_INFORMATION) &pWatch->mBuffer[offset]; + offset += pNotify->NextEntryOffset; + + int count = WideCharToMultiByte(CP_UTF8, 0, pNotify->FileName, + pNotify->FileNameLength / sizeof(WCHAR), + szFile, MAX_PATH - 1, NULL, NULL); + szFile[count] = TEXT('\0'); + + std::string nfile( szFile ); + + if ( FILE_ACTION_MODIFIED == pNotify->Action ) + { + FileInfo fifile( std::string( pWatch->DirName ) + nfile ); + + if ( pWatch->LastModifiedEvent.file.ModificationTime == fifile.ModificationTime && pWatch->LastModifiedEvent.file.Size == fifile.Size && pWatch->LastModifiedEvent.fileName == nfile ) + { + skip = true; + } + + pWatch->LastModifiedEvent.fileName = nfile; + pWatch->LastModifiedEvent.file = fifile; + } + + if ( !skip ) + { + pWatch->Watch->handleAction(pWatch, nfile, pNotify->Action); + } + } while (pNotify->NextEntryOffset != 0); + } + + if (!pWatch->StopNow) + { + RefreshWatch(tWatch); + } +} + +/// Refreshes the directory monitoring. +bool RefreshWatch(WatcherStructWin32* pWatch) +{ + return ReadDirectoryChangesW( + pWatch->Watch->DirHandle, + pWatch->Watch->mBuffer, + sizeof(pWatch->Watch->mBuffer), + pWatch->Watch->Recursive, + pWatch->Watch->NotifyFilter, + NULL, + &pWatch->Overlapped, + NULL + ) != 0; +} + +/// Stops monitoring a directory. +void DestroyWatch(WatcherStructWin32* pWatch) +{ + if (pWatch) + { + WatcherWin32 * tWatch = pWatch->Watch; + + tWatch->StopNow = true; + + CancelIoEx(tWatch->DirHandle, &pWatch->Overlapped); + + RefreshWatch(pWatch); + CloseHandle(pWatch->Overlapped.hEvent); + CloseHandle(pWatch->Watch->DirHandle); + efSAFE_DELETE_ARRAY( pWatch->Watch->DirName ); + efSAFE_DELETE( pWatch->Watch ); + HeapFree(GetProcessHeap(), 0, pWatch); + } +} + +/// Starts monitoring a directory. +WatcherStructWin32* CreateWatch(LPCWSTR szDirectory, bool recursive, DWORD NotifyFilter) +{ + WatcherStructWin32 * tWatch; + size_t ptrsize = sizeof(*tWatch); + tWatch = static_cast(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ptrsize)); + + WatcherWin32 * pWatch = new WatcherWin32(); + tWatch->Watch = pWatch; + + pWatch->DirHandle = CreateFileW( + szDirectory, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, + NULL + ); + + if (pWatch->DirHandle != INVALID_HANDLE_VALUE) + { + tWatch->Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + pWatch->NotifyFilter = NotifyFilter; + pWatch->Recursive = recursive; + + if (RefreshWatch(tWatch)) + { + return tWatch; + } + else + { + CloseHandle(tWatch->Overlapped.hEvent); + CloseHandle(pWatch->DirHandle); + } + } + + HeapFree(GetProcessHeap(), 0, tWatch); + return NULL; +} + +} + + #endif diff --git a/lib/efsw/src/efsw/WatcherWin32.hpp b/lib/efsw/src/efsw/WatcherWin32.hpp new file mode 100644 index 0000000..3c6d988 --- /dev/null +++ b/lib/efsw/src/efsw/WatcherWin32.hpp @@ -0,0 +1,77 @@ +#ifndef EFSW_WATCHERWIN32_HPP +#define EFSW_WATCHERWIN32_HPP + +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +#include + +#ifdef EFSW_COMPILER_MSVC + #pragma comment(lib, "comctl32.lib") + #pragma comment(lib, "user32.lib") + #pragma comment(lib, "ole32.lib") + + // disable secure warnings + #pragma warning (disable: 4996) +#endif + +namespace efsw +{ + +class WatcherWin32; + +/// Internal watch data +struct WatcherStructWin32 +{ + OVERLAPPED Overlapped; + WatcherWin32 * Watch; +}; + +class cLastModifiedEvent +{ + public: + cLastModifiedEvent() {} + FileInfo file; + std::string fileName; +}; + +bool RefreshWatch(WatcherStructWin32* pWatch); + +void CALLBACK WatchCallback(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped); + +void DestroyWatch(WatcherStructWin32* pWatch); + +WatcherStructWin32* CreateWatch(LPCWSTR szDirectory, bool recursive, DWORD NotifyFilter); + +class WatcherWin32 : public Watcher +{ + public: + WatcherWin32() : + Struct( NULL ), + DirHandle( NULL ), + lParam( 0 ), + NotifyFilter( 0 ), + StopNow( false ), + Watch( NULL ), + DirName( NULL ) + { + } + + WatcherStructWin32 * Struct; + HANDLE DirHandle; + BYTE mBuffer[63 * 1024]; // do NOT make this bigger than 64K because it will fail if the folder being watched is on the network! (see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx) + LPARAM lParam; + DWORD NotifyFilter; + bool StopNow; + FileWatcherImpl* Watch; + char* DirName; + cLastModifiedEvent LastModifiedEvent; +}; + +} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/base.hpp b/lib/efsw/src/efsw/base.hpp new file mode 100644 index 0000000..f7febf8 --- /dev/null +++ b/lib/efsw/src/efsw/base.hpp @@ -0,0 +1,115 @@ +#ifndef EFSW_BASE +#define EFSW_BASE + +#include +#include + +namespace efsw { + +typedef SOPHIST_int8 Int8; +typedef SOPHIST_uint8 Uint8; +typedef SOPHIST_int16 Int16; +typedef SOPHIST_uint16 Uint16; +typedef SOPHIST_int32 Int32; +typedef SOPHIST_uint32 Uint32; +typedef SOPHIST_int64 Int64; +typedef SOPHIST_uint64 Uint64; + +#define EFSW_OS_WIN 1 +#define EFSW_OS_LINUX 2 +#define EFSW_OS_MACOSX 3 +#define EFSW_OS_BSD 4 +#define EFSW_OS_SOLARIS 5 +#define EFSW_OS_HAIKU 6 +#define EFSW_OS_ANDROID 7 +#define EFSW_OS_IOS 8 + +#define EFSW_PLATFORM_WIN32 1 +#define EFSW_PLATFORM_INOTIFY 2 +#define EFSW_PLATFORM_KQUEUE 3 +#define EFSW_PLATFORM_FSEVENTS 4 +#define EFSW_PLATFORM_GENERIC 5 + +#if defined(_WIN32) + /// Any Windows platform + #define EFSW_OS EFSW_OS_WIN + #define EFSW_PLATFORM EFSW_PLATFORM_WIN32 + + #if ( defined( _MSCVER ) || defined( _MSC_VER ) ) + #define EFSW_COMPILER_MSVC + #endif + + /// Force windows target version above or equal to Windows Server 2008 or Windows Vista + #if _WIN32_WINNT < 0x600 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x600 + #endif +#elif defined( __FreeBSD__ ) || defined(__OpenBSD__) || defined( __NetBSD__ ) || defined( __DragonFly__ ) + #define EFSW_OS EFSW_OS_BSD + #define EFSW_PLATFORM EFSW_PLATFORM_KQUEUE + +#elif defined( __APPLE_CC__ ) || defined ( __APPLE__ ) + #include + + #if defined( __IPHONE__ ) || ( defined( TARGET_OS_IPHONE ) && TARGET_OS_IPHONE ) || ( defined( TARGET_IPHONE_SIMULATOR ) && TARGET_IPHONE_SIMULATOR ) + #define EFSW_OS EFSW_OS_IOS + #define EFSW_PLATFORM EFSW_PLATFORM_KQUEUE + #else + #define EFSW_OS EFSW_OS_MACOSX + + #if defined(EFSW_FSEVENTS_NOT_SUPPORTED) + #define EFSW_PLATFORM EFSW_PLATFORM_KQUEUE + #else + #define EFSW_PLATFORM EFSW_PLATFORM_FSEVENTS + #endif + #endif + +#elif defined(__linux__) + /// This includes Linux and Android + #ifndef EFSW_KQUEUE + #define EFSW_PLATFORM EFSW_PLATFORM_INOTIFY + #else + /// This is for testing libkqueue, sadly it doesnt work + #define EFSW_PLATFORM EFSW_PLATFORM_KQUEUE + #endif + + #if defined( __ANDROID__ ) || defined( ANDROID ) + #define EFSW_OS EFSW_OS_ANDROID + #else + #define EFSW_OS EFSW_OS_LINUX + #endif + +#else + #if defined( __SVR4 ) + #define EFSW_OS EFSW_OS_SOLARIS + #elif defined( __HAIKU__ ) || defined( __BEOS__ ) + #define EFSW_OS EFSW_OS_HAIKU + #endif + + /// Everything else + #define EFSW_PLATFORM EFSW_PLATFORM_GENERIC +#endif + +#if EFSW_PLATFORM != EFSW_PLATFORM_WIN32 + #define EFSW_PLATFORM_POSIX +#endif + +#if 1 == SOPHIST_pointer64 + #define EFSW_64BIT +#else + #define EFSW_32BIT +#endif + +#if defined(arm) || defined(__arm__) + #define EFSW_ARM +#endif + +#define efCOMMA , + +#define efSAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } +#define efSAFE_DELETE_ARRAY(p) { if(p) { delete [] (p); (p)=NULL; } } +#define efARRAY_SIZE(__array) ( sizeof(__array) / sizeof(__array[0]) ) + +} + +#endif diff --git a/lib/efsw/src/efsw/inotify-nosys.h b/lib/efsw/src/efsw/inotify-nosys.h new file mode 100644 index 0000000..75df5d3 --- /dev/null +++ b/lib/efsw/src/efsw/inotify-nosys.h @@ -0,0 +1,159 @@ +#ifndef _LINUX_INOTIFY_H +#define _LINUX_INOTIFY_H + +#include +#include +#include + +/* + * struct inotify_event - structure read from the inotify device for each event + * + * When you are watching a directory, you will receive the filename for events + * such as IN_CREATE, IN_DELETE, IN_OPEN, IN_CLOSE, ..., relative to the wd. + */ +struct inotify_event { + int wd; /* watch descriptor */ + uint32_t mask; /* watch mask */ + uint32_t cookie; /* cookie to synchronize two events */ + uint32_t len; /* length (including nulls) of name */ + char name __flexarr; /* stub for possible name */ +}; + +/* the following are legal, implemented events that user-space can watch for */ +#define IN_ACCESS 0x00000001 /* File was accessed */ +#define IN_MODIFY 0x00000002 /* File was modified */ +#define IN_ATTRIB 0x00000004 /* Metadata changed */ +#define IN_CLOSE_WRITE 0x00000008 /* Writtable file was closed */ +#define IN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed */ +#define IN_OPEN 0x00000020 /* File was opened */ +#define IN_MOVED_FROM 0x00000040 /* File was moved from X */ +#define IN_MOVED_TO 0x00000080 /* File was moved to Y */ +#define IN_CREATE 0x00000100 /* Subfile was created */ +#define IN_DELETE 0x00000200 /* Subfile was deleted */ +#define IN_DELETE_SELF 0x00000400 /* Self was deleted */ +#define IN_MOVE_SELF 0x00000800 /* Self was moved */ + +/* the following are legal events. they are sent as needed to any watch */ +#define IN_UNMOUNT 0x00002000 /* Backing fs was unmounted */ +#define IN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ +#define IN_IGNORED 0x00008000 /* File was ignored */ + +/* helper events */ +#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */ +#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* moves */ + +/* special flags */ +#define IN_ONLYDIR 0x01000000 /* only watch the path if it is a directory */ +#define IN_DONT_FOLLOW 0x02000000 /* don't follow a sym link */ +#define IN_MASK_ADD 0x20000000 /* add to the mask of an already existing watch */ +#define IN_ISDIR 0x40000000 /* event occurred against dir */ +#define IN_ONESHOT 0x80000000 /* only send event once */ + +/* + * All of the events - we build the list by hand so that we can add flags in + * the future and not break backward compatibility. Apps will get only the + * events that they originally wanted. Be sure to add new events here! + */ +#define IN_ALL_EVENTS (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \ + IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \ + IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF | \ + IN_MOVE_SELF) + +#if defined (__alpha__) +# define __NR_inotify_init 444 +# define __NR_inotify_add_watch 445 +# define __NR_inotify_rm_watch 446 + +#elif defined (__arm__) +# define __NR_inotify_init (__NR_SYSCALL_BASE+316) +# define __NR_inotify_add_watch (__NR_SYSCALL_BASE+317) +# define __NR_inotify_rm_watch (__NR_SYSCALL_BASE+318) + +#elif defined (__frv__) +# define __NR_inotify_init 291 +# define __NR_inotify_add_watch 292 +# define __NR_inotify_rm_watch 293 + +#elif defined(__i386__) +# define __NR_inotify_init 291 +# define __NR_inotify_add_watch 292 +# define __NR_inotify_rm_watch 293 + +#elif defined (__ia64__) +# define __NR_inotify_init 1277 +# define __NR_inotify_add_watch 1278 +# define __NR_inotify_rm_watch 1279 + +#elif defined (__mips__) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# define __NR_inotify_init (__NR_Linux + 284) +# define __NR_inotify_add_watch (__NR_Linux + 285) +# define __NR_inotify_rm_watch (__NR_Linux + 286) +# endif +# if _MIPS_SIM == _MIPS_SIM_ABI64 +# define __NR_inotify_init (__NR_Linux + 243) +# define __NR_inotify_add_watch (__NR_Linux + 243) +# define __NR_inotify_rm_watch (__NR_Linux + 243) +# endif +# if _MIPS_SIM == _MIPS_SIM_NABI32 +# define __NR_inotify_init (__NR_Linux + 247) +# define __NR_inotify_add_watch (__NR_Linux + 248) +# define __NR_inotify_rm_watch (__NR_Linux + 249) +# endif + +#elif defined(__parisc__) +# define __NR_inotify_init (__NR_Linux + 269) +# define __NR_inotify_add_watch (__NR_Linux + 270) +# define __NR_inotify_rm_watch (__NR_Linux + 271) + +#elif defined(__powerpc__) || defined(__powerpc64__) +# define __NR_inotify_init 275 +# define __NR_inotify_add_watch 276 +# define __NR_inotify_rm_watch 277 + +#elif defined (__s390__) +# define __NR_inotify_init 284 +# define __NR_inotify_add_watch 285 +# define __NR_inotify_rm_watch 286 + +#elif defined (__sh__) +# define __NR_inotify_init 290 +# define __NR_inotify_add_watch 291 +# define __NR_inotify_rm_watch 292 + +#elif defined (__sh64__) +# define __NR_inotify_init 318 +# define __NR_inotify_add_watch 319 +# define __NR_inotify_rm_watch 320 + +#elif defined (__sparc__) || defined (__sparc64__) +# define __NR_inotify_init 151 +# define __NR_inotify_add_watch 152 +# define __NR_inotify_rm_watch 156 + +#elif defined(__x86_64__) +# define __NR_inotify_init 253 +# define __NR_inotify_add_watch 254 +# define __NR_inotify_rm_watch 255 + +#else +# error "Unsupported architecture!" +#endif + +static inline int inotify_init (void) +{ + return syscall (__NR_inotify_init); +} + +static inline int inotify_add_watch (int fd, const char *name, uint32_t mask) +{ + return syscall (__NR_inotify_add_watch, fd, name, mask); +} + +static inline int inotify_rm_watch (int fd, uint32_t wd) +{ + return syscall (__NR_inotify_rm_watch, fd, wd); +} + + +#endif /* _LINUX_INOTIFY_H */ diff --git a/lib/efsw/src/efsw/platform/platformimpl.hpp b/lib/efsw/src/efsw/platform/platformimpl.hpp new file mode 100644 index 0000000..86a74ee --- /dev/null +++ b/lib/efsw/src/efsw/platform/platformimpl.hpp @@ -0,0 +1,20 @@ +#ifndef EFSW_PLATFORMIMPL_HPP +#define EFSW_PLATFORMIMPL_HPP + +#include + +#if defined( EFSW_PLATFORM_POSIX ) + #include + #include + #include + #include +#elif EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + #include + #include + #include + #include +#else + #error Thread, Mutex, and System not implemented for this platform. +#endif + +#endif diff --git a/lib/efsw/src/efsw/platform/posix/FileSystemImpl.cpp b/lib/efsw/src/efsw/platform/posix/FileSystemImpl.cpp new file mode 100644 index 0000000..e061b25 --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/FileSystemImpl.cpp @@ -0,0 +1,144 @@ +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +#include +#include +#include +#include + +#ifndef _DARWIN_FEATURE_64_BIT_INODE +#define _DARWIN_FEATURE_64_BIT_INODE +#endif + +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif + +#include +#include + +#if EFSW_OS == EFSW_OS_LINUX || EFSW_OS == EFSW_OS_SOLARIS || EFSW_OS == EFSW_OS_ANDROID +#include +#elif EFSW_OS == EFSW_OS_MACOSX || EFSW_OS == EFSW_OS_BSD || EFSW_OS == EFSW_OS_IOS +#include +#include +#endif + +/** Remote file systems codes */ +#define S_MAGIC_AFS 0x5346414F +#define S_MAGIC_AUFS 0x61756673 +#define S_MAGIC_CEPH 0x00C36400 +#define S_MAGIC_CIFS 0xFF534D42 +#define S_MAGIC_CODA 0x73757245 +#define S_MAGIC_FHGFS 0x19830326 +#define S_MAGIC_FUSEBLK 0x65735546 +#define S_MAGIC_FUSECTL 0x65735543 +#define S_MAGIC_GFS 0x01161970 +#define S_MAGIC_GPFS 0x47504653 +#define S_MAGIC_KAFS 0x6B414653 +#define S_MAGIC_LUSTRE 0x0BD00BD0 +#define S_MAGIC_NCP 0x564C +#define S_MAGIC_NFS 0x6969 +#define S_MAGIC_NFSD 0x6E667364 +#define S_MAGIC_OCFS2 0x7461636F +#define S_MAGIC_PANFS 0xAAD7AAEA +#define S_MAGIC_PIPEFS 0x50495045 +#define S_MAGIC_SMB 0x517B +#define S_MAGIC_SNFS 0xBEEFDEAD +#define S_MAGIC_VMHGFS 0xBACBACBC +#define S_MAGIC_VXFS 0xA501FCF5 + +namespace efsw { namespace Platform { + +FileInfoMap FileSystem::filesInfoFromPath( const std::string& path ) +{ + FileInfoMap files; + + DIR *dp; + struct dirent *dirp; + + if( ( dp = opendir( path.c_str() ) ) == NULL) + return files; + + while ( ( dirp = readdir(dp) ) != NULL) + { + if ( strcmp( dirp->d_name, ".." ) != 0 && strcmp( dirp->d_name, "." ) != 0 ) + { + std::string name( dirp->d_name ); + std::string fpath( path + name ); + + files[ name ] = FileInfo( fpath ); + } + } + + closedir(dp); + + return files; +} + +char FileSystem::getOSSlash() +{ + return '/'; +} + +bool FileSystem::isDirectory( const std::string& path ) +{ + struct stat st; + int res = stat( path.c_str(), &st ); + + if ( 0 == res ) + { + return static_cast( S_ISDIR(st.st_mode) ); + } + + return false; +} + +bool FileSystem::isRemoteFS( const std::string& directory ) +{ +#if EFSW_OS == EFSW_OS_LINUX || EFSW_OS == EFSW_OS_MACOSX || EFSW_OS == EFSW_OS_BSD || EFSW_OS == EFSW_OS_SOLARIS || EFSW_OS == EFSW_OS_ANDROID || EFSW_OS == EFSW_OS_IOS + struct statfs statfsbuf; + + statfs( directory.c_str(), &statfsbuf ); + + switch ( statfsbuf.f_type | 0UL ) + { + case S_MAGIC_AFS: /* 0x5346414F remote */ + case S_MAGIC_AUFS: /* 0x61756673 remote */ + case S_MAGIC_CEPH: /* 0x00C36400 remote */ + case S_MAGIC_CIFS: /* 0xFF534D42 remote */ + case S_MAGIC_CODA: /* 0x73757245 remote */ + case S_MAGIC_FHGFS: /* 0x19830326 remote */ + case S_MAGIC_FUSEBLK: /* 0x65735546 remote */ + case S_MAGIC_FUSECTL: /* 0x65735543 remote */ + case S_MAGIC_GFS: /* 0x01161970 remote */ + case S_MAGIC_GPFS: /* 0x47504653 remote */ + case S_MAGIC_KAFS: /* 0x6B414653 remote */ + case S_MAGIC_LUSTRE: /* 0x0BD00BD0 remote */ + case S_MAGIC_NCP: /* 0x564C remote */ + case S_MAGIC_NFS: /* 0x6969 remote */ + case S_MAGIC_NFSD: /* 0x6E667364 remote */ + case S_MAGIC_OCFS2: /* 0x7461636F remote */ + case S_MAGIC_PANFS: /* 0xAAD7AAEA remote */ + case S_MAGIC_PIPEFS: /* 0x50495045 remote */ + case S_MAGIC_SMB: /* 0x517B remote */ + case S_MAGIC_SNFS: /* 0xBEEFDEAD remote */ + case S_MAGIC_VMHGFS: /* 0xBACBACBC remote */ + case S_MAGIC_VXFS: /* 0xA501FCF5 remote */ + { + return true; + } + default: + { + return false; + } + } +#endif + + return false; +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/posix/FileSystemImpl.hpp b/lib/efsw/src/efsw/platform/posix/FileSystemImpl.hpp new file mode 100644 index 0000000..865b3f8 --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/FileSystemImpl.hpp @@ -0,0 +1,27 @@ +#ifndef EFSW_FILESYSTEMIMPLPOSIX_HPP +#define EFSW_FILESYSTEMIMPLPOSIX_HPP + +#include +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +namespace efsw { namespace Platform { + +class FileSystem +{ + public: + static FileInfoMap filesInfoFromPath( const std::string& path ); + + static char getOSSlash(); + + static bool isDirectory( const std::string& path ); + + static bool isRemoteFS( const std::string& directory ); +}; + +}} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/platform/posix/MutexImpl.cpp b/lib/efsw/src/efsw/platform/posix/MutexImpl.cpp new file mode 100644 index 0000000..6f2af5a --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/MutexImpl.cpp @@ -0,0 +1,32 @@ +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +namespace efsw { namespace Platform { + +MutexImpl::MutexImpl() +{ + pthread_mutexattr_t attributes; + pthread_mutexattr_init(&attributes); + pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mMutex, &attributes); +} + +MutexImpl::~MutexImpl() +{ + pthread_mutex_destroy(&mMutex); +} + +void MutexImpl::lock() +{ + pthread_mutex_lock(&mMutex); +} + +void MutexImpl::unlock() +{ + pthread_mutex_unlock(&mMutex); +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/posix/MutexImpl.hpp b/lib/efsw/src/efsw/platform/posix/MutexImpl.hpp new file mode 100644 index 0000000..d51eecb --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/MutexImpl.hpp @@ -0,0 +1,31 @@ +#ifndef EFSW_MUTEXIMPLPOSIX_HPP +#define EFSW_MUTEXIMPLPOSIX_HPP + +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +#include + +namespace efsw { namespace Platform { + +class MutexImpl +{ + public: + MutexImpl(); + + ~MutexImpl(); + + void lock(); + + void unlock(); + private: + pthread_mutex_t mMutex; +}; + +}} + +#endif + +#endif + diff --git a/lib/efsw/src/efsw/platform/posix/SystemImpl.cpp b/lib/efsw/src/efsw/platform/posix/SystemImpl.cpp new file mode 100644 index 0000000..22e3709 --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/SystemImpl.cpp @@ -0,0 +1,180 @@ +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +#include +#include +#include +#include +#include + +#include +#include + +#if EFSW_OS == EFSW_OS_MACOSX + #include +#elif EFSW_OS == EFSW_OS_LINUX || EFSW_OS == EFSW_OS_ANDROID + #include + #include +#elif EFSW_OS == EFSW_OS_HAIKU + #include + #include +#elif EFSW_OS == EFSW_OS_SOLARIS + #include +#elif EFSW_OS == EFSW_OS_BSD + #include +#endif + +namespace efsw { namespace Platform { + +void System::sleep( const unsigned long& ms ) +{ + // usleep( static_cast( ms * 1000 ) ); + + // usleep is not reliable enough (it might block the + // whole process instead of just the current thread) + // so we must use pthread_cond_timedwait instead + + // this implementation is inspired from Qt + // and taken from SFML + + unsigned long long usecs = ms * 1000; + + // get the current time + timeval tv; + gettimeofday(&tv, NULL); + + // construct the time limit (current time + time to wait) + timespec ti; + ti.tv_nsec = (tv.tv_usec + (usecs % 1000000)) * 1000; + ti.tv_sec = tv.tv_sec + (usecs / 1000000) + (ti.tv_nsec / 1000000000); + ti.tv_nsec %= 1000000000; + + // create a mutex and thread condition + pthread_mutex_t mutex; + pthread_mutex_init(&mutex, 0); + pthread_cond_t condition; + pthread_cond_init(&condition, 0); + + // wait... + pthread_mutex_lock(&mutex); + pthread_cond_timedwait(&condition, &mutex, &ti); + pthread_mutex_unlock(&mutex); + + // destroy the mutex and condition + pthread_cond_destroy(&condition); +} + +std::string System::getProcessPath() +{ +#if EFSW_OS == EFSW_OS_MACOSX + char exe_file[FILENAME_MAX + 1]; + + CFBundleRef mainBundle = CFBundleGetMainBundle(); + + if (mainBundle) + { + CFURLRef mainURL = CFBundleCopyBundleURL(mainBundle); + + if (mainURL) + { + int ok = CFURLGetFileSystemRepresentation ( mainURL, (Boolean) true, (UInt8*)exe_file, FILENAME_MAX ); + + if (ok) + { + return std::string(exe_file) + "/"; + } + } + } + + return "./"; +#elif EFSW_OS == EFSW_OS_LINUX + char exe_file[FILENAME_MAX + 1]; + + int size; + + size = readlink("/proc/self/exe", exe_file, FILENAME_MAX); + + if (size < 0) + { + return std::string( "./" ); + } + else + { + exe_file[size] = '\0'; + return std::string( dirname( exe_file ) ) + "/"; + } + +#elif EFSW_OS == EFSW_OS_BSD + int mib[4]; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = -1; + char buf[1024]; + size_t cb = sizeof(buf); + sysctl(mib, 4, buf, &cb, NULL, 0); + + return FileSystem::pathRemoveFileName( std::string( buf ) ); + +#elif EFSW_OS == EFSW_OS_SOLARIS + return FileSystem::pathRemoveFileName( std::string( getexecname() ) ); + +#elif EFSW_OS == EFSW_OS_HAIKU + image_info info; + int32 cookie = 0; + + while ( B_OK == get_next_image_info( 0, &cookie, &info ) ) + { + if ( info.type == B_APP_IMAGE ) + break; + } + + return FileSystem::pathRemoveFileName( std::string( info.name ) ); + +#elif EFSW_OS == EFSW_OS_ANDROID + return "/sdcard/"; + +#else + #warning getProcessPath() not implemented on this platform. ( will return "./" ) + return "./"; + +#endif +} + +void System::maxFD() +{ + static bool maxed = false; + + if ( !maxed ) + { + struct rlimit limit; + getrlimit( RLIMIT_NOFILE, &limit ); + limit.rlim_cur = limit.rlim_max; + setrlimit( RLIMIT_NOFILE, &limit ); + + getrlimit( RLIMIT_NOFILE, &limit ); + + efDEBUG( "File descriptor limit %ld\n", limit.rlim_cur ); + + maxed = true; + } +} + +Uint64 System::getMaxFD() +{ + static rlim_t max_fd = 0; + + if ( max_fd == 0 ) + { + struct rlimit limit; + getrlimit( RLIMIT_NOFILE, &limit ); + max_fd = limit.rlim_cur; + } + + return max_fd; +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/posix/SystemImpl.hpp b/lib/efsw/src/efsw/platform/posix/SystemImpl.hpp new file mode 100644 index 0000000..3473410 --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/SystemImpl.hpp @@ -0,0 +1,26 @@ +#ifndef EFSW_SYSTEMIMPLPOSIX_HPP +#define EFSW_SYSTEMIMPLPOSIX_HPP + +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +namespace efsw { namespace Platform { + +class System +{ + public: + static void sleep( const unsigned long& ms ); + + static std::string getProcessPath(); + + static void maxFD(); + + static Uint64 getMaxFD(); +}; + +}} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/platform/posix/ThreadImpl.cpp b/lib/efsw/src/efsw/platform/posix/ThreadImpl.cpp new file mode 100644 index 0000000..2d3671d --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/ThreadImpl.cpp @@ -0,0 +1,68 @@ +#include +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +#include +#include +#include + +namespace efsw { namespace Platform { + +ThreadImpl::ThreadImpl( Thread * owner ) : + mIsActive(false) +{ + mIsActive = pthread_create( &mThread, NULL, &ThreadImpl::entryPoint, owner ) == 0; + + if ( !mIsActive ) + { + efDEBUG( "Failed to create thread\n" ); + } +} + +void ThreadImpl::wait() +{ + // Wait for the thread to finish, no timeout + if ( mIsActive ) + { + assert( pthread_equal( pthread_self(), mThread ) == 0 ); + + pthread_join( mThread, NULL ); + + mIsActive = false; // Reset the thread state + } +} + +void ThreadImpl::terminate() +{ + if ( mIsActive ) + { + #if !defined( __ANDROID__ ) && !defined( ANDROID ) + pthread_cancel( mThread ); + #else + pthread_kill( mThread , SIGUSR1 ); + #endif + + mIsActive = false; + } +} + +void * ThreadImpl::entryPoint( void * userData ) +{ + // The Thread instance is stored in the user data + Thread * owner = static_cast( userData ); + + // Tell the thread to handle cancel requests immediatly + #ifdef PTHREAD_CANCEL_ASYNCHRONOUS + pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS, NULL ); + #endif + + // Forward to the owner + owner->run(); + + return NULL; +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/posix/ThreadImpl.hpp b/lib/efsw/src/efsw/platform/posix/ThreadImpl.hpp new file mode 100644 index 0000000..be6dc1b --- /dev/null +++ b/lib/efsw/src/efsw/platform/posix/ThreadImpl.hpp @@ -0,0 +1,35 @@ +#ifndef EFSW_THREADIMPLPOSIX_HPP +#define EFSW_THREADIMPLPOSIX_HPP + +#include + +#if defined( EFSW_PLATFORM_POSIX ) + +#include + +namespace efsw { + +class Thread; + +namespace Platform { + +class ThreadImpl +{ + public: + ThreadImpl( Thread * owner ); + + void wait(); + + void terminate(); + protected: + static void * entryPoint( void* userData ); + + pthread_t mThread; + bool mIsActive; +}; + +}} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/platform/win/FileSystemImpl.cpp b/lib/efsw/src/efsw/platform/win/FileSystemImpl.cpp new file mode 100644 index 0000000..376a474 --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/FileSystemImpl.cpp @@ -0,0 +1,89 @@ +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +#ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN +#endif +#include + +#ifndef EFSW_COMPILER_MSVC +#include +#endif + +namespace efsw { namespace Platform { + +FileInfoMap FileSystem::filesInfoFromPath( const std::string& path ) +{ + FileInfoMap files; + + String tpath( path ); + + if ( tpath[ tpath.size() - 1 ] == '/' || tpath[ tpath.size() - 1 ] == '\\' ) + { + tpath += "*"; + } + else + { + tpath += "\\*"; + } + + WIN32_FIND_DATAW findFileData; + HANDLE hFind = FindFirstFileW( (LPCWSTR)tpath.toWideString().c_str(), &findFileData ); + + if( hFind != INVALID_HANDLE_VALUE ) + { + std::string name( String( findFileData.cFileName ).toUtf8() ); + std::string fpath( path + name ); + + if ( name != "." && name != ".." ) + { + files[ name ] = FileInfo( fpath ); + } + + while( FindNextFileW( hFind, &findFileData ) ) + { + name = String( findFileData.cFileName ).toUtf8(); + fpath = path + name; + + if ( name != "." && name != ".." ) + { + files[ name ] = FileInfo( fpath ); + } + } + + FindClose( hFind ); + } + + return files; +} + +char FileSystem::getOSSlash() +{ + return '\\'; +} + +bool FileSystem::isDirectory( const std::string& path ) +{ + return 0 != ( GetFileAttributesW( String( path ).toWideString().c_str() ) & FILE_ATTRIBUTE_DIRECTORY ); +} + +bool FileSystem::isRemoteFS( const std::string& directory ) +{ + if ((directory[0] == '\\' || directory[0] == '/') && + (directory[1] == '\\' || directory[1] == '/')) + { + return true; + } + + if ( directory.size() >= 3 ) + { + return 4 == GetDriveTypeA( directory.substr( 0, 3 ).c_str() ); + } + + return false; +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/win/FileSystemImpl.hpp b/lib/efsw/src/efsw/platform/win/FileSystemImpl.hpp new file mode 100644 index 0000000..597edc4 --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/FileSystemImpl.hpp @@ -0,0 +1,28 @@ +#ifndef EFSW_FILESYSTEMIMPLWIN_HPP +#define EFSW_FILESYSTEMIMPLWIN_HPP + +#include +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +namespace efsw { namespace Platform { + +class FileSystem +{ + public: + static FileInfoMap filesInfoFromPath( const std::string& path ); + + static char getOSSlash(); + + static bool isDirectory( const std::string& path ); + + static bool isRemoteFS( const std::string& directory ); +}; + +}} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/platform/win/MutexImpl.cpp b/lib/efsw/src/efsw/platform/win/MutexImpl.cpp new file mode 100644 index 0000000..0c8c36d --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/MutexImpl.cpp @@ -0,0 +1,29 @@ +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +namespace efsw { namespace Platform { + +MutexImpl::MutexImpl() +{ + InitializeCriticalSection(&mMutex); +} + +MutexImpl::~MutexImpl() +{ + DeleteCriticalSection(&mMutex); +} + +void MutexImpl::lock() +{ + EnterCriticalSection(&mMutex); +} + +void MutexImpl::unlock() +{ + LeaveCriticalSection(&mMutex); +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/win/MutexImpl.hpp b/lib/efsw/src/efsw/platform/win/MutexImpl.hpp new file mode 100644 index 0000000..da1e20c --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/MutexImpl.hpp @@ -0,0 +1,34 @@ +#ifndef EFSW_MUTEXIMPLWIN_HPP +#define EFSW_MUTEXIMPLWIN_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +#ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN +#endif +#include + +namespace efsw { namespace Platform { + +class MutexImpl +{ + public: + MutexImpl(); + + ~MutexImpl(); + + void lock(); + + void unlock(); + private: + CRITICAL_SECTION mMutex; +}; + +}} + +#endif + +#endif + diff --git a/lib/efsw/src/efsw/platform/win/SystemImpl.cpp b/lib/efsw/src/efsw/platform/win/SystemImpl.cpp new file mode 100644 index 0000000..ddbe1e5 --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/SystemImpl.cpp @@ -0,0 +1,50 @@ +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +#ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN +#endif +#include +#include + +namespace efsw { namespace Platform { + +void System::sleep( const unsigned long& ms ) +{ + ::Sleep( ms ); +} + +std::string System::getProcessPath() +{ + // Get path to executable: + WCHAR szDrive[_MAX_DRIVE]; + WCHAR szDir[_MAX_DIR]; + WCHAR szFilename[_MAX_DIR]; + WCHAR szExt[_MAX_DIR]; + std::wstring dllName( _MAX_DIR, 0 ); + + GetModuleFileNameW(0, &dllName[0], _MAX_PATH); + + #ifdef EFSW_COMPILER_MSVC + _wsplitpath_s( dllName.c_str(), szDrive, _MAX_DRIVE, szDir, _MAX_DIR, szFilename, _MAX_DIR, szExt, _MAX_DIR ); + #else + _wsplitpath( dllName.c_str(), szDrive, szDir, szFilename, szExt); + #endif + + return String( szDrive ).toUtf8() + String( szDir ).toUtf8(); +} + +void System::maxFD() +{ +} + +Uint64 System::getMaxFD() +{ // Number of ReadDirectory per thread + return 60; +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/win/SystemImpl.hpp b/lib/efsw/src/efsw/platform/win/SystemImpl.hpp new file mode 100644 index 0000000..2f785e3 --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/SystemImpl.hpp @@ -0,0 +1,26 @@ +#ifndef EFSW_SYSTEMIMPLWIN_HPP +#define EFSW_SYSTEMIMPLWIN_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +namespace efsw { namespace Platform { + +class System +{ + public: + static void sleep( const unsigned long& ms ); + + static std::string getProcessPath(); + + static void maxFD(); + + static Uint64 getMaxFD(); +}; + +}} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/platform/win/ThreadImpl.cpp b/lib/efsw/src/efsw/platform/win/ThreadImpl.cpp new file mode 100644 index 0000000..48c9456 --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/ThreadImpl.cpp @@ -0,0 +1,64 @@ +#include +#include +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +#include + +namespace efsw { namespace Platform { + +ThreadImpl::ThreadImpl( Thread *owner ) +{ + mThread = reinterpret_cast( _beginthreadex( NULL, 0, &ThreadImpl::entryPoint, owner, 0, &mThreadId ) ); + + if ( !mThread ) + { + efDEBUG( "Failed to create thread\n" ); + } +} + +ThreadImpl::~ThreadImpl() +{ + if ( mThread ) + { + CloseHandle( mThread ); + } +} + +void ThreadImpl::wait() +{ + // Wait for the thread to finish, no timeout + if ( mThread ) + { + assert( mThreadId != GetCurrentThreadId() ); // A thread cannot wait for itself! + + WaitForSingleObject( mThread, INFINITE ); + } +} + +void ThreadImpl::terminate() +{ + if ( mThread ) + { + TerminateThread( mThread, 0 ); + } +} + +unsigned int __stdcall ThreadImpl::entryPoint( void * userData ) +{ + // The Thread instance is stored in the user data + Thread * owner = static_cast( userData ); + + // Forward to the owner + owner->run(); + + // Optional, but it is cleaner + _endthreadex(0); + + return 0; +} + +}} + +#endif diff --git a/lib/efsw/src/efsw/platform/win/ThreadImpl.hpp b/lib/efsw/src/efsw/platform/win/ThreadImpl.hpp new file mode 100644 index 0000000..45e4505 --- /dev/null +++ b/lib/efsw/src/efsw/platform/win/ThreadImpl.hpp @@ -0,0 +1,41 @@ +#ifndef EFSW_THREADIMPLWIN_HPP +#define EFSW_THREADIMPLWIN_HPP + +#include + +#if EFSW_PLATFORM == EFSW_PLATFORM_WIN32 + +#ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN +#endif +#include +#include + +namespace efsw { + +class Thread; + +namespace Platform { + +class ThreadImpl +{ + public: + ThreadImpl( Thread * owner ); + + ~ThreadImpl(); + + void wait(); + + void terminate(); + protected: + static unsigned int __stdcall entryPoint(void* userData); + + HANDLE mThread; + unsigned int mThreadId; +}; + +}} + +#endif + +#endif diff --git a/lib/efsw/src/efsw/sophist.h b/lib/efsw/src/efsw/sophist.h new file mode 100644 index 0000000..82e5c36 --- /dev/null +++ b/lib/efsw/src/efsw/sophist.h @@ -0,0 +1,147 @@ +/* sophist.h - 0.3 - public domain - Sean Barrett 2010 +** Knowledge drawn from Brian Hook's posh.h and http://predef.sourceforge.net +** Sophist provides portable types; you typedef/#define them to your own names +** +** defines: +** - SOPHIST_endian - either SOPHIST_little_endian or SOPHIST_big_endian +** - SOPHIST_has_64 - either 0 or 1; if 0, int64 types aren't defined +** - SOPHIST_pointer64 - either 0 or 1; if 1, pointer is 64-bit +** +** - SOPHIST_intptr, SOPHIST_uintptr - integer same size as pointer +** - SOPHIST_int8, SOPHIST_uint8, SOPHIST_int16, SOPHIST_uint16 +** - SOPHIST_int32, SOPHIST_uint32, SOPHIST_int64, SOPHIST_uint64 +** - SOPHIST_int64_constant(number) - macros for creating 64-bit +** - SOPHIST_uint64_constant(number) integer constants +** - SOPHIST_printf_format64 - string for printf format for int64 +*/ + +#ifndef __INCLUDE_SOPHIST_H__ +#define __INCLUDE_SOPHIST_H__ + +#define SOPHIST_compiletime_assert(name,val) \ + typedef int SOPHIST__assert##name[(val) ? 1 : -1] + +/* define a couple synthetic rules to make code more readable */ +#if (defined(__sparc__) || defined(__sparc)) && \ + (defined(__arch64__) || defined(__sparcv9) || defined(__sparc_v9__)) + #define SOPHIST_sparc64 +#endif + +#if (defined(linux) || defined(__linux__)) && \ + (defined(__alpha)||defined(__alpha__)||defined(__x86_64__)||defined(_M_X64)) + #define SOPHIST_linux64 +#endif + +/* basic types */ +typedef signed char SOPHIST_int8; +typedef unsigned char SOPHIST_uint8; + +typedef signed short SOPHIST_int16; +typedef unsigned short SOPHIST_uint16; + +#ifdef __palmos__ + typedef signed long SOPHIST_int32; + typedef unsigned long SOPHIST_uint32; +#else + typedef signed int SOPHIST_int32; + typedef unsigned int SOPHIST_uint32; +#endif + +#ifndef SOPHIST_NO_64 + #if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) \ + || (defined(__alpha) && defined(__DECC)) + + typedef signed __int64 SOPHIST_int64; + typedef unsigned __int64 SOPHIST_uint64; + #define SOPHIST_has_64 1 + #define SOPHIST_int64_constant(x) (x##i64) + #define SOPHIST_uint64_constant(x) (x##ui64) + #define SOPHIST_printf_format64 "I64" + + #elif defined(__LP64__) || defined(__powerpc64__) || defined(SOPHIST_sparc64) + + typedef signed long SOPHIST_int64; + typedef unsigned long SOPHIST_uint64; + + #define SOPHIST_has_64 1 + #define SOPHIST_int64_constant(x) ((SOPHIST_int64) x) + #define SOPHIST_uint64_constant(x) ((SOPHIST_uint64) x) + #define SOPHIST_printf_format64 "l" + + #elif defined(_LONG_LONG) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) \ + || defined(__GNUC__) || defined(__MWERKS__) || defined(__APPLE_CC__) \ + || defined(sgi) || defined (__sgi) || defined(__sgi__) \ + || defined(_CRAYC) + + typedef signed long long SOPHIST_int64; + typedef unsigned long long SOPHIST_uint64; + + #define SOPHIST_has_64 1 + #define SOPHIST_int64_constant(x) (x##LL) + #define SOPHIST_uint64_constant(x) (x##ULL) + #define SOPHIST_printf_format64 "ll" + #endif +#endif + +#ifndef SOPHIST_has_64 +#define SOPHIST_has_64 0 +#endif + +SOPHIST_compiletime_assert( int8 , sizeof(SOPHIST_int8 ) == 1); +SOPHIST_compiletime_assert(uint16, sizeof(SOPHIST_int16) == 2); +SOPHIST_compiletime_assert( int32, sizeof(SOPHIST_int32 ) == 4); +SOPHIST_compiletime_assert(uint32, sizeof(SOPHIST_uint32) == 4); + +#if SOPHIST_has_64 + SOPHIST_compiletime_assert( int64, sizeof(SOPHIST_int64 ) == 8); + SOPHIST_compiletime_assert(uint64, sizeof(SOPHIST_uint64) == 8); +#endif + +/* determine whether pointers are 64-bit */ + +#if defined(SOPHIST_linux64) || defined(SOPHIST_sparc64) \ + || defined(__osf__) || (defined(_WIN64) && !defined(_XBOX)) \ + || defined(__64BIT__) \ + || defined(__LP64) || defined(__LP64__) || defined(_LP64) \ + || defined(_ADDR64) || defined(_CRAYC) \ + + #define SOPHIST_pointer64 1 + + SOPHIST_compiletime_assert(pointer64, sizeof(void*) == 8); + + typedef SOPHIST_int64 SOPHIST_intptr; + typedef SOPHIST_uint64 SOPHIST_uintptr; +#else + + #define SOPHIST_pointer64 0 + + SOPHIST_compiletime_assert(pointer64, sizeof(void*) <= 4); + + /* do we care about pointers that are only 16-bit? */ + typedef SOPHIST_int32 SOPHIST_intptr; + typedef SOPHIST_uint32 SOPHIST_uintptr; + +#endif + +SOPHIST_compiletime_assert(intptr, sizeof(SOPHIST_intptr) == sizeof(char *)); + +/* enumerate known little endian cases; fallback to big-endian */ + +#define SOPHIST_little_endian 1 +#define SOPHIST_big_endian 2 + +#if defined(__386__) || defined(i386) || defined(__i386__) \ + || defined(__X86) || defined(_M_IX86) \ + || defined(_M_X64) || defined(__x86_64__) \ + || defined(alpha) || defined(__alpha) || defined(__alpha__) \ + || defined(_M_ALPHA) \ + || defined(ARM) || defined(_ARM) || defined(__arm__) \ + || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) \ + || defined(_WIN32_WCE) || defined(__NT__) \ + || defined(__MIPSEL__) + #define SOPHIST_endian SOPHIST_little_endian +#else + #define SOPHIST_endian SOPHIST_big_endian +#endif + +#endif /* __INCLUDE_SOPHIST_H__ */ diff --git a/lib/efsw/src/test/efsw-test.cpp b/lib/efsw/src/test/efsw-test.cpp new file mode 100644 index 0000000..21412b6 --- /dev/null +++ b/lib/efsw/src/test/efsw-test.cpp @@ -0,0 +1,151 @@ +#include +#include +#include +#include +#include + +bool STOP = false; + +void sigend(int signal) +{ + std::cout << std::endl << "Bye bye" << std::endl; + STOP = true; +} + +/// Processes a file action +class UpdateListener : public efsw::FileWatchListener +{ + public: + UpdateListener() {} + + std::string getActionName( efsw::Action action ) + { + switch ( action ) + { + case efsw::Actions::Add: return "Add"; + case efsw::Actions::Modified: return "Modified"; + case efsw::Actions::Delete: return "Delete"; + case efsw::Actions::Moved: return "Moved"; + default: return "Bad Action"; + } + } + + void handleFileAction( efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename = "" ) + { + std::cout << "DIR (" << dir + ") FILE (" + ( oldFilename.empty() ? "" : "from file " + oldFilename + " to " ) + filename + ") has event " << getActionName( action ) << std::endl; + } +}; + +efsw::WatchID handleWatchID( efsw::WatchID watchid ) +{ + switch ( watchid ) + { + case efsw::Errors::FileNotFound: + case efsw::Errors::FileRepeated: + case efsw::Errors::FileOutOfScope: + case efsw::Errors::FileRemote: + case efsw::Errors::Unspecified: + { + std::cout << efsw::Errors::Log::getLastErrorLog().c_str() << std::endl; + break; + } + default: + { + std::cout << "Added WatchID: " << watchid << std::endl; + } + } + + return watchid; +} + +int main(int argc, char **argv) +{ + signal( SIGABRT , sigend ); + signal( SIGINT , sigend ); + signal( SIGTERM , sigend ); + + std::cout << "Press ^C to exit demo" << std::endl; + + bool commonTest = true; + bool useGeneric = false; + std::string path; + + if ( argc >= 2 ) + { + path = std::string( argv[1] ); + + if ( efsw::FileSystem::isDirectory( path ) ) + { + commonTest = false; + } + + if ( argc >= 3 ) + { + if ( std::string( argv[2] ) == "true" ) + { + useGeneric = true; + } + } + } + + UpdateListener * ul = new UpdateListener(); + + /// create the file watcher object + efsw::FileWatcher fileWatcher( useGeneric ); + + fileWatcher.followSymlinks( false ); + fileWatcher.allowOutOfScopeLinks( false ); + + if ( commonTest ) + { + std::string CurPath( efsw::System::getProcessPath() ); + + std::cout << "CurPath: " << CurPath.c_str() << std::endl; + + /// add a watch to the system + handleWatchID( fileWatcher.addWatch( CurPath + "test", ul, true ) ); + + /// starts watching + fileWatcher.watch(); + + /// adds another watch after started watching... + efsw::System::sleep( 100 ); + + efsw::WatchID watchID = handleWatchID( fileWatcher.addWatch( CurPath + "test2", ul, true ) ); + + /// delete the watch + if ( watchID > 0 ) + { + efsw::System::sleep( 1000 ); + fileWatcher.removeWatch( watchID ); + } + } + else + { + efsw::WatchID err; + + if ( ( err = fileWatcher.addWatch( path, ul, true ) ) > 0 ) + { + fileWatcher.watch(); + + std::cout << "Watching directory: " << path.c_str() << std::endl; + + if ( useGeneric ) + { + std::cout << "Using generic backend watcher" << std::endl; + } + } + else + { + std::cout << "Error trying to watch directory: " << path.c_str() << std::endl; + std::cout << efsw::Errors::Log::getLastErrorLog().c_str() << std::endl; + } + } + + while( !STOP ) + { + efsw::System::sleep( 100 ); + } + + return 0; +} diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..3e05462 --- /dev/null +++ b/main.cpp @@ -0,0 +1,60 @@ +/* Copyright (C) Sean McArdle - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + * Written by Sean McArdle , Jun 21, 2017 + */ + +#include +#include +#include +#include "efsw/efsw.hpp" + + +class UpdateListener : public efsw::FileWatchListener +{ +public: + UpdateListener() {} + + void handleFileAction( efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename = "" ) + { + switch( action ) + { + case efsw::Actions::Add: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Added" << '\n'; + break; + case efsw::Actions::Delete: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Delete" << '\n'; + break; + case efsw::Actions::Modified: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Modified" << '\n'; + break; + case efsw::Actions::Moved: + std::cout << "DIR (" << dir << ") FILE (" << filename << ") has event Moved from (" << oldFilename << ")" << '\n'; + break; + default: + std::cout << "Should never happen!" << '\n'; + } + } +}; + + +int main() { + std::cout << "Hello, World!" << '\n'; + + auto fwatcher = new efsw::FileWatcher(); + auto listener = new UpdateListener(); + + // Add a folder to watch, and get the efsw::WatchID + // It will watch the /tmp folder recursively ( the third parameter indicates that is recursive ) + // Reporting the files and directories changes to the instance of the listener + efsw::WatchID watchID = fwatcher->addWatch( "~/Logs", listener, true ); + + // Start watching asynchronously the directories + fwatcher->watch(); + + while (true) { + std::this_thread::sleep_for(std::chrono::nanoseconds(100)); + } + + return 0; +} \ No newline at end of file