QString EditorManager::loadPlugin(QString const &pluginName) { EditorInterface *iEditor = mPluginManager.pluginLoadedByName<EditorInterface>(pluginName).first; QString const error = mPluginManager.pluginLoadedByName<EditorInterface>(pluginName).second; if (iEditor) { mPluginsLoaded += iEditor->id(); mPluginFileName.insert(iEditor->id(), pluginName); mPluginIface[iEditor->id()] = iEditor; QLOG_INFO() << "Plugin" << pluginName << "loaded. Version: " << iEditor->version(); return QString(); } QLOG_WARN() << "Editor plugin" << pluginName << "loading failed: " << error; return error; }
bool EditorManager::loadPlugin(QString const &pluginName) { QPluginLoader *loader = new QPluginLoader(mPluginsDir.absoluteFilePath(pluginName)); loader->load(); QObject *plugin = loader->instance(); if (plugin) { EditorInterface *iEditor = qobject_cast<EditorInterface *>(plugin); if (iEditor) { mPluginsLoaded += iEditor->id(); mPluginFileName.insert(iEditor->id(), pluginName); mPluginIface[iEditor->id()] = iEditor; mLoaders.insert(pluginName, loader); return true; } } QMessageBox::warning(NULL, tr("error"), tr("Plugin loading failed: ") + loader->errorString()); loader->unload(); delete loader; return false; }
EditorManager::EditorManager(QObject *parent) : QObject(parent) { mPluginsDir = QDir(qApp->applicationDirPath()); while (!mPluginsDir.isRoot() && !mPluginsDir.entryList(QDir::Dirs).contains("plugins")) { mPluginsDir.cdUp(); } mPluginsDir.cd("plugins"); foreach (QString const &fileName, mPluginsDir.entryList(QDir::Files)) { QPluginLoader *loader = new QPluginLoader(mPluginsDir.absoluteFilePath(fileName)); QObject *plugin = loader->instance(); if (plugin) { EditorInterface *iEditor = qobject_cast<EditorInterface *>(plugin); if (iEditor) { mPluginsLoaded += iEditor->id(); mPluginFileName.insert(iEditor->id(), fileName); mPluginIface[iEditor->id()] = iEditor; mLoaders.insert(fileName, loader); } else { // TODO: Just does not work under Linux. Seems to be memory corruption when // loading, unloading, and then loading .so file again. // To reproduce, uncomment this, build VisualInterpreter, and try to launch QReal. // With some tool plugins, like MetaEditorSupport or Exterminatus, works fine, // also works fine on Windows. Investigation required. // loader->unload(); delete loader; } } else { qDebug() << "Plugin loading failed: " << loader->errorString(); loader->unload(); delete loader; } } }