diff --git a/autotests/data/servicetypes/fake-kdevelopplugin.desktop b/autotests/data/servicetypes/fake-kdevelopplugin.desktop --- a/autotests/data/servicetypes/fake-kdevelopplugin.desktop +++ b/autotests/data/servicetypes/fake-kdevelopplugin.desktop @@ -2,7 +2,7 @@ [Desktop Entry] Type=ServiceType -X-KDE-ServiceType=KDevelop/Plugin +X-KDE-ServiceType=KDevelop/NonExistentPlugin X-KDE-Derived=KPluginInfo #Name=KDevelop Plugin diff --git a/autotests/desktoptojsontest.cpp b/autotests/desktoptojsontest.cpp --- a/autotests/desktoptojsontest.cpp +++ b/autotests/desktoptojsontest.cpp @@ -174,7 +174,7 @@ "Name[fr]=Prise en charge du C++\n" "GenericName=Language Support\n" "GenericName[sl]=Podpora jeziku\n" - "ServiceTypes=KDevelop/Plugin\n" + "ServiceTypes=KDevelop/NonExistentPlugin\n" "X-KDE-Library=kdevcpplanguagesupport\n" "X-KDE-PluginInfo-Name=kdevcppsupport\n" "X-KDE-PluginInfo-Category=Language Support\n" @@ -200,7 +200,7 @@ " \"Name\": \"C++ Support\",\n" " \"Name[fi]\": \"C++-tuki\",\n" " \"Name[fr]\": \"Prise en charge du C++\",\n" - " \"ServiceTypes\": [ \"KDevelop/Plugin\" ]\n" + " \"ServiceTypes\": [ \"KDevelop/NonExistentPlugin\" ]\n" " },\n" " \"X-KDevelop-Args\": \"CPP\",\n" " \"X-KDevelop-Interfaces\": \"ILanguageSupport\",\n" @@ -226,7 +226,7 @@ " \"Name\": \"C++ Support\",\n" " \"Name[fi]\": \"C++-tuki\",\n" " \"Name[fr]\": \"Prise en charge du C++\",\n" - " \"ServiceTypes\": [ \"KDevelop/Plugin\" ]\n" + " \"ServiceTypes\": [ \"KDevelop/NonExistentPlugin\" ]\n" " },\n" " \"X-KDevelop-Args\": \"CPP\",\n" " \"X-KDevelop-Interfaces\": [\"ILanguageSupport\"],\n" diff --git a/src/lib/plugin/desktopfileparser.cpp b/src/lib/plugin/desktopfileparser.cpp --- a/src/lib/plugin/desktopfileparser.cpp +++ b/src/lib/plugin/desktopfileparser.cpp @@ -284,13 +284,18 @@ return true; } +static QString locateRelativeServiceType(const QString &relPath) +{ + return QStandardPaths::locate(QStandardPaths::GenericDataLocation, + QStringLiteral("kservicetypes5/") + relPath); +} + static QVector* parseServiceTypesFile(const QString &inputPath) { int lineNr = 0; QString path = inputPath; if (QDir::isRelativePath(path)) { - path = QStandardPaths::locate(QStandardPaths::GenericDataLocation, - QStringLiteral("kservicetypes5/") + inputPath); + path = locateRelativeServiceType(path); QString rcPath; if (path.isEmpty()) { rcPath = QStringLiteral(":/kservicetypes5/") + inputPath; @@ -536,11 +541,23 @@ break; } if (key == QByteArrayLiteral("X-KDE-ServiceTypes") || key == QByteArrayLiteral("ServiceTypes")) { - const auto services = deserializeList(value); - for(const auto &service : services) { + const QString dotDesktop = QStringLiteral(".desktop"); + const QChar slashChar(QLatin1Char('/')); + const auto serviceList = deserializeList(value); + + for(const auto &service : serviceList) { // some .desktop files still use the legacy ServiceTypes= key - QString fileName = service.toLower().replace(QLatin1Char('/'), QLatin1Char('-'))+QStringLiteral(".desktop"); - serviceTypeDef.addFile(fileName); + QString absFileName = locateRelativeServiceType( + service.toLower().replace(slashChar, QLatin1Char('-'))+dotDesktop); + if (absFileName.isEmpty()) { + absFileName = locateRelativeServiceType( + service.toLower().remove(slashChar)+dotDesktop); + } + if (absFileName.isEmpty()) { + qCWarning(DESKTOPPARSER) << "Unable to find service type for service" << service; + } + else + serviceTypeDef.addFile(absFileName); } break; }