aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/module/ModuleManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/module/ModuleManager.cpp')
-rw-r--r--src/core/module/ModuleManager.cpp166
1 files changed, 100 insertions, 66 deletions
diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp
index 5f8895be..8f97adc3 100644
--- a/src/core/module/ModuleManager.cpp
+++ b/src/core/module/ModuleManager.cpp
@@ -54,66 +54,79 @@ class ModuleManager::Impl {
~Impl() = default;
auto LoadAndRegisterModule(const QString& module_library_path,
- bool integrated_module) -> void {
- // give user ability to give up all modules
- auto disable_loading_all_modules =
- GlobalSettingStation::GetInstance()
- .GetSettings()
- .value("basic/disable_loading_all_modules", false)
- .toBool();
- if (disable_loading_all_modules) return;
-
- Thread::TaskRunnerGetter::GetInstance()
- .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default)
- ->PostTask(new Thread::Task(
- [=](GpgFrontend::DataObjectPtr) -> int {
- QLibrary module_library(module_library_path);
- if (!module_library.load()) {
- LOG_W() << "module manager failed to load module: "
- << module_library.fileName()
- << ", reason: " << module_library.errorString();
- return -1;
- }
-
- auto module = SecureCreateSharedObject<Module>(module_library);
- if (!module->IsGood()) {
- LOG_W() << "module manager failed to load module, "
- "reason: illegal module: "
- << module_library.fileName();
- return -1;
- }
-
- module->SetGPC(gmc_.get());
- if (!gmc_->RegisterModule(module, integrated_module)) return -1;
-
- const auto module_id = module->GetModuleIdentifier();
- const auto module_hash = module->GetModuleHash();
-
- SettingsObject so(QString("module.%1.so").arg(module_id));
- ModuleSO module_so(so);
-
- // reset module settings if necessary
- if (module_so.module_id != module_id ||
- module_so.module_hash != module_hash) {
- module_so.module_id = module_id;
- module_so.module_hash = module_hash;
- // auto active integrated module by default
- module_so.auto_activate = integrated_module;
- module_so.set_by_user = false;
-
- so.Store(module_so.ToJson());
- }
-
- // if this module need auto active
- if (module_so.auto_activate) {
- if (!gmc_->ActiveModule(module_id)) {
- return -1;
- }
- }
+ bool integrated_module) -> bool {
+ QLibrary module_library(module_library_path);
+ if (!module_library.load()) {
+ LOG_W() << "module manager failed to load module: "
+ << module_library.fileName()
+ << ", reason: " << module_library.errorString();
+ need_register_modules_--;
+ return false;
+ }
+
+ auto module = SecureCreateSharedObject<Module>(module_library);
+ if (!module->IsGood()) {
+ LOG_W() << "module manager failed to load module, "
+ "reason: illegal module: "
+ << module_library.fileName();
+ need_register_modules_--;
+ return false;
+ }
+
+ module->SetGPC(gmc_.get());
+
+ LOG_D() << "a new need register module: "
+ << QFileInfo(module_library_path).fileName();
+
+ auto runner = Thread::TaskRunnerGetter::GetInstance().GetTaskRunner(
+ Thread::TaskRunnerGetter::kTaskRunnerType_Module);
+
+ runner->PostTask(new Thread::Task(
+ [=](GpgFrontend::DataObjectPtr) -> int {
+ // register module
+ if (!gmc_->RegisterModule(module, integrated_module)) return -1;
+
+ return 0;
+ },
+ __func__, nullptr));
+
+ runner->PostTask(new Thread::Task(
+ [=](GpgFrontend::DataObjectPtr) -> int {
+ const auto module_id = module->GetModuleIdentifier();
+ const auto module_hash = module->GetModuleHash();
+
+ SettingsObject so(QString("module.%1.so").arg(module_id));
+ ModuleSO module_so(so);
+
+ // reset module settings if necessary
+ if (module_so.module_id != module_id ||
+ module_so.module_hash != module_hash) {
+ module_so.module_id = module_id;
+ module_so.module_hash = module_hash;
+ // auto active integrated module by default
+ module_so.auto_activate = integrated_module;
+ module_so.set_by_user = false;
+
+ so.Store(module_so.ToJson());
+ }
+
+ // if this module need auto active
+ if (module_so.auto_activate) {
+ if (!gmc_->ActiveModule(module_id)) {
+ return -1;
+ }
+ }
+
+ return 0;
+ },
+ __func__, nullptr));
+
+ return true;
+ }
- return 0;
- },
- __func__, nullptr));
+ void SetNeedRegisterModulesNum(int n) {
+ if (need_register_modules_ != -1 || n < 0) return;
+ need_register_modules_ = n;
}
auto SearchModule(ModuleIdentifier module_id) -> ModulePtr {
@@ -126,7 +139,7 @@ class ModuleManager::Impl {
void RegisterModule(const ModulePtr& module) {
Thread::TaskRunnerGetter::GetInstance()
- .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default)
+ .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Module)
->PostTask(new Thread::Task(
[=](GpgFrontend::DataObjectPtr) -> int {
module->SetGPC(gmc_.get());
@@ -138,7 +151,7 @@ class ModuleManager::Impl {
void ListenEvent(const ModuleIdentifier& module_id,
const EventIdentifier& event_id) {
Thread::TaskRunnerGetter::GetInstance()
- .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default)
+ .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Module)
->PostTask(new Thread::Task(
[=](const GpgFrontend::DataObjectPtr&) -> int {
gmc_->ListenEvent(module_id, event_id);
@@ -149,7 +162,7 @@ class ModuleManager::Impl {
void TriggerEvent(const EventReference& event) {
Thread::TaskRunnerGetter::GetInstance()
- .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default)
+ .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Module)
->PostTask(new Thread::Task(
[=](const GpgFrontend::DataObjectPtr&) -> int {
gmc_->TriggerEvent(event);
@@ -170,7 +183,7 @@ class ModuleManager::Impl {
void ActiveModule(const ModuleIdentifier& identifier) {
Thread::TaskRunnerGetter::GetInstance()
- .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default)
+ .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Module)
->PostTask(new Thread::Task(
[=](const GpgFrontend::DataObjectPtr&) -> int {
gmc_->ActiveModule(identifier);
@@ -181,7 +194,7 @@ class ModuleManager::Impl {
void DeactivateModule(const ModuleIdentifier& identifier) {
Thread::TaskRunnerGetter::GetInstance()
- .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default)
+ .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Module)
->PostTask(new Thread::Task(
[=](const GpgFrontend::DataObjectPtr&) -> int {
gmc_->DeactivateModule(identifier);
@@ -219,6 +232,14 @@ class ModuleManager::Impl {
return gmc_->IsIntegratedModule(id);
}
+ auto IsAllModulesRegistered() {
+ if (need_register_modules_ == -1) return false;
+ LOG_D() << "module manager report, need register: "
+ << need_register_modules_ << "registered"
+ << gmc_->GetRegisteredModuleNum();
+ return need_register_modules_ == gmc_->GetRegisteredModuleNum();
+ }
+
auto GRT() -> GlobalRegisterTable* { return grt_.get(); }
private:
@@ -226,12 +247,18 @@ class ModuleManager::Impl {
SecureUniquePtr<GlobalModuleContext> gmc_;
SecureUniquePtr<GlobalRegisterTable> grt_;
QList<QLibrary> module_libraries_;
+ int need_register_modules_ = -1;
};
auto IsModuleActivate(ModuleIdentifier id) -> bool {
return ModuleManager::GetInstance().IsModuleActivated(id);
}
+auto GPGFRONTEND_CORE_EXPORT IsModuleExists(ModuleIdentifier id) -> bool {
+ auto module = ModuleManager::GetInstance().SearchModule(id);
+ return module != nullptr && module->IsGood();
+}
+
auto UpsertRTValue(const QString& namespace_, const QString& key,
const std::any& value) -> bool {
return ModuleManager::GetInstance().UpsertRTValue(namespace_, key,
@@ -254,8 +281,8 @@ ModuleManager::ModuleManager(int channel)
ModuleManager::~ModuleManager() = default;
-void ModuleManager::LoadModule(QString module_library_path,
- bool integrated_module) {
+auto ModuleManager::LoadModule(QString module_library_path,
+ bool integrated_module) -> bool {
return p_->LoadAndRegisterModule(module_library_path, integrated_module);
}
@@ -332,4 +359,11 @@ auto ModuleManager::ListAllRegisteredModuleID() -> QList<ModuleIdentifier> {
auto ModuleManager::GRT() -> GlobalRegisterTable* { return p_->GRT(); }
+auto ModuleManager::IsAllModulesRegistered() -> bool {
+ return p_->IsAllModulesRegistered();
+}
+
+void ModuleManager::SetNeedRegisterModulesNum(int n) {
+ p_->SetNeedRegisterModulesNum(n);
+}
} // namespace GpgFrontend::Module \ No newline at end of file