diff --git a/src/plasma/package.cpp b/src/plasma/package.cpp index 5303e24b7..720ad83d5 100644 --- a/src/plasma/package.cpp +++ b/src/plasma/package.cpp @@ -189,6 +189,21 @@ void Package::setDefaultPackageRoot(const QString &packageRoot) } } +void Package::setFallbackPackagePath(const QString &path) +{ + if (d->fallbackPackagePath == path) { + return; + } + + d->fallbackPackagePath = path; + d->updateFallbackPackage(); +} + +QString Package::fallbackPackagePath() const +{ + return d->fallbackPackagePath; +} + QString Package::servicePrefix() const { return d->servicePrefix; @@ -512,33 +527,7 @@ void Package::setPath(const QString &path) QString fallback; - if (metadata().isValid()) { - fallback = metadata().property("X-KDE-fallbackPackage").toString(); - if (fallback == metadata().pluginName()) { - fallback = QString(); - } - } - if (!fallback.isEmpty()) { - if (!d->fallbackPackage) { - d->fallbackPackage = new Package(d->structure.data()); - } - d->fallbackPackage->setPath(fallback); - Plasma::Package *pkg = d->fallbackPackage; - int depth = 0; - while (pkg->d->fallbackPackage) { - //cycle or too deep? - if (depth > 10 || pkg->d->fallbackPackage->metadata().pluginName() == metadata().pluginName()) { - delete pkg->d->fallbackPackage; - pkg->d->fallbackPackage = 0; - break; - } - pkg = pkg->d->fallbackPackage; - ++depth; - } - } else { - delete d->fallbackPackage; - d->fallbackPackage = 0; - } + d->updateFallbackPackage(); // uh-oh, but we didn't end up with anything valid, so we sadly reset ourselves // to futility. @@ -819,6 +808,31 @@ PackagePrivate::~PackagePrivate() delete fallbackPackage; } +void PackagePrivate::updateFallbackPackage() +{ + if (!fallbackPackagePath.isEmpty() && fallbackPackagePath != path) { + if (!fallbackPackage) { + fallbackPackage = new Package(structure.data()); + } + fallbackPackage->setPath(fallbackPackagePath); + Plasma::Package *pkg = fallbackPackage; + int depth = 0; + while (pkg->d->fallbackPackage) { + //cycle or too deep? + if (depth > 10 || (metadata && metadata->isValid() && pkg->d->fallbackPackage->metadata().pluginName() == metadata->pluginName())) { + delete pkg->d->fallbackPackage; + pkg->d->fallbackPackage = 0; + break; + } + pkg = pkg->d->fallbackPackage; + ++depth; + } + } else { + delete fallbackPackage; + fallbackPackage = 0; + } +} + PackagePrivate &PackagePrivate::operator=(const PackagePrivate &rhs) { if (&rhs == this) { @@ -909,7 +923,7 @@ void PackagePrivate::createPackageMetadata(const QString &path) QString PackagePrivate::fallbackFilePath(const char *key, const QString &filename) const { //don't fallback if the package isn't valid and never fallback the metadata file - if (fallbackPackage && fallbackPackage->isValid() && key != "metadata") { + if (fallbackPackage && fallbackPackage->isValid() && strcmp(key, "metadata") != 0) { return fallbackPackage->filePath(key, filename); } else { return QString(); diff --git a/src/plasma/package.h b/src/plasma/package.h index 2c686d784..3fc89022e 100644 --- a/src/plasma/package.h +++ b/src/plasma/package.h @@ -290,6 +290,20 @@ public: */ void setDefaultPackageRoot(const QString &packageRoot); + /** + * Sets the fallback package root path + * If a file won't be found in this package, it will search it in the package + * with the same structure identified by path + * It is intended to be used by the packageStructure + * @param path package root path @see setPath + */ + void setFallbackPackagePath(const QString &path); + + /** + * @return The fallback package root path + */ + QString fallbackPackagePath() const; + // Content structure description methods /** * @return all directories registered as part of this Package's structure @@ -328,6 +342,7 @@ public: private: QExplicitlySharedDataPointer d; + friend class PackagePrivate; }; } diff --git a/src/plasma/private/package_p.h b/src/plasma/private/package_p.h index 786847506..29e694ce7 100644 --- a/src/plasma/private/package_p.h +++ b/src/plasma/private/package_p.h @@ -74,6 +74,7 @@ public: QString unpack(const QString &filePath); void updateHash(const QString &basePath, const QString &subPath, const QDir &dir, QCryptographicHash &hash); QString fallbackFilePath(const char *key, const QString &filename = QString()) const; + void updateFallbackPackage(); QWeakPointer structure; QString path; @@ -83,6 +84,7 @@ public: QString servicePrefix; QHash discoveries; QHash contents; + QString fallbackPackagePath; Package *fallbackPackage; #ifndef PLASMA_NO_PACKAGE_EXTRADATA QStringList mimeTypes;