diff options
Diffstat (limited to 'src/event_manager.cpp')
-rw-r--r-- | src/event_manager.cpp | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/src/event_manager.cpp b/src/event_manager.cpp index 6e7d302..57a8478 100644 --- a/src/event_manager.cpp +++ b/src/event_manager.cpp @@ -17,6 +17,7 @@ #include "config.h" #include "event.hpp" #include "event_manager.hpp" +#include "event_serialize.hpp" #include <experimental/filesystem> @@ -66,13 +67,62 @@ void Manager::create(const std::string& eventName, // event. if (eventQueue.size() == MAX_EVENTS) { + fs::path eventPath(EVENTS_PERSIST_PATH); + eventPath /= eventName; + eventPath /= std::to_string(eventQueue.front()->timestamp()); eventQueue.pop(); + std::error_code ec; + fs::remove(eventPath, ec); } - eventQueue.emplace(std::make_unique<Entry>(objPath, - ms, // Milliseconds since 1970 - std::move(msg), - std::move(additionalData))); + auto event = + std::make_unique<Entry>(objPath, + ms, // Milliseconds since 1970 + std::move(msg), std::move(additionalData)); + serialize(*event, eventName); + eventQueue.push(std::move(event)); +} + +void Manager::restore() +{ + if (!fs::exists(EVENTS_PERSIST_PATH) || fs::is_empty(EVENTS_PERSIST_PATH)) + { + return; + } + + for (auto& eventFile : + fs::recursive_directory_iterator(EVENTS_PERSIST_PATH)) + { + if (!fs::is_regular_file(eventFile)) + { + continue; + } + + EventQueue events; + + auto eventPath = eventFile.path().string(); + auto pos1 = eventPath.rfind("/"); + auto pos2 = eventPath.rfind("/", pos1 - 1) + 1; + auto eventName = eventPath.substr(pos2, (pos1 - pos2)); + auto validEvent = false; + auto timestamp = eventFile.path().filename().string(); + auto tsNum = std::stoll(timestamp); + auto objPath = + std::string(OBJ_EVENT) + '/' + eventName + '/' + timestamp; + + auto event = std::make_unique<Entry>(objPath, tsNum); + if (deserialize(eventFile.path(), *event)) + { + event->emit_object_added(); + events.push(std::move(event)); + validEvent = true; + } + + if (validEvent) + { + eventMap[eventName] = std::move(events); + } + } } Manager& getManager() |