modulemanager.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "modulemanager.h"
  2. #include "util/file.h"
  3. #include "core/app.h"
  4. #include "core/config.h"
  5. #include "core/global.h"
  6. #ifdef _WIN32
  7. #include <Windows.h>
  8. #else
  9. #endif
  10. #include "module/http/request.h"
  11. #include "module/http/response.h"
  12. #include "module/http/session.h"
  13. #include "module/http/httpclient.h"
  14. #include "module/http/interceptor.h"
  15. #include "module/globalfuns.h"
  16. #include "module/mutex.h"
  17. #include "module/codec.h"
  18. #include "module/time.h"
  19. #include "module/filesystem.h"
  20. #include "module/sys.h"
  21. #include "module/timer.h"
  22. #include "module/process.h"
  23. #include "module/ini.h"
  24. fastweb::module_manager::module_manager(fastweb::app* app):Interface(app)
  25. {
  26. }
  27. fastweb::module_manager::~module_manager()
  28. {
  29. }
  30. void fastweb::module_manager::start()
  31. {
  32. close();
  33. auto ms = modules();
  34. for (size_t i = 0; i < ms.size(); i++)
  35. {
  36. module_info mi;
  37. std::string mod_filepath = app()->config->scripts.module_dir + "/" + ms[i];
  38. #ifdef _WIN32
  39. SetDllDirectoryA(ylib::file::parent_dir(mod_filepath).c_str());
  40. mi.dll = LoadLibrary(mod_filepath.c_str());
  41. if (mi.dll == nullptr)
  42. {
  43. LOG_ERROR("module loading failed, filename: " + mod_filepath);
  44. continue;
  45. }
  46. mi.func = (fastweb_module_regist)GetProcAddress((HMODULE)mi.dll, "fastweb_module_regist");
  47. if (mi.func == nullptr) {
  48. LOG_ERROR("function not found: `fastweb_module_regist`, filename: " + mod_filepath);
  49. FreeLibrary((HMODULE)mi.dll);
  50. continue;
  51. }
  52. m_modules.emplace(mod_filepath, mi);
  53. /*if (api_func(lua, lua->lua_state()) == 0)
  54. {
  55. LOG_INFO("successfully regist module, filename: " + mod_filepath);
  56. continue;
  57. }
  58. LOG_ERROR("regist module failed, filename: " + mod_filepath);*/
  59. #else
  60. #endif
  61. }
  62. }
  63. void fastweb::module_manager::close()
  64. {
  65. for_iter(iter, m_modules)
  66. {
  67. #ifdef _WIN32
  68. FreeLibrary((HMODULE)iter->second.dll);
  69. #else
  70. #endif
  71. }
  72. m_modules.clear();
  73. }
  74. void fastweb::module_manager::load(sol::state* lua)
  75. {
  76. load_core(lua);
  77. load_lualib(lua);
  78. load_3rdparty(lua);
  79. }
  80. std::string fastweb::module_manager::search(const std::string& filepath)
  81. {
  82. for (size_t i = 0; i < app()->config->scripts.lib_dir.size(); i++)
  83. {
  84. std::string path = app()->config->scripts.lib_dir[i] + "/" + filepath;
  85. if (ylib::file::exist(path))
  86. return path;
  87. }
  88. return "";
  89. }
  90. void fastweb::module_manager::load_core(sol::state* lua)
  91. {
  92. lua->open_libraries(
  93. sol::lib::base,
  94. sol::lib::package,
  95. sol::lib::math,
  96. sol::lib::string,
  97. sol::lib::table,
  98. sol::lib::utf8,
  99. sol::lib::bit32,
  100. sol::lib::coroutine,
  101. sol::lib::count,
  102. sol::lib::ffi,
  103. sol::lib::io,
  104. sol::lib::jit,
  105. sol::lib::os
  106. );
  107. module::request::regist(lua);
  108. module::response::regist(lua);
  109. module::interceptor::regist(lua);
  110. module::session::regist(lua);
  111. module::httpclient::regist(lua);
  112. module::globalfuncs::regist(lua);
  113. module::mutex::regist(lua);
  114. module::auto_lock::regist(lua);
  115. module::codec::regist(lua);
  116. module::time::regist(lua);
  117. module::filesystem::regist(lua);
  118. module::sys::regist(lua);
  119. module::timer::regist(lua);
  120. module::ini::regist(lua);
  121. module::process::regist(lua);
  122. app()->global->regist(lua);
  123. }
  124. void fastweb::module_manager::load_3rdparty(sol::state* lua)
  125. {
  126. for_iter(iter, m_modules)
  127. {
  128. if (iter->second.func(lua, lua->lua_state()) != 0)
  129. {
  130. LOG_ERROR("egist module failed, filename: "+iter->first);
  131. }
  132. }
  133. }
  134. void fastweb::module_manager::load_lualib(sol::state* lua)
  135. {
  136. // 获取当前的package.path,添加新的搜索路径
  137. std::string current_path = (*lua)["package"]["path"]; // 获取当前的路径
  138. for (size_t i = 0; i < app()->config->scripts.lib_dir.size(); i++)
  139. current_path += ";" + app()->config->scripts.lib_dir[i] + "/?.lua"; // 添加新的路径
  140. current_path += ";" + app()->config->website.dir + "/?.lua"; // 添加新的路径
  141. (*lua)["package"]["path"] = current_path; // 设置修改后的路径
  142. }
  143. std::vector<std::string> fastweb::module_manager::modules()
  144. {
  145. std::vector<std::string> results;
  146. auto luas = ylib::file::traverse(app()->config->scripts.module_dir, "(.*\\.dll)");
  147. for_iter(iter, luas)
  148. {
  149. if (iter->second == IS_DIRECTORY)
  150. continue;
  151. std::string path = strutils::replace(iter->first, '\\', '/');
  152. if (path.find("/") != -1)
  153. {
  154. if (strutils::split(path, '/').size() != 2)
  155. continue; //多级不支持
  156. if (ylib::file::parent_dir(path) != ylib::file::filename(path, false))
  157. continue;
  158. }
  159. results.push_back(path);
  160. }
  161. return results;
  162. }