File indexing completed on 2024-12-08 09:42:56
0001 /* 0002 SPDX-FileCopyrightText: 2011 Aaron Seigo <aseigo@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef KPACKAGE_PACKAGESTRUCTURE_H 0008 #define KPACKAGE_PACKAGESTRUCTURE_H 0009 0010 #include <QStringList> 0011 0012 #include <KPluginFactory> 0013 0014 #include <kpackage/package.h> 0015 #include <kpackage/package_export.h> 0016 0017 namespace KPackage 0018 { 0019 class PackageStructurePrivate; 0020 0021 /** 0022 * @class PackageStructure kpackage/packagestructure.h <KPackage/PackageStructure> 0023 * 0024 * This class is used to define the filesystem structure of a package type. 0025 * A PackageStructure is implemented as a dynamically loaded plugin, in the reimplementation 0026 * of initPackage the allowed fines and directories in the package are set into the package, 0027 * for instance: 0028 * 0029 * @code 0030 * package->addFileDefinition("mainscript", QStringLiteral("ui/main.qml"), i18n("Main Script File")); 0031 * package->setDefaultPackageRoot(QStringLiteral("plasma/wallpapers/")); 0032 * package->addDirectoryDefinition("images", QStringLiteral("images"), i18n("Images")); 0033 * package->addDirectoryDefinition("theme", QStringLiteral("theme"), i18n("Themed Images")); 0034 * QStringList mimetypes; 0035 * mimetypes << QStringLiteral("image/svg+xml") << QStringLiteral("image/png") << QStringLiteral("image/jpeg"); 0036 * package->setMimeTypes("images", mimetypes); 0037 * @endcode 0038 * 0039 * @author Aaron Seigo 0040 */ 0041 class KPACKAGE_EXPORT PackageStructure : public QObject 0042 { 0043 Q_OBJECT 0044 0045 public: 0046 explicit PackageStructure(QObject *parent = nullptr, const QVariantList &args = QVariantList()); 0047 0048 ~PackageStructure() override; 0049 0050 /** 0051 * Called when a the PackageStructure should initialize a Package with the initial 0052 * structure. This allows setting paths before setPath is called. 0053 * 0054 * Note: one special value is "metadata" which can be set to the location of KPluginMetaData 0055 * compatible .desktop file within the package. If not defined, it is assumed that this file 0056 * exists under the top level directory of the package. 0057 * 0058 * @param package the Package to set up. The object is empty of all definition when 0059 * first passed in. 0060 */ 0061 virtual void initPackage(Package *package); 0062 0063 /** 0064 * Called whenever the path changes so that subclasses may take 0065 * package specific actions. 0066 */ 0067 virtual void pathChanged(Package *package); 0068 0069 /** 0070 * Installs a package matching this package structure. By default installs a 0071 * native KPackage::Package. 0072 * 0073 * @param package the instance of Package that is being used for the install; useful for 0074 * accessing file paths 0075 * @param archivePath path to the package archive file 0076 * @param packageRoot path to the directory where the package should be 0077 * installed to 0078 * @return KJob* to track the installation status 0079 **/ 0080 virtual KJob *install(Package *package, const QString &archivePath, const QString &packageRoot); 0081 0082 /** 0083 * Updates a package matching this package structure. By default installs a 0084 * native KPackage::Package. If an older version is already installed, 0085 * it removes the old one. If the installed one is newer, 0086 * an error will occur. 0087 * 0088 * @param package the instance of Package that is being used for the install; useful for 0089 * accessing file paths 0090 * @param archivePath path to the package archive file 0091 * @param packageRoot path to the directory where the package should be 0092 * installed to 0093 * @return KJob* to track the installation status 0094 * @since 5.17 0095 **/ 0096 virtual KJob *update(Package *package, const QString &archivePath, const QString &packageRoot); 0097 0098 /** 0099 * Uninstalls a package matching this package structure. 0100 * 0101 * @param package the instance of Package that is being used for the install; useful for 0102 * accessing file paths 0103 * @param packageName the name of the package to remove 0104 * @param packageRoot path to the directory where the package should be installed to 0105 * @return KJob* to track the installation status 0106 */ 0107 virtual KJob *uninstall(Package *package, const QString &packageRoot); 0108 0109 private: 0110 PackageStructurePrivate *d; 0111 }; 0112 0113 } // KPackage namespace 0114 0115 /** 0116 * Register a Package class when it is contained in a loadable module 0117 */ 0118 0119 #define K_EXPORT_KPACKAGE_PACKAGE_WITH_JSON(classname, jsonFile) K_PLUGIN_FACTORY_WITH_JSON(factory, jsonFile, registerPlugin<classname>();) 0120 0121 #endif