#ifndef DIRMONINVOKER_H_W09J90F0 #define DIRMONINVOKER_H_W09J90F0 #include #include #include #ifdef BUILD_AS_PLUGINS #include "uscxml/plugins/Plugins.h" #endif namespace uscxml { class DirectoryWatchMonitor; class DirectoryWatch { public: enum Action { ADDED = 1, MODIFIED = 2, DELETED = 4, EXISTING = 8 }; DirectoryWatch(const std::string& dir, bool recurse = false) : _dir(dir), _recurse(recurse), _lastChecked(0) {} void addMonitor(DirectoryWatchMonitor* monitor) { _monitors.insert(monitor); } void removeMonitor(DirectoryWatchMonitor* monitor) { _monitors.erase(monitor); } void updateEntries(bool reportAsExisting = false); void reportAsDeleted(); protected: DirectoryWatch(const std::string& dir, const std::string& relDir) : _dir(dir), _relDir(relDir), _recurse(true), _lastChecked(0) {} std::string _dir; std::string _relDir; bool _recurse; std::map _knownEntries; std::map _knownDirs; std::set _monitors; typedef std::set _monitors_t; time_t _lastChecked; }; class DirectoryWatchMonitor { public: virtual void handleChanges(DirectoryWatch::Action action, const std::string dir, const std::string file, struct stat fileStat) = 0; }; class DirMonInvoker : public InvokerImpl, public DirectoryWatchMonitor { public: DirMonInvoker(); virtual ~DirMonInvoker(); virtual boost::shared_ptr create(Interpreter* interpreter); virtual std::set getNames() { std::set names; names.insert("dirmon"); names.insert("DirectoryMonitor"); names.insert("http://uscxml.tk.informatik.tu-darmstadt.de/#dirmon"); return names; } virtual Data getDataModelVariables(); virtual void send(const SendRequest& req); virtual void cancel(const std::string sendId); virtual void invoke(const InvokeRequest& req); virtual void handleChanges(DirectoryWatch::Action action, const std::string dir, const std::string file, struct stat fileStat); static void run(void* instance); protected: bool _reportExisting; bool _reportHidden; bool _recurse; std::string _dir; std::set _suffixes; bool _isRunning; tthread::thread* _thread; tthread::recursive_mutex _mutex; DirectoryWatch* _watcher; }; #ifdef BUILD_AS_PLUGINS PLUMA_INHERIT_PROVIDER(DirMonInvoker, InvokerImpl); #endif } #endif /* end of include guard: DIRMONINVOKER_H_W09J90F0 */