Mercurial > minori
diff dep/animia/src/strategist.cc @ 138:28842a8d0c6b
dep/animia: huge refactor (again...)
but this time, it actually compiles! and it WORKS! (on win32... not sure about
other platforms...)
configuring players is still not supported: at some point I'll prune something
up...
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sun, 12 Nov 2023 04:53:19 -0500 |
parents | |
children | 478f3b366199 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dep/animia/src/strategist.cc Sun Nov 12 04:53:19 2023 -0500 @@ -0,0 +1,91 @@ +#include "animia/strategies.h" +#include "animia/util.h" +#include "animia.h" +#include <iostream> + +#ifdef ANIMIA_ON_WIN32 +# include "animia/fd/win32.h" +#elif defined(ANIMIA_ON_LINUX) +# include "animia/fd/linux.h" +#elif defined(ANIMIA_ON_UNIX) +# include "animia/fd/bsd.h" +#endif + +namespace animia::internal { + +class Strategist { + public: + Strategist(Result& result) : result_(result) {} + + bool ApplyStrategies(); + + private: + bool AddMedia(const MediaInfo media_information); + + bool ApplyOpenFilesStrategy(); + + Result& result_; +}; + +bool Strategist::ApplyStrategies() { + bool success = false; + + for (const auto strategy : result_.player.strategies) { + switch (strategy) { + case Strategy::OpenFiles: + success |= ApplyOpenFilesStrategy(); + break; + } + } + + return success; +} + +bool ApplyStrategies(std::vector<Result>& results) { + bool success = false; + + for (auto& result : results) { + Strategist strategist(result); + success |= strategist.ApplyStrategies(); + } + + return success; +} + +//////////////////////////////////////////////////////////////////////////////// + +bool Strategist::ApplyOpenFilesStrategy() { + bool success = false; + + const std::set<pid_t> pids{result_.process.pid}; + std::vector<std::tuple<pid_t, std::string>> files; + +#ifdef ANIMIA_ON_WIN32 + win32::EnumerateOpenFiles(pids, files); +#elif defined(ANIMIA_ON_LINUX) + linux::EnumerateOpenFiles(pids, files); +#elif defined(ANIMIA_ON_UNIX) + unix::EnumerateOpenFiles(pids, files); +#endif + + for (const auto& [pid, file] : files) { + success |= AddMedia({MediaInfoType::File, file}); + } + + return success; +} + +//////////////////////////////////////////////////////////////////////////////// + +bool Strategist::AddMedia(const MediaInfo media_information) { + if (media_information.value.empty()) + return false; + + Media media; + media.information.push_back(media_information); + result_.media.push_back(std::move(media)); + + return true; +} + +}