view dep/animia/src/animia.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 69db40272acd
children 478f3b366199
line wrap: on
line source

#include <string>
#include <vector>

#include <windows.h>

#include "animia.h"
#include "animia/util.h"
#include "animia/strategies.h"
#ifdef ANIMIA_ON_WIN32
#include "animia/fd/win32.h"
#endif
#include <iostream>

namespace animia {

static bool ProcessInPlayers(const std::vector<Player>& players, const std::string& name, Player& player_) {
	for (const auto& player : players) {
		for (const auto& exe : player.executables) {
			if (exe == name.substr(0, name.rfind(".exe"))) {
				player_ = player;
				return true;
			}
		}
	}
	return false;
}

bool GetResults(const std::vector<Player>& players, std::vector<Result>& results) {
	std::set<pid_t> pids;

#ifdef ANIMIA_ON_WIN32
	/* todo: make these functions also return process names in a tuple,
	   cause the win32 api gives it to us for free! */
	if (!internal::win32::GetAllPids(pids))
#elif ANIMIA_ON_LINUX
	if (!internal::linux::GetAllPids(pids))
#elif ANIMIA_ON_UNIX
	if (!internal::unix::GetAllPids(pids))
#endif
		return false;

	for (const auto& pid : pids) {
		std::string name;
#ifdef ANIMIA_ON_WIN32
		animia::internal::win32::GetProcessName(pid, name);
#endif

		Player player;
		if (!ProcessInPlayers(players, name, player))
			continue;

		Result result;
		result.process.pid = pid;
		result.process.name = name;
		result.player = player;
		results.push_back(result);
	}

	return internal::ApplyStrategies(results);
}

}