modulemanager.cpp 3.9 KB

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