loom

Форк
0
/
HardModuleLoader.cpp 
81 строка · 2.4 Кб
1
/*
2
MIT License
3

4
Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
5

6
https://bmstu.codes/lsx/simodo/stars
7
*/
8

9
#include "simodo/module/HardModuleLoader.h"
10
#include "simodo/inout/format/fmt.h"
11

12
#include <unordered_map>
13
#include <filesystem>
14
#include <cassert>
15

16
#include <boost/dll/import.hpp>
17

18
using namespace simodo;
19
using namespace simodo::module;
20

21
namespace dll = boost::dll;
22
namespace fs = std::filesystem;
23

24
#define CATCH_ERRORS
25

26
namespace 
27
{
28
    static std::unordered_map<std::string,std::function<ExtModuleFactory_t>> hard_factories;
29

30
}
31

32
std::shared_ptr<variable::Module_interface> HardModuleLoader::load(const std::string & module_name,
33
            interpret::Interpret_interface * interpret)
34
{
35
    _last_error = "";
36
    auto it = hard_factories.find(module_name);
37

38
    if (it != hard_factories.end()) 
39
        return std::make_shared<HardModule>(it->second);
40
    
41
    std::function<ExtModuleFactory_t> creator = nullptr;
42

43
    for(const std::string & dir : _module_places) {
44
        fs::path path_to_folder { dir };
45
        fs::path path_to_module { path_to_folder / (module_name + ".simodo-module") };
46

47
        if (fs::exists(path_to_module)) {
48
#ifdef CATCH_ERRORS
49
            try {
50
#endif
51
                creator = loadPluginFactory(path_to_module.string(),"create_simodo_module");
52
#ifdef CATCH_ERRORS
53
            }
54
            catch(const std::runtime_error & e) {
55
                _last_error = e.what();
56
                creator = nullptr;
57
            }
58
#endif
59
            if (creator) {
60
                auto [it,ok] = hard_factories.insert({module_name, creator});
61
                if (ok)
62
                    return std::make_shared<HardModule>(creator,interpret);
63
            }
64

65
            /// @note Если модуль (точнее, его фабрика) найден, но не может быть загружен - это ошибка, 
66
            /// а не повод продолжить поиски.
67
            break;
68
        }
69
    }
70

71
    if (_last_error.empty())
72
        _last_error = inout::fmt("Module '%1' was not found").arg(module_name);
73

74
    return std::shared_ptr<variable::Module_interface>();
75
}
76

77
std::function<ExtModuleFactory_t> HardModuleLoader::loadPluginFactory(const std::string & path, 
78
                                                                      const std::string & alias_name)
79
{
80
    return dll::import_alias<ExtModuleFactory_t>(path.c_str(), alias_name);
81
}
82

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.