diff --git a/src/core/kexipartmanager.cpp b/src/core/kexipartmanager.cpp --- a/src/core/kexipartmanager.cpp +++ b/src/core/kexipartmanager.cpp @@ -167,8 +167,8 @@ QStringList serviceTypes; serviceTypes << "Kexi/Viewer" << "Kexi/Designer" << "Kexi/Editor" << "Kexi/ModalDialog"; - const QList offers = KexiPartTrader_instance->query(serviceTypes); - foreach(QPluginLoader *loader, offers) { + QList offers = KexiPartTrader_instance->query(serviceTypes); + foreach(const QPluginLoader *loader, offers) { QScopedPointer info(new Info(*loader)); if (info->id().isEmpty()) { qWarning() << "No plugin ID (X-KDE-PluginInfo-Name) specified for Kexi Part" @@ -213,6 +213,8 @@ d->partsByPluginId.insert(info->pluginId(), info.data()); info.take(); } + qDeleteAll(offers); + offers.clear(); // fill the final list using computed order for (int i = 0; i < orderedInfos.size(); i++) { diff --git a/src/formeditor/widgetlibrary.cpp b/src/formeditor/widgetlibrary.cpp --- a/src/formeditor/widgetlibrary.cpp +++ b/src/formeditor/widgetlibrary.cpp @@ -138,7 +138,7 @@ QStringList serviceTypes; serviceTypes << "Kexi/FormWidgets"; - const QList offers = KexiFormWidgetsPluginTrader_instance->query(serviceTypes); + QList offers = KexiFormWidgetsPluginTrader_instance->query(serviceTypes); foreach(const QPluginLoader *loader, offers) { QScopedPointer metaData(new KexiFormWidgetsPluginMetaData(*loader)); if (metaData->id().isEmpty()) { @@ -172,6 +172,8 @@ m_pluginsMetaData.insert(metaData->id(), metaData.data()); metaData.take(); } + qDeleteAll(offers); + offers.clear(); if (m_pluginsMetaData.isEmpty()) { q->m_result = KDbResult(i18n("Could not find any form widget plugins.")); m_couldNotFindAnyFormWidgetPluginsErrorDisplayed = true; diff --git a/src/kexiutils/KexiJsonTrader.h b/src/kexiutils/KexiJsonTrader.h --- a/src/kexiutils/KexiJsonTrader.h +++ b/src/kexiutils/KexiJsonTrader.h @@ -60,6 +60,8 @@ * * @return A list of QPluginLoader that satisfy the query * @see http://techbase.kde.org/Development/Tutorials/Services/Traders#The_KTrader_Query_Language + * + * @note Ownership of the QPluginLoader objects is transferred to the caller. */ QList query(const QStringList &servicetypes, const QString &mimetype = QString()); diff --git a/src/kexiutils/KexiJsonTrader.cpp b/src/kexiutils/KexiJsonTrader.cpp --- a/src/kexiutils/KexiJsonTrader.cpp +++ b/src/kexiutils/KexiJsonTrader.cpp @@ -84,6 +84,38 @@ return json.value(QLatin1String("KPlugin")).toObject(); } +//! Checks loader @a loader +static bool checkLoader(QPluginLoader *loader, const QStringList &servicetypes, + const QString &mimetype) +{ + const QJsonObject pluginData = KexiJsonTrader::rootObjectForPluginLoader(*loader); + if (pluginData.isEmpty()) { + //qDebug() << dirIter.filePath() << "has no json!"; + return false; + } + const QJsonArray foundServiceTypesAray = pluginData.value(QLatin1String("ServiceTypes")).toArray(); + if (foundServiceTypesAray.isEmpty()) { + qWarning() << "No ServiceTypes defined for plugin" << loader->fileName() << "-- skipping!"; + return false; + } + QStringList foundServiceTypes = KexiUtils::convertTypesUsingMethod(foundServiceTypesAray.toVariantList()); + if (!supportsAtLeastServiceType(foundServiceTypes, servicetypes)) { + return false; + } + + if (!mimetype.isEmpty()) { + QJsonObject json = metaDataObjectForPluginLoader(*loader); + QStringList mimeTypes = json.value(QLatin1String("X-KDE-ExtraNativeMimeTypes")) + .toString().split(QLatin1Char(',')); + mimeTypes += json.value(QLatin1String("MimeType")).toString().split(QLatin1Char(';')); + mimeTypes += json.value(QLatin1String("X-KDE-NativeMimeType")).toString(); + if (! mimeTypes.contains(mimetype)) { + return false; + } + } + return true; +} + static QList findPlugins(const QString &path, const QStringList &servicetypes, const QString &mimetype) { @@ -93,32 +125,11 @@ dirIter.next(); if (dirIter.fileInfo().isFile()) { QPluginLoader *loader = new QPluginLoader(dirIter.filePath()); - const QJsonObject pluginData = KexiJsonTrader::rootObjectForPluginLoader(*loader); - if (pluginData.isEmpty()) { - //qDebug() << dirIter.filePath() << "has no json!"; - continue; - } - const QJsonArray foundServiceTypesAray = pluginData.value(QLatin1String("ServiceTypes")).toArray(); - if (foundServiceTypesAray.isEmpty()) { - qWarning() << "No ServiceTypes defined for plugin" << loader->fileName() << "-- skipping!"; - continue; - } - QStringList foundServiceTypes = KexiUtils::convertTypesUsingMethod(foundServiceTypesAray.toVariantList()); - if (!supportsAtLeastServiceType(foundServiceTypes, servicetypes)) { - continue; - } - - if (!mimetype.isEmpty()) { - QJsonObject json = metaDataObjectForPluginLoader(*loader); - QStringList mimeTypes = json.value(QLatin1String("X-KDE-ExtraNativeMimeTypes")) - .toString().split(QLatin1Char(',')); - mimeTypes += json.value(QLatin1String("MimeType")).toString().split(QLatin1Char(';')); - mimeTypes += json.value(QLatin1String("X-KDE-NativeMimeType")).toString(); - if (! mimeTypes.contains(mimetype)) { - continue; - } + if (checkLoader(loader, servicetypes, mimetype)) { + list.append(loader); + } else { + delete loader; } - list.append(loader); } } return list;