Blame SOURCES/0002-Trigger-installation-of-missing-components-when-inst.patch

e4fba6
diff -up kdelibs-4.8.90/plasma/package.cpp.libplasma-pk-0002 kdelibs-4.8.90/plasma/package.cpp
e4fba6
--- kdelibs-4.8.90/plasma/package.cpp.libplasma-pk-0002	2012-06-05 10:47:01.000000000 +0200
e4fba6
+++ kdelibs-4.8.90/plasma/package.cpp	2012-06-08 15:40:14.219728253 +0200
e4fba6
@@ -43,8 +43,11 @@
e4fba6
 #include <kdebug.h>
e4fba6
 
e4fba6
 #include "authorizationmanager.h"
e4fba6
+#include "dataenginemanager.h"
e4fba6
 #include "packagemetadata.h"
e4fba6
+#include "scripting/scriptengine.h"
e4fba6
 #include "private/authorizationmanager_p.h"
e4fba6
+#include "private/componentinstaller_p.h"
e4fba6
 #include "private/package_p.h"
e4fba6
 #include "private/plasmoidservice_p.h"
e4fba6
 #include "private/service_p.h"
e4fba6
@@ -580,6 +583,41 @@ bool Package::installPackage(const QStri
e4fba6
         // no need to remove the temp dir (which has been successfully moved if it's an archive)
e4fba6
         tempdir.setAutoRemove(false);
e4fba6
     }
e4fba6
+    // check for missing dependencies
e4fba6
+    QString requiredScriptEngine = meta.implementationApi();
e4fba6
+    if (!requiredScriptEngine.isEmpty()) {
e4fba6
+        // figure out the component type to query for
e4fba6
+        ComponentTypes componentTypes = static_cast<ComponentTypes>(0);
e4fba6
+        QStringList serviceTypes = meta.serviceType().split(',');
e4fba6
+        if (serviceTypes.contains("Plasma/Applet")) {
e4fba6
+            componentTypes |= AppletComponent;
e4fba6
+        }
e4fba6
+        if (serviceTypes.contains("Plasma/DataEngine")) {
e4fba6
+            componentTypes |= DataEngineComponent;
e4fba6
+        }
e4fba6
+        if (serviceTypes.contains("Plasma/Runner")) {
e4fba6
+            componentTypes |= RunnerComponent;
e4fba6
+        }
e4fba6
+        if (serviceTypes.contains("Plasma/Wallpaper")) {
e4fba6
+            componentTypes |= WallpaperComponent;
e4fba6
+        }
e4fba6
+        if (!knownLanguages(componentTypes).contains(requiredScriptEngine)) {
e4fba6
+            // install the missing script engine
e4fba6
+            // force prompting because the user has just explicitly installed a widget
e4fba6
+            ComponentInstaller::self()->installMissingComponent("scriptengine", requiredScriptEngine, 0, true);
e4fba6
+        }
e4fba6
+    }
e4fba6
+    QStringList requiredDataEngines = meta.requiredDataEngines();
e4fba6
+    if (!requiredDataEngines.isEmpty()) {
e4fba6
+        QStringList knownDataEngines = DataEngineManager::self()->listAllEngines(meta.application());
e4fba6
+        foreach (const QString &requiredDataEngine, requiredDataEngines) {
e4fba6
+            if (!knownDataEngines.contains(requiredDataEngine)) {
e4fba6
+                // install the missing data engine
e4fba6
+                // force prompting because the user has just explicitly installed a widget
e4fba6
+                ComponentInstaller::self()->installMissingComponent("dataengine", requiredDataEngine, 0, true);
e4fba6
+            }
e4fba6
+        }
e4fba6
+    }
e4fba6
 
e4fba6
     if (!servicePrefix.isEmpty()) {
e4fba6
         // and now we register it as a service =)
e4fba6
diff -up kdelibs-4.8.90/plasma/packagemetadata.cpp.libplasma-pk-0002 kdelibs-4.8.90/plasma/packagemetadata.cpp
e4fba6
--- kdelibs-4.8.90/plasma/packagemetadata.cpp.libplasma-pk-0002	2012-05-23 01:45:26.000000000 +0200
e4fba6
+++ kdelibs-4.8.90/plasma/packagemetadata.cpp	2012-06-08 15:24:24.439149182 +0200
e4fba6
@@ -52,6 +52,7 @@ class PackageMetadataPrivate
e4fba6
         QString serviceType;
e4fba6
         QString api;
e4fba6
         KUrl location;
e4fba6
+        QStringList requiredDataEngines;
e4fba6
 };
e4fba6
 
e4fba6
 PackageMetadata::PackageMetadata(const PackageMetadata &other)
e4fba6
@@ -108,6 +109,7 @@ void PackageMetadata::write(const QStrin
e4fba6
     config.writeEntry("X-KDE-ParentApp", d->app);
e4fba6
     config.writeEntry("Type", d->type);
e4fba6
     config.writeEntry("X-Plasma-RemoteLocation", d->location);
e4fba6
+    config.writeEntry("X-Plasma-RequiredDataEngines", d->requiredDataEngines);
e4fba6
 }
e4fba6
 
e4fba6
 void PackageMetadata::read(const QString &filename)
e4fba6
@@ -154,6 +156,7 @@ void PackageMetadata::read(const QString
e4fba6
     d->app = config.readEntry("X-KDE-ParentApp", d->app);
e4fba6
     d->type = config.readEntry("Type", d->type);
e4fba6
     d->location = config.readEntry("X-Plasma-RemoteLocation", d->location);
e4fba6
+    d->requiredDataEngines = config.readEntry("X-Plasma-RequiredDataEngines", d->requiredDataEngines);
e4fba6
 }
e4fba6
 
e4fba6
 QString PackageMetadata::name() const
e4fba6
@@ -246,6 +249,11 @@ QString PackageMetadata::implementationA
e4fba6
     return d->api;
e4fba6
 }
e4fba6
 
e4fba6
+QStringList PackageMetadata::requiredDataEngines() const
e4fba6
+{
e4fba6
+    return d->requiredDataEngines;
e4fba6
+}
e4fba6
+
e4fba6
 void PackageMetadata::setImplementationApi(const QString &api)
e4fba6
 {
e4fba6
     d->api = api;
e4fba6
@@ -321,6 +329,11 @@ void PackageMetadata::setRemoteLocation(
e4fba6
     d->location = location;
e4fba6
 }
e4fba6
 
e4fba6
+void PackageMetadata::setRequiredDataEngines(const QStringList &requiredDataEngines)
e4fba6
+{
e4fba6
+    d->requiredDataEngines = requiredDataEngines;
e4fba6
+}
e4fba6
+
e4fba6
 void PackageMetadata::setType(const QString &type)
e4fba6
 {
e4fba6
     d->type = type;
e4fba6
diff -up kdelibs-4.8.90/plasma/packagemetadata.h.libplasma-pk-0002 kdelibs-4.8.90/plasma/packagemetadata.h
e4fba6
--- kdelibs-4.8.90/plasma/packagemetadata.h.libplasma-pk-0002	2012-05-23 01:45:26.000000000 +0200
e4fba6
+++ kdelibs-4.8.90/plasma/packagemetadata.h	2012-06-08 15:24:24.481149665 +0200
e4fba6
@@ -21,6 +21,7 @@
e4fba6
 #define PLASMA_PACKAGEMETADATA_H
e4fba6
 
e4fba6
 #include <QtCore/QString>
e4fba6
+#include <QtCore/QStringList>
e4fba6
 
e4fba6
 #include <plasma/plasma_export.h>
e4fba6
 
e4fba6
@@ -92,6 +93,7 @@ public:
e4fba6
     QString pluginName() const;
e4fba6
     QString implementationApi() const;
e4fba6
     KUrl remoteLocation() const;
e4fba6
+    QStringList requiredDataEngines() const;
e4fba6
 
e4fba6
     QString type() const;
e4fba6
 
e4fba6
@@ -205,6 +207,11 @@ public:
e4fba6
      */
e4fba6
     void setImplementationApi(const QString &api);
e4fba6
 
e4fba6
+    /**
e4fba6
+     * Set the required data engines for this package.
e4fba6
+     */
e4fba6
+    void setRequiredDataEngines(const QStringList &);
e4fba6
+
e4fba6
 private:
e4fba6
     PackageMetadataPrivate * const d;
e4fba6
 };