[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/workspace/libs/plasma
From:       Petri Damstén <petri.damsten () kdemail ! net>
Date:       2008-11-02 15:29:00
Message-ID: 1225639740.195409.30199.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 879173 by pdamsten:

Support for metadata in PackageStructure.

 M  +2 -9      package.cpp  
 M  +61 -1     packagestructure.cpp  
 M  +7 -1      packagestructure.h  


--- trunk/KDE/kdebase/workspace/libs/plasma/package.cpp #879172:879173
@@ -50,8 +50,7 @@
     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 @@
 
     ~PackagePrivate()
     {
-        delete metadata;
     }
 
     PackageStructure::Ptr structure;
     QString basePath;
     bool valid;
-    PackageMetadata *metadata;
 };
 
 Package::Package(const QString &packageRoot, const QString &package,
@@ -179,11 +176,7 @@
 
 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
--- trunk/KDE/kdebase/workspace/libs/plasma/packagestructure.cpp #879172:879173
@@ -1,5 +1,5 @@
 /******************************************************************************
-*   Copyright 2007 by Aaron Seigo <aseigo@kde.org>                        *
+*   Copyright 2007 by Aaron Seigo <aseigo@kde.org>                            *
 *                                                                             *
 *   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 <QMap>
+#include <QFileInfo>
 
 #include <KConfigGroup>
 #include <KStandardDirs>
 #include <KServiceTypeTrader>
 #include <KUrl>
 #include <KTemporaryFile>
+#include <KTempDir>
+#include <KZip>
 #include <kio/netaccess.h>
 #include <kio/job.h>
 
@@ -62,6 +65,15 @@
 class PackageStructurePrivate
 {
 public:
+    PackageStructurePrivate()
+        : metadata(0)
+    {
+    }
+    ~PackageStructurePrivate()
+    {
+        delete metadata;
+    }
+
     QString type;
     QString path;
     QString contentsPrefix;
@@ -70,6 +82,7 @@
     QMap<QByteArray, ContentStructure> contents;
     QStringList mimetypes;
     static QHash<QString, PackageStructure::Ptr> structures;
+    PackageMetadata *metadata;
  };
 
 QHash<QString, PackageStructure::Ptr> PackageStructurePrivate::structures;
@@ -403,6 +416,7 @@
 
 void PackageStructure::createNewWidgetBrowser(QWidget *parent)
 {
+    Q_UNUSED(parent)
     emit newWidgetBrowserFinished();
 }
 
@@ -426,6 +440,52 @@
     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"
--- trunk/KDE/kdebase/workspace/libs/plasma/packagestructure.h #879172:879173
@@ -28,6 +28,7 @@
 #include <KDE/KSharedPtr>
 
 #include <plasma/version.h>
+#include "packagemetadata.h"
 
 class KConfigBase;
 
@@ -80,7 +81,7 @@
      *
      * @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 @@
      */
     void setServicePrefix(const QString &servicePrefix);
 
+    /**
+      * @return the package metadata object.
+      */
+    virtual PackageMetadata metadata();
+
 Q_SIGNALS:
     /**
      * Emitted when the new widget browser process completes.
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic