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