#include #include #include #include #include #include #include #include bool is_ics(const std::filesystem::path filepath) { return filepath.extension() == ".ics"; } namespace db { FSWatcher::FSWatcher(sql::Database *db, const std::string &directory) : m_db(db), m_directory(directory) {} void FSWatcher::run() { // Parse the directory to watch std::filesystem::path path(m_directory); // Set the event handler which will be used to process particular events auto create_entry = [&](inotify::Notification notification) { create_event(notification.path); }; auto modify_entry = [&](inotify::Notification notification) { modify_event(notification.path); }; auto remove_entry = [&](inotify::Notification notification) { delete_event(notification.path); }; /* auto handleUnexpectedNotification = [](inotify::Notification notification) { std::cout << "Event " << notification.event << " on " << notification.path << " at " << notification.time.time_since_epoch().count() << " was triggered, but was not expected" << std::endl; }; */ auto file_creation = { inotify::Event::create }; auto file_deletion = { inotify::Event::remove }; auto file_modification = { inotify::Event::moved_to }; // The notifier is configured to watch the parsed path for the defined events. Particular files // or paths can be ignored(once). auto notifier = inotify::BuildNotifier() .watchPathRecursively(path) .onEvents(file_creation, create_entry) .onEvents(file_modification, modify_entry) .onEvents(file_deletion, remove_entry); // The event loop is started in a separate thread context. notifier.run(); } void FSWatcher::create_event(const std::string event_file) { if(!is_ics(event_file)) return; ical::IcalObject* object = new ical::IcalObject(); util::parse_main_component(object, util::parse_ics_file(event_file), event_file); DEBUG << "Created Event " << event_file; db::insert_events(m_db, object); } void FSWatcher::modify_event(const std::string event_file) { if(!is_ics(event_file)) return; ical::IcalObject* object = new ical::IcalObject(); util::parse_main_component(object, util::parse_ics_file(event_file), event_file); DEBUG << "Modified Event " << event_file; db::insert_events(m_db, object); } void FSWatcher::delete_event(const std::string event_file) { if(!is_ics(event_file)) return; DEBUG << "Removing Event " << event_file; db::remove_events(m_db, event_file); } }