File indexing completed on 2024-12-01 09:55:03
0001 #pragma once 0002 0003 #include "kpackage_debug.h" 0004 #include <KPluginMetaData> 0005 #include <QString> 0006 0007 inline QStringList readKPackageTypes(const KPluginMetaData &metaData) 0008 { 0009 const QString structureValue = metaData.value(QStringLiteral("KPackageStructure")); 0010 0011 // If we have the new property we can immediately return it's value, no matter if it is a structure plugin or package 0012 if (!structureValue.isEmpty()) { 0013 return QStringList(structureValue); 0014 } 0015 0016 // Compatibility block for old keys 0017 QStringList types; 0018 const static QStringList ignoreStringList = QStringList{QStringLiteral("KPackage/PackageStructure")}; 0019 const auto serviceTypes = metaData.rawData().value(QStringLiteral("KPlugin")).toObject().value(QStringLiteral("ServiceTypes")).toVariant().toStringList(); 0020 if (serviceTypes == ignoreStringList) { 0021 // If the service type is set to this value we have a structure plugin, consequently we want the pluginId 0022 types << metaData.pluginId(); 0023 } else { 0024 // We have a package, read the service types 0025 types << serviceTypes; 0026 } 0027 // while most package structure plugins do, they don't need to set the service types, 0028 // if we haven't found anything so far we use the plugin id if it looks like a valid package type. 0029 const QString pluginId = metaData.pluginId(); 0030 if (types.isEmpty() && !metaData.fileName().endsWith(QLatin1String(".json")) && pluginId.contains(QLatin1Char('/'))) { 0031 types << pluginId; 0032 } 0033 return types; 0034 } 0035 0036 inline KPluginMetaData structureForKPackageType(const QString &packageFormat) 0037 { 0038 const QString guessedPath = QStringLiteral("kpackage/packagestructure/") + QString(packageFormat).toLower().replace(QLatin1Char('/'), QLatin1Char('_')); 0039 KPluginMetaData guessedData(guessedPath); 0040 if (guessedData.isValid() && readKPackageTypes(guessedData).contains(packageFormat)) { 0041 return guessedData; 0042 } 0043 qCDebug(KPACKAGE_LOG) << "Could not find package structure for" << packageFormat << "by plugin path. The guessed path was" << guessedPath; 0044 QVector<KPluginMetaData> plugins = 0045 KPluginMetaData::findPlugins(QStringLiteral("kpackage/packagestructure"), [packageFormat](const KPluginMetaData &metaData) { 0046 return readKPackageTypes(metaData).contains(packageFormat); 0047 }); 0048 if (!plugins.isEmpty()) { 0049 return plugins.constFirst(); 0050 } 0051 return KPluginMetaData(); 0052 }