void PluginFactory::discoverPlugins() { DescriptorMap descriptors; PluginInfoList pluginInfos; m_pluginByExt.clear(); QSet<QFileInfo> files; for (const QString& searchPath : QDir::searchPaths("plugins")) { files.unite(QDir(searchPath).entryInfoList(nameFilters).toSet()); } // Cheap dependency handling: zynaddsubfx needs ZynAddSubFxCore. By loading // all libraries twice we ensure that libZynAddSubFxCore is found. for (const QFileInfo& file : files) { QLibrary(file.absoluteFilePath()).load(); } for (const QFileInfo& file : files) { auto library = std::make_shared<QLibrary>(file.absoluteFilePath()); if (! library->load()) { m_errors[file.baseName()] = library->errorString(); qWarning("%s", library->errorString().toLocal8Bit().data()); continue; } Plugin::Descriptor* pluginDescriptor = nullptr; if (library->resolve("lmms_plugin_main")) { QString descriptorName = file.baseName() + "_plugin_descriptor"; if( descriptorName.left(3) == "lib" ) { descriptorName = descriptorName.mid(3); } pluginDescriptor = reinterpret_cast<Plugin::Descriptor*>(library->resolve(descriptorName.toUtf8().constData())); if(pluginDescriptor == nullptr) { qWarning() << qApp->translate("PluginFactory", "LMMS plugin %1 does not have a plugin descriptor named %2!"). arg(file.absoluteFilePath()).arg(descriptorName); continue; } } if(pluginDescriptor) { PluginInfo info; info.file = file; info.library = library; info.descriptor = pluginDescriptor; pluginInfos << info; auto addSupportedFileTypes = [this](QString supportedFileTypes, const PluginInfo& info, const Plugin::Descriptor::SubPluginFeatures::Key* key = nullptr) { if(!supportedFileTypes.isNull()) { for (const QString& ext : supportedFileTypes.split(',')) { //qDebug() << "Plugin " << info.name() // << "supports" << ext; PluginInfoAndKey infoAndKey; infoAndKey.info = info; infoAndKey.key = key ? *key : Plugin::Descriptor::SubPluginFeatures::Key(); m_pluginByExt.insert(ext, infoAndKey); } } }; if (info.descriptor->supportedFileTypes) addSupportedFileTypes(QString(info.descriptor->supportedFileTypes), info); if (info.descriptor->subPluginFeatures) { Plugin::Descriptor::SubPluginFeatures::KeyList subPluginKeys; info.descriptor->subPluginFeatures->listSubPluginKeys( info.descriptor, subPluginKeys); for(const Plugin::Descriptor::SubPluginFeatures::Key& key : subPluginKeys) { addSupportedFileTypes(key.additionalFileExtensions(), info, &key); } } descriptors.insert(info.descriptor->type, info.descriptor); } } m_pluginInfos = pluginInfos; m_descriptors = descriptors; }
void PluginFactory::discoverPlugins() { DescriptorMap descriptors; PluginInfoList pluginInfos; m_pluginByExt.clear(); QSet<QFileInfo> files; for (const QString& searchPath : QDir::searchPaths("plugins")) { files.unite(QDir(searchPath).entryInfoList(nameFilters).toSet()); } // Cheap dependency handling: zynaddsubfx needs ZynAddSubFxCore. By loading // all libraries twice we ensure that libZynAddSubFxCore is found. for (const QFileInfo& file : files) { QLibrary(file.absoluteFilePath()).load(); } for (const QFileInfo& file : files) { auto library = std::make_shared<QLibrary>(file.absoluteFilePath()); if (! library->load()) { m_errors[file.baseName()] = library->errorString(); qWarning("%s", library->errorString().toLocal8Bit().data()); continue; } if (library->resolve("lmms_plugin_main") == nullptr) { continue; } QString descriptorName = file.baseName() + "_plugin_descriptor"; if( descriptorName.left(3) == "lib" ) { descriptorName = descriptorName.mid(3); } Plugin::Descriptor* pluginDescriptor = reinterpret_cast<Plugin::Descriptor*>(library->resolve(descriptorName.toUtf8().constData())); if(pluginDescriptor == nullptr) { qWarning() << qApp->translate("PluginFactory", "LMMS plugin %1 does not have a plugin descriptor named %2!"). arg(file.absoluteFilePath()).arg(descriptorName); continue; } PluginInfo info; info.file = file; info.library = library; info.descriptor = pluginDescriptor; pluginInfos << info; for (const QString& ext : QString(info.descriptor->supportedFileTypes).split(',')) { m_pluginByExt.insert(ext, info); } descriptors.insert(info.descriptor->type, info.descriptor); } m_pluginInfos = pluginInfos; m_descriptors = descriptors; }