File indexing completed on 2024-05-12 05:46:50

0001 /******************************************************************************
0002 *   Copyright 2007 by Aaron Seigo <aseigo@kde.org>                            *
0003 *   Copyright 2010 by Marco Martin <notmart@gmail.com>                        *
0004 *   Copyright 2010 by Kevin Ottens <ervin@kde.org>                            *
0005 *   Copyright 2009 by Rob Scheepmaker                                         *
0006 *                                                                             *
0007 *   This library is free software; you can redistribute it and/or             *
0008 *   modify it under the terms of the GNU Library General Public               *
0009 *   License as published by the Free Software Foundation; either              *
0010 *   version 2 of the License, or (at your option) any later version.          *
0011 *                                                                             *
0012 *   This library is distributed in the hope that it will be useful,           *
0013 *   but WITHOUT ANY WARRANTY; without even the implied warranty of            *
0014 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU          *
0015 *   Library General Public License for more details.                          *
0016 *                                                                             *
0017 *   You should have received a copy of the GNU Library General Public License *
0018 *   along with this library; see the file COPYING.LIB.  If not, write to      *
0019 *   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,      *
0020 *   Boston, MA 02110-1301, USA.                                               *
0021 *******************************************************************************/
0022 
0023 #include "package.h"
0024 
0025 #include <qtemporarydir.h>
0026 
0027 #include <karchive.h>
0028 #include <QDebug>
0029 #include <kdesktopfile.h>
0030 #include <ktar.h>
0031 #include <kzip.h>
0032 #include <KJob>
0033 
0034 #include "config-plasma.h"
0035 
0036 #include <qstandardpaths.h>
0037 #include <qmimedatabase.h>
0038 
0039 #include "packagestructure.h"
0040 #include "pluginloader.h"
0041 #include "private/package_p.h"
0042 #include "private/packagestructure_p.h"
0043 
0044 namespace Plasma
0045 {
0046 
0047 
0048 PackagePrivate::PackagePrivate()
0049     : internalPackage(nullptr),
0050       fallbackPackage(nullptr),
0051       structure(nullptr)
0052 {
0053 }
0054 
0055 PackagePrivate::~PackagePrivate()
0056 {
0057 }
0058 
0059 
0060 Package::Package(PackageStructure *structure)
0061     : d(new Plasma::PackagePrivate())
0062 {
0063     d->structure = structure;
0064 
0065     if (!structure) {
0066         d->internalPackage = new KPackage::Package();
0067         return;
0068     }
0069 
0070     if (!structure->d->internalStructure) {
0071         d->structure->d->internalStructure = new KPackage::PackageStructure;
0072     }
0073 
0074     d->internalPackage = new KPackage::Package(structure->d->internalStructure);
0075     PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
0076     structure->initPackage(this);
0077 }
0078 
0079 Package::Package(const Package &other)
0080     : d(new Plasma::PackagePrivate())
0081 {
0082     d->internalPackage = new KPackage::Package(*other.d->internalPackage);
0083     d->structure = other.d->structure;
0084     PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
0085 }
0086 
0087 Package::Package(const KPackage::Package &other)
0088     : d(new Plasma::PackagePrivate())
0089 {
0090     d->internalPackage = new KPackage::Package(other);
0091     PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
0092 }
0093 
0094 Package::~Package()
0095 {
0096     PackageStructureWrapper::s_packagesMap.remove(d->internalPackage);
0097     delete d->internalPackage;
0098 }
0099 
0100 Package &Package::operator=(const Package &rhs)
0101 {
0102     if (&rhs != this) {
0103         d->internalPackage = new KPackage::Package(*rhs.d->internalPackage);
0104         d->structure = rhs.d->structure;
0105         PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
0106     }
0107 
0108     return *this;
0109 }
0110 
0111 bool Package::hasValidStructure() const
0112 {
0113     return d->internalPackage->hasValidStructure();
0114 }
0115 
0116 bool Package::isValid() const
0117 {
0118     return d->internalPackage->isValid();
0119 }
0120 
0121 QString Package::name(const char *key) const
0122 {
0123     return d->internalPackage->name(key);
0124 }
0125 
0126 bool Package::isRequired(const char *key) const
0127 {
0128     return d->internalPackage->isRequired(key);
0129 }
0130 
0131 QStringList Package::mimeTypes(const char *key) const
0132 {
0133     return d->internalPackage->mimeTypes(key);
0134 }
0135 
0136 QString Package::defaultPackageRoot() const
0137 {
0138     return d->internalPackage->defaultPackageRoot();
0139 }
0140 
0141 void Package::setDefaultPackageRoot(const QString &packageRoot)
0142 {
0143     d->internalPackage->setDefaultPackageRoot(packageRoot);
0144 }
0145 
0146 void Package::setFallbackPackage(const Plasma::Package &package)
0147 {
0148     d->fallbackPackage = new Package(package);
0149     d->internalPackage->setFallbackPackage(*package.d->internalPackage);
0150 }
0151 
0152 Plasma::Package Package::fallbackPackage() const
0153 {
0154     if (d->fallbackPackage) {
0155         return (*d->fallbackPackage);
0156     } else {
0157         return Package();
0158     }
0159 }
0160 
0161 QString Package::servicePrefix() const
0162 {
0163     return d->servicePrefix;
0164 }
0165 
0166 void Package::setServicePrefix(const QString &servicePrefix)
0167 {
0168     d->servicePrefix = servicePrefix;
0169 }
0170 
0171 KPackage::Package Package::kPackage() const
0172 {
0173     return *d->internalPackage;
0174 }
0175 
0176 bool Package::allowExternalPaths() const
0177 {
0178     return d->internalPackage->allowExternalPaths();
0179 }
0180 
0181 void Package::setAllowExternalPaths(bool allow)
0182 {
0183     d->internalPackage->setAllowExternalPaths(allow);
0184 }
0185 
0186 KPluginInfo Package::metadata() const
0187 {
0188     return KPluginInfo::fromMetaData(d->internalPackage->metadata());
0189 }
0190 
0191 QString Package::filePath(const char *fileType, const QString &filename) const
0192 {
0193     return d->internalPackage->filePath(fileType, filename);
0194 }
0195 
0196 QStringList Package::entryList(const char *key) const
0197 {
0198     return d->internalPackage->entryList(key);
0199 }
0200 
0201 void Package::setPath(const QString &path)
0202 {
0203     if (path == d->internalPackage->path()) {
0204         return;
0205     }
0206 
0207     d->internalPackage->setPath(path);
0208 }
0209 
0210 const QString Package::path() const
0211 {
0212     return d->internalPackage->path();
0213 }
0214 
0215 QStringList Package::contentsPrefixPaths() const
0216 {
0217     return d->internalPackage->contentsPrefixPaths();
0218 }
0219 
0220 void Package::setContentsPrefixPaths(const QStringList &prefixPaths)
0221 {
0222     d->internalPackage->setContentsPrefixPaths(prefixPaths);
0223 }
0224 
0225 QString Package::contentsHash() const
0226 {
0227     return d->internalPackage->contentsHash();
0228 }
0229 
0230 void Package::addDirectoryDefinition(const char *key, const QString &path, const QString &name)
0231 {
0232     d->internalPackage->addDirectoryDefinition(key, path, name);
0233 }
0234 
0235 void Package::addFileDefinition(const char *key, const QString &path, const QString &name)
0236 {
0237     d->internalPackage->addFileDefinition(key, path, name);
0238 }
0239 
0240 void Package::removeDefinition(const char *key)
0241 {
0242     d->internalPackage->removeDefinition(key);
0243 }
0244 
0245 void Package::setRequired(const char *key, bool required)
0246 {
0247     d->internalPackage->setRequired(key, required);
0248 }
0249 
0250 void Package::setDefaultMimeTypes(QStringList mimeTypes)
0251 {
0252     d->internalPackage->setDefaultMimeTypes(mimeTypes);
0253 }
0254 
0255 void Package::setMimeTypes(const char *key, QStringList mimeTypes)
0256 {
0257     d->internalPackage->setMimeTypes(key, mimeTypes);
0258 }
0259 
0260 QList<const char *> Package::directories() const
0261 {
0262     QList<const char *> dirs;
0263     foreach (const auto &data, d->internalPackage->directories()) {
0264         dirs << data.constData();
0265     }
0266 
0267     return dirs;
0268 }
0269 
0270 QList<const char *> Package::requiredDirectories() const
0271 {
0272     QList<const char *> dirs;
0273     foreach (const auto &data, d->internalPackage->requiredDirectories()) {
0274         dirs << data.constData();
0275     }
0276 
0277     return dirs;
0278 }
0279 
0280 QList<const char *> Package::files() const
0281 {
0282     QList<const char *> files;
0283     foreach (const auto &data, d->internalPackage->files()) {
0284         files << data.constData();
0285     }
0286 
0287     return files;
0288 }
0289 
0290 QList<const char *> Package::requiredFiles() const
0291 {
0292     QList<const char *> files;
0293     foreach (const auto &data, d->internalPackage->requiredFiles()) {
0294         files << data.constData();
0295     }
0296 
0297     return files;
0298 }
0299 
0300 KJob *Package::install(const QString &sourcePackage, const QString &packageRoot)
0301 {
0302     const QString src = sourcePackage;
0303     const QString dest = packageRoot.isEmpty() ? defaultPackageRoot() : packageRoot;
0304     //qCDebug(LOG_PLASMA) << "Source: " << src;
0305     //qCDebug(LOG_PLASMA) << "PackageRoot: " << dest;
0306     KJob *j = d->structure->install(this, src, dest);
0307     return j;
0308 }
0309 
0310 KJob *Package::uninstall(const QString &packageName, const QString &packageRoot)
0311 {
0312     setPath(packageRoot + packageName);
0313 
0314     return d->structure->uninstall(this, packageRoot);
0315 }
0316 
0317 } // Namespace