plasma-framework/src/plasma/package.cpp
Laurent Montel e690c4726e Warning--
2018-04-13 13:58:44 +02:00

318 lines
8.2 KiB
C++

/******************************************************************************
* Copyright 2007 by Aaron Seigo <aseigo@kde.org> *
* Copyright 2010 by Marco Martin <notmart@gmail.com> *
* Copyright 2010 by Kevin Ottens <ervin@kde.org> *
* Copyright 2009 by Rob Scheepmaker *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public License *
* along with this library; see the file COPYING.LIB. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
*******************************************************************************/
#include "package.h"
#include <qtemporarydir.h>
#include <karchive.h>
#include <QDebug>
#include <kdesktopfile.h>
#include <ktar.h>
#include <kzip.h>
#include <KJob>
#include "config-plasma.h"
#include <qstandardpaths.h>
#include <qmimedatabase.h>
#include "packagestructure.h"
#include "pluginloader.h"
#include "private/package_p.h"
#include "private/packagestructure_p.h"
namespace Plasma
{
PackagePrivate::PackagePrivate()
: internalPackage(nullptr),
fallbackPackage(nullptr),
structure(nullptr)
{
}
PackagePrivate::~PackagePrivate()
{
}
Package::Package(PackageStructure *structure)
: d(new Plasma::PackagePrivate())
{
d->structure = structure;
if (!structure) {
d->internalPackage = new KPackage::Package();
return;
}
if (!structure->d->internalStructure) {
d->structure->d->internalStructure = new KPackage::PackageStructure;
}
d->internalPackage = new KPackage::Package(structure->d->internalStructure);
PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
structure->initPackage(this);
}
Package::Package(const Package &other)
: d(new Plasma::PackagePrivate())
{
d->internalPackage = new KPackage::Package(*other.d->internalPackage);
d->structure = other.d->structure;
PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
}
Package::Package(const KPackage::Package &other)
: d(new Plasma::PackagePrivate())
{
d->internalPackage = new KPackage::Package(other);
PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
}
Package::~Package()
{
PackageStructureWrapper::s_packagesMap.remove(d->internalPackage);
delete d->internalPackage;
}
Package &Package::operator=(const Package &rhs)
{
if (&rhs != this) {
d->internalPackage = new KPackage::Package(*rhs.d->internalPackage);
d->structure = rhs.d->structure;
PackageStructureWrapper::s_packagesMap[d->internalPackage] = this;
}
return *this;
}
bool Package::hasValidStructure() const
{
return d->internalPackage->hasValidStructure();
}
bool Package::isValid() const
{
return d->internalPackage->isValid();
}
QString Package::name(const char *key) const
{
return d->internalPackage->name(key);
}
bool Package::isRequired(const char *key) const
{
return d->internalPackage->isRequired(key);
}
QStringList Package::mimeTypes(const char *key) const
{
return d->internalPackage->mimeTypes(key);
}
QString Package::defaultPackageRoot() const
{
return d->internalPackage->defaultPackageRoot();
}
void Package::setDefaultPackageRoot(const QString &packageRoot)
{
d->internalPackage->setDefaultPackageRoot(packageRoot);
}
void Package::setFallbackPackage(const Plasma::Package &package)
{
d->fallbackPackage = new Package(package);
d->internalPackage->setFallbackPackage(*package.d->internalPackage);
}
Plasma::Package Package::fallbackPackage() const
{
if (d->fallbackPackage) {
return (*d->fallbackPackage);
} else {
return Package();
}
}
QString Package::servicePrefix() const
{
return d->servicePrefix;
}
void Package::setServicePrefix(const QString &servicePrefix)
{
d->servicePrefix = servicePrefix;
}
KPackage::Package Package::kPackage() const
{
return *d->internalPackage;
}
bool Package::allowExternalPaths() const
{
return d->internalPackage->allowExternalPaths();
}
void Package::setAllowExternalPaths(bool allow)
{
d->internalPackage->setAllowExternalPaths(allow);
}
KPluginInfo Package::metadata() const
{
return KPluginInfo::fromMetaData(d->internalPackage->metadata());
}
QString Package::filePath(const char *fileType, const QString &filename) const
{
return d->internalPackage->filePath(fileType, filename);
}
QStringList Package::entryList(const char *key) const
{
return d->internalPackage->entryList(key);
}
void Package::setPath(const QString &path)
{
if (path == d->internalPackage->path()) {
return;
}
d->internalPackage->setPath(path);
}
const QString Package::path() const
{
return d->internalPackage->path();
}
QStringList Package::contentsPrefixPaths() const
{
return d->internalPackage->contentsPrefixPaths();
}
void Package::setContentsPrefixPaths(const QStringList &prefixPaths)
{
d->internalPackage->setContentsPrefixPaths(prefixPaths);
}
QString Package::contentsHash() const
{
return d->internalPackage->contentsHash();
}
void Package::addDirectoryDefinition(const char *key, const QString &path, const QString &name)
{
d->internalPackage->addDirectoryDefinition(key, path, name);
}
void Package::addFileDefinition(const char *key, const QString &path, const QString &name)
{
d->internalPackage->addFileDefinition(key, path, name);
}
void Package::removeDefinition(const char *key)
{
d->internalPackage->removeDefinition(key);
}
void Package::setRequired(const char *key, bool required)
{
d->internalPackage->setRequired(key, required);
}
void Package::setDefaultMimeTypes(QStringList mimeTypes)
{
d->internalPackage->setDefaultMimeTypes(mimeTypes);
}
void Package::setMimeTypes(const char *key, QStringList mimeTypes)
{
d->internalPackage->setMimeTypes(key, mimeTypes);
}
QList<const char *> Package::directories() const
{
QList<const char *> dirs;
foreach (const auto &data, d->internalPackage->directories()) {
dirs << data.constData();
}
return dirs;
}
QList<const char *> Package::requiredDirectories() const
{
QList<const char *> dirs;
foreach (const auto &data, d->internalPackage->requiredDirectories()) {
dirs << data.constData();
}
return dirs;
}
QList<const char *> Package::files() const
{
QList<const char *> files;
foreach (const auto &data, d->internalPackage->files()) {
files << data.constData();
}
return files;
}
QList<const char *> Package::requiredFiles() const
{
QList<const char *> files;
foreach (const auto &data, d->internalPackage->requiredFiles()) {
files << data.constData();
}
return files;
}
KJob *Package::install(const QString &sourcePackage, const QString &packageRoot)
{
const QString src = sourcePackage;
const QString dest = packageRoot.isEmpty() ? defaultPackageRoot() : packageRoot;
//qCDebug(LOG_PLASMA) << "Source: " << src;
//qCDebug(LOG_PLASMA) << "PackageRoot: " << dest;
KJob *j = d->structure->install(this, src, dest);
return j;
}
KJob *Package::uninstall(const QString &packageName, const QString &packageRoot)
{
setPath(packageRoot + packageName);
return d->structure->uninstall(this, packageRoot);
}
} // Namespace