t7x/src/client/loader/component_loader.cpp

162 lines
2.9 KiB
C++
Raw Normal View History

2022-05-21 06:04:08 -04:00
#include <std_include.hpp>
#include "component_loader.hpp"
2022-05-27 13:08:39 -04:00
#include <utils/nt.hpp>
2022-05-21 06:04:08 -04:00
void component_loader::register_component(std::unique_ptr<component_interface>&& component_)
{
2022-06-16 06:12:36 -04:00
auto& components = get_components();
components.push_back(std::move(component_));
std::ranges::stable_sort(components, [](const std::unique_ptr<component_interface>& a,
const std::unique_ptr<component_interface>& b)
{
return a->priority() > b->priority();
});
2022-05-21 06:04:08 -04:00
}
2022-05-29 10:46:49 -04:00
bool component_loader::pre_start()
2022-05-21 06:04:08 -04:00
{
2022-05-29 10:46:49 -04:00
static auto res = []
2022-05-21 06:04:08 -04:00
{
2022-05-29 10:46:49 -04:00
clean();
try
2022-05-21 06:04:08 -04:00
{
2022-05-29 10:46:49 -04:00
for (const auto& component_ : get_components())
{
component_->pre_start();
}
}
catch (premature_shutdown_trigger&)
{
return false;
}
catch (const std::exception& e)
{
MessageBoxA(nullptr, e.what(), "Error", MB_ICONERROR);
return false;
2022-05-21 06:04:08 -04:00
}
2022-05-29 10:46:49 -04:00
return true;
}();
return res;
2022-05-21 06:04:08 -04:00
}
void component_loader::post_unpack()
{
2022-05-29 10:46:49 -04:00
static auto res = []
{
clean();
2022-05-21 06:04:08 -04:00
2022-05-29 10:46:49 -04:00
try
{
for (const auto& component_ : get_components())
{
component_->post_unpack();
}
}
catch (const std::exception& e)
{
MessageBoxA(nullptr, e.what(), "Error", MB_ICONERROR);
return false;
}
return true;
}();
if (!res)
2022-05-21 06:04:08 -04:00
{
2022-05-29 10:46:49 -04:00
TerminateProcess(GetCurrentProcess(), 1);
2022-05-21 06:04:08 -04:00
}
}
void component_loader::pre_destroy()
{
2022-05-29 10:46:49 -04:00
static auto res = []
{
clean();
try
{
for (const auto& component_ : get_components())
{
component_->pre_destroy();
}
}
catch (const std::exception& e)
{
MessageBoxA(nullptr, e.what(), "Error", MB_ICONERROR);
return false;
}
return true;
}();
2022-05-21 06:04:08 -04:00
2022-05-29 10:46:49 -04:00
if (!res)
2022-05-21 06:04:08 -04:00
{
2022-05-29 10:46:49 -04:00
TerminateProcess(GetCurrentProcess(), 1);
2022-05-21 06:04:08 -04:00
}
}
void component_loader::clean()
{
auto& components = get_components();
for (auto i = components.begin(); i != components.end();)
{
if (!(*i)->is_supported())
{
(*i)->pre_destroy();
i = components.erase(i);
}
else
{
++i;
}
}
}
void component_loader::trigger_premature_shutdown()
{
throw premature_shutdown_trigger();
}
std::vector<std::unique_ptr<component_interface>>& component_loader::get_components()
{
using component_vector = std::vector<std::unique_ptr<component_interface>>;
using component_vector_container = std::unique_ptr<component_vector, std::function<void(component_vector*)>>;
static component_vector_container components(new component_vector, [](const component_vector* component_vector)
{
pre_destroy();
delete component_vector;
});
return *components;
}
2022-05-27 13:08:39 -04:00
2022-09-17 10:04:45 -04:00
size_t get_base()
2022-05-27 13:08:39 -04:00
{
static auto base = size_t(utils::nt::library{}.get_ptr());
assert(base && "Failed to resolve base");
2022-09-17 10:04:45 -04:00
return base;
}
size_t operator"" _g(const size_t val)
{
static auto base = get_base();
2022-05-27 13:08:39 -04:00
return base + (val - 0x140000000);
}
2022-05-29 10:01:59 -04:00
size_t reverse_g(const size_t val)
{
2022-09-17 10:04:45 -04:00
static auto base = get_base();
2022-05-29 10:01:59 -04:00
return (val - base) + 0x140000000;
}
size_t reverse_g(const void* val)
{
return reverse_g(reinterpret_cast<size_t>(val));
}