LWRESULT Cx_PluginLoader::UnloadPlugin(const MODID& modid, bool force_unload) { int32_ moduleIndex = GetPluginIndex(modid); if(moduleIndex < 0) return LWDP_PLUGINMGR_NOT_FIND_MODULE; Ix_Module* pModule = m_modules[moduleIndex]->module; ASSERT_CHECK_RET(LWDP_MODULE_LOG, LWDP_POINTER_IS_NULL, pModule, "Cx_PluginLoader::UnloadPlugin Get Ix_Module Pointer Error"); if(!force_unload) { if(!pModule->CanUnloadPlugin()) return LWDP_PLUGINMGR_MODULE_USING; } else { lw_log_warning(LWDP_MODULE_LOG, "Force Unload Plugin(%s)", pModule->GetModuleName()); } pModule->UninitializePlugin(); MODID tmpModid = pModule->GetModuleMODID(); ClearModuleItems(tmpModid); ReleaseModule(tmpModid); return LWDP_OK; }
bool Cx_PluginLoader::ClearModuleItems(HMODULE hModule) { Ix_Module* pModule = GetModule(hModule); if (pModule) { pModule->ClearModuleItems(); return true; } return false; }
bool Cx_PluginLoader::ClearModuleItems(const MODID& modid) { Ix_Module* pModule = GetModule(modid); if (pModule) { pModule->ClearModuleItems(); return true; } return false; }
LWRESULT Cx_PluginLoader::LoadPlugin(const MODID& modid) { int32_ existIndex = GetPluginIndex(modid); if (existIndex >= 0 && m_modules[existIndex]->modid.empty()) { return LWDP_PLUGINMGR_MODULE_ALREADY_LOAD; } Cx_Interface<Ix_FwIntf> iFwIntf(CLSID_FwIntf); ASSERT_CHECK_RET(LWDP_MODULE_LOG, LWDP_OBJECT_POINTER_IS_NULL, !iFwIntf.IsNull(), "Cx_PluginLoader::LoadPlugin Get Object(FwIntf) Error"); Ix_Module* pModule = iFwIntf->Api_Fw_GetModulePtr(modid); if(!pModule) { return LWDP_PLUGINMGR_NOT_FIND_MODULE_ENTRY; } LWRESULT stat = LWDP_ERROR; if (pModule) { if((stat = CheckPlugin(pModule)) != LWDP_OK) { if(pModule->GetModuleInstance()) //!< 只有加载的外部模块才Unload { Cx_Interface<Ix_FwIntf> iFwIntf(CLSID_FwIntf); ASSERT_CHECK_RET(LWDP_MODULE_LOG, LWDP_OBJECT_POINTER_IS_NULL, !iFwIntf.IsNull(), "Cx_PluginLoader::LoadPlugin Get Object(FwIntf) Error"); iFwIntf->Api_Fw_UnLoadModule(pModule->GetModuleMODID()); } return stat; } pModule->Initialize(this, 0); if(RegisterPlugin(pModule) == LWDP_OK) { int32_ moduleIndex = FindModule(pModule->GetModuleMODID()); ASSERT_CHECK_RET(LWDP_MODULE_LOG, LWDP_PLUGINMGR_MODULE_INDEX_ERROR, (moduleIndex >= 0), "Module Index Error"); ASSERT_CHECK_RET(LWDP_MODULE_LOG, LWDP_PLUGINMGR_MODULE_INDEX_ERROR, (existIndex < 0 || existIndex == moduleIndex), "Module Index Error"); } } else { return LWDP_PLUGINMGR_LOADMODULE_ERROR; } return LWDP_OK; }
LWRESULT Cx_PluginLoader::UnloadPluginAll(bool force_unload) { LWRESULT res = LWDP_OK; LWRESULT stat = LWDP_ERROR; for(uint32_ i=0; i<m_modules.size(); ++i) { Ix_Module* pModule = m_modules[i]->module; ASSERT_CHECK_RET(LWDP_MODULE_LOG, LWDP_POINTER_IS_NULL, pModule, "Cx_PluginLoader::UnloadPluginAll Get Ix_Module Pointer Error"); stat = UnloadPlugin(pModule->GetModuleMODID(), force_unload); if(stat != LWDP_OK) res = stat; } return res; }
LWRESULT Cx_PluginLoader::InitializePlugins() { long_ count = 0; for (long_ i = 0; i < (long_)m_modules.size(); i++) { if (m_modules[i]->inited) { continue; } Ix_Module* pModule = m_modules[i]->module; ASSERT_CHECK_RET(LWDP_MODULE_LOG, 0, (pModule), "Module Pointor is NULL"); RINOK(pModule->InitializePlugin()); count++; m_modules[i]->inited = true; } return LWDP_OK; }