/*! Load the plugins. \param server The server object to use. */ int PluginsManager::load (Server *server) { list<string*> toRemove; HashMap<string, list<string>*> dependsOn; HashMap<string, PluginInfo*>::Iterator it = pluginsInfos.begin (); HashMap<string, bool> remove; while (it != pluginsInfos.end ()) { string name (it.getKey ()); PluginInfo* pinfo = *it; HashMap<string, pair<int, int>* >::Iterator depIt = pinfo->begin (); string msversion (MYSERVER_VERSION); size_t i = msversion.find ("-", 0); if (i != string::npos) msversion = msversion.substr (0, i); int msVersion = PluginInfo::convertVersion (msversion); if (msVersion < pinfo->getMyServerMinVersion () || msVersion > pinfo->getMyServerMaxVersion ()) server->log (MYSERVER_LOG_MSG_WARNING, _("Plugin `%s' not compatible with this version"), name.c_str ()); else remove.put (name, false); for (; depIt != pinfo->end (); depIt++) { string dname = depIt.getKey (); list<string>* deps = dependsOn.get (dname); if (!deps) { deps = new list<string > (); dependsOn.put (dname, deps); } deps->push_front (name); } it++; } list<string*>::iterator tRIt = toRemove.begin (); for (; tRIt != toRemove.end (); tRIt++) removePlugin (**tRIt); toRemove.clear (); HashMap<string, list<string>*>::Iterator dIt = dependsOn.begin (); for (; dIt != dependsOn.end (); dIt++) { string logBuf; string dname = dIt.getKey (); PluginInfo* pinfo = getPluginInfo (dname); if (!pinfo || pinfo->getVersion () == 0) remove.put (dname, true); list<string>* dependsList = (*dIt); if (!dependsList) continue; if (dependsList->empty ()) continue; bool rem = remove.get (dname); if (rem) { recursiveDependencesFallDown (server, dname, remove, dependsOn); continue; } HashMap<string, pair<int, int>* >::Iterator lit = pinfo->begin (); for (; lit != pinfo->end (); lit++) { string depN = lit.getKey (); PluginInfo* dep = getPluginInfo (depN); if (!dep || remove.get (depN)) { server->log (MYSERVER_LOG_MSG_WARNING, _("Missing plugin dependence `%s' --> `%s'"), dname.c_str (), depN.c_str ()); recursiveDependencesFallDown (server, dname, remove, dependsOn); break; } pair<int, int>* pdep = *lit; if (dep->getVersion () < pdep->first || dep->getVersion () > pdep->second) { recursiveDependencesFallDown (server, dname, remove, dependsOn); server->log (MYSERVER_LOG_MSG_WARNING, _("Plugin `%s' not compatible with this version"), dname.c_str ()); break; } } } HashMap<string, bool>::Iterator rIt = remove.begin (); for (; rIt != remove.end (); rIt++) { string name (rIt.getKey ()); if (*rIt) removePlugin (name); } for (it = pluginsInfos.begin (); it != pluginsInfos.end (); it++) (*it)->getPlugin ()->load (server); return 0; }