From 870e71030764e34ca28837b3250048a8b2dbfa09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20Damst=C3=A9n?= Date: Sun, 2 Nov 2008 15:28:59 +0000 Subject: [PATCH] Support for metadata in PackageStructure. svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=879173 --- package.cpp | 11 ++------ packagestructure.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++- packagestructure.h | 8 +++++- 3 files changed, 70 insertions(+), 11 deletions(-) diff --git a/package.cpp b/package.cpp index 8c63898ff..30c2c082a 100644 --- a/package.cpp +++ b/package.cpp @@ -50,8 +50,7 @@ public: PackagePrivate(const PackageStructure::Ptr st, const QString &p) : structure(st), basePath(p), - valid(QFile::exists(basePath)), - metadata(0) + valid(QFile::exists(basePath)) { if (valid && basePath[basePath.length() - 1] != '/') { basePath.append('/'); @@ -60,13 +59,11 @@ public: ~PackagePrivate() { - delete metadata; } PackageStructure::Ptr structure; QString basePath; bool valid; - PackageMetadata *metadata; }; Package::Package(const QString &packageRoot, const QString &package, @@ -179,11 +176,7 @@ QStringList Package::entryList(const char *fileType) const PackageMetadata Package::metadata() const { - //FIXME: this only works for native plasma packges; should fall back to... PackageStructure? - if (!d->metadata) { - d->metadata = new PackageMetadata(d->basePath + "metadata.desktop"); - } - return *d->metadata; + return d->structure->metadata(); } const QString Package::path() const diff --git a/packagestructure.cpp b/packagestructure.cpp index 0db5f729f..70d11aa25 100644 --- a/packagestructure.cpp +++ b/packagestructure.cpp @@ -1,5 +1,5 @@ /****************************************************************************** -* Copyright 2007 by Aaron Seigo * +* Copyright 2007 by Aaron Seigo * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * @@ -20,12 +20,15 @@ #include "packagestructure.h" #include +#include #include #include #include #include #include +#include +#include #include #include @@ -62,6 +65,15 @@ class ContentStructure class PackageStructurePrivate { public: + PackageStructurePrivate() + : metadata(0) + { + } + ~PackageStructurePrivate() + { + delete metadata; + } + QString type; QString path; QString contentsPrefix; @@ -70,6 +82,7 @@ public: QMap contents; QStringList mimetypes; static QHash structures; + PackageMetadata *metadata; }; QHash PackageStructurePrivate::structures; @@ -403,6 +416,7 @@ bool PackageStructure::uninstallPackage(const QString &packageName, const QStrin void PackageStructure::createNewWidgetBrowser(QWidget *parent) { + Q_UNUSED(parent) emit newWidgetBrowserFinished(); } @@ -426,6 +440,52 @@ void PackageStructure::setServicePrefix(const QString &servicePrefix) d->servicePrefix = servicePrefix; } +PackageMetadata PackageStructure::metadata() +{ + if (!d->metadata) { + QString metadataPath; + QString package = d->path; + KTempDir tempdir; + + QFileInfo fileInfo(package); + if (fileInfo.exists()) { + QString path; + + if (fileInfo.isDir()) { + path = package; + } else { + KZip archive(package); + if (archive.open(QIODevice::ReadOnly)) { + const KArchiveDirectory *source = archive.directory(); + const KArchiveEntry *metadata = source->entry("metadata.desktop"); + + if (metadata) { + path = tempdir.name(); + source->copyTo(path); + } else { + kWarning() << "No metadata file in package" << package; + } + } else { + kWarning() << "Could not open package file:" << package; + } + } + if (!path.isEmpty()) { + metadataPath = path + "/metadata.desktop"; + if (!QFile::exists(metadataPath)) { + metadataPath.clear(); + kWarning() << "No such file:" << metadataPath; + } + } + } + if (metadataPath.isEmpty()) { + d->metadata = new PackageMetadata(); + } else { + d->metadata = new PackageMetadata(metadataPath); + } + } + return *d->metadata; +} + } // Plasma namespace #include "packagestructure.moc" diff --git a/packagestructure.h b/packagestructure.h index 116911308..bf41c360f 100644 --- a/packagestructure.h +++ b/packagestructure.h @@ -28,6 +28,7 @@ #include #include +#include "packagemetadata.h" class KConfigBase; @@ -80,7 +81,7 @@ public: * * @arg type the type of package. This is often application specific. **/ - explicit PackageStructure(QObject *parent = 0, + explicit PackageStructure(QObject *parent = 0, const QString &type = i18nc("A non-functional package", "Invalid")); /** @@ -272,6 +273,11 @@ public: */ void setServicePrefix(const QString &servicePrefix); + /** + * @return the package metadata object. + */ + virtual PackageMetadata metadata(); + Q_SIGNALS: /** * Emitted when the new widget browser process completes.