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;
+}
+
+}