File indexing completed on 2024-12-08 09:42:56
0001 /* 0002 SPDX-FileCopyrightText: 2010 Ryan Rix <ry@n.rix.si> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef KPACKAGE_LOADER_H 0008 #define KPACKAGE_LOADER_H 0009 0010 #include <kpackage/package.h> 0011 0012 #include <kpackage/package_export.h> 0013 0014 namespace KPackage 0015 { 0016 class PackageLoaderPrivate; 0017 0018 /** 0019 * @class PackageLoader kpackage/packageloader.h <KPackage/PackageLoader> 0020 * 0021 * This is an abstract base class which defines an interface to which the package 0022 * loading logic can communicate with a parent application. The plugin loader 0023 * must be set before any plugins are loaded, otherwise (for safety reasons), the 0024 * default PackageLoader implementation will be used. The reimplemented version should 0025 * not do more than simply returning a loaded plugin. It should not init() it, and it should not 0026 * hang on to it. 0027 * 0028 * @author Ryan Rix <ry@n.rix.si> 0029 **/ 0030 class KPACKAGE_EXPORT PackageLoader 0031 { 0032 public: 0033 /** 0034 * Load a Package plugin. 0035 * 0036 * @param packageFormat the format of the package to load 0037 * @param packagePath the package name: the path of the package relative to the 0038 * packageFormat root path. If not specified it will have to be set manually 0039 * with Package::setPath() by the caller. 0040 * 0041 * @return a Package object matching name, or an invalid package on failure 0042 **/ 0043 Package loadPackage(const QString &packageFormat, const QString &packagePath = QString()); 0044 0045 /** 0046 * List all available packages of a certain type 0047 * 0048 * @param packageFormat the format of the packages to list 0049 * @param packageRoot the root folder where the packages are installed. 0050 * If not specified the default from the packageformat will be taken. 0051 * 0052 * @return metadata for all the matching packages 0053 */ 0054 QList<KPluginMetaData> listPackages(const QString &packageFormat, const QString &packageRoot = QString()); 0055 0056 /** 0057 * List package of a certain type that match a certain filter function 0058 * 0059 * @param packageFormat the format of the packages to list 0060 * @param packageRoot the root folder where the packages are installed. 0061 * If not specified the default from the packageformat will be taken. 0062 * @param filter a filter function that will be called on each package: 0063 * will return true for the matching ones 0064 * 0065 * @return metadata for all the matching packages 0066 * @since 5.10 0067 */ 0068 QList<KPluginMetaData> findPackages(const QString &packageFormat, 0069 const QString &packageRoot = QString(), 0070 std::function<bool(const KPluginMetaData &)> filter = std::function<bool(const KPluginMetaData &)>()); 0071 0072 /** 0073 * Loads a PackageStructure for a given format. The structure can then be used as 0074 * paramenter for a Package instance constructor 0075 * 0076 * @note The returned pointer is managed by KPackage, and should never be deleted 0077 * 0078 * @param packageFormat the package format, such as "KPackage/GenericQML" 0079 * @return the structure instance (ownership retained by KPackage) 0080 */ 0081 KPackage::PackageStructure *loadPackageStructure(const QString &packageFormat); 0082 0083 /** 0084 * Adds a new known package structure that can be used by the functions to load packages such 0085 * as loadPackage, findPackages etc 0086 * @param packageFormat the package format, such as "KPackage/GenericQML" 0087 * @param structure the package structure we want to be able to load packages from 0088 * @since 5.10 0089 */ 0090 void addKnownPackageStructure(const QString &packageFormat, KPackage::PackageStructure *structure); 0091 0092 #if KPACKAGE_BUILD_DEPRECATED_SINCE(5, 86) 0093 /** 0094 * Set the plugin loader which will be queried for all loads. 0095 * 0096 * @param loader A subclass of PackageLoader which will be supplied 0097 * by the application 0098 * @deprecated Since 5.86, deprecated for lack of usage. Use default package loader instead 0099 **/ 0100 KPACKAGE_DEPRECATED_VERSION(5, 86, "deprecated for lack of usage. Use default package loader instead") 0101 static void setPackageLoader(PackageLoader *loader); 0102 #endif 0103 0104 /** 0105 * Return the active plugin loader 0106 **/ 0107 static PackageLoader *self(); 0108 0109 protected: 0110 #if KPACKAGE_BUILD_DEPRECATED_SINCE(5, 86) 0111 /** 0112 * A re-implementable method that allows subclasses to override 0113 * the default behaviour of loadPackage. If the service requested is not recognized, 0114 * then the implementation should return an empty and invalid Package(). 0115 * This method is called 0116 * by loadPackage prior to attempting to load a Package using the standard 0117 * plugin mechanisms. 0118 * 0119 * @param packageFormat the format of the package to load 0120 * 0121 * @return a Package instance with the proper PackageStructure 0122 * @deprecated Since 5.86, deprecated for lack of usage. Use default package loading instead 0123 **/ 0124 KPACKAGE_DEPRECATED_VERSION(5, 86, "deprecated for lack of usage. Use default package loading instead") 0125 virtual Package internalLoadPackage(const QString &packageFormat); 0126 #endif 0127 0128 PackageLoader(); 0129 virtual ~PackageLoader(); 0130 0131 private: 0132 friend class Package; 0133 PackageLoaderPrivate *const d; 0134 Q_DISABLE_COPY(PackageLoader) 0135 }; 0136 0137 } 0138 0139 Q_DECLARE_METATYPE(KPackage::PackageLoader *) 0140 0141 #endif