KDE/kdebase/workspace/plasma/dataengines/weather

Aaron J. Seigo aseigo at kde.org
Wed Apr 15 08:08:13 CEST 2009


SVN commit 954107 by aseigo:

fetch the weather when the network is available; basically i was sick of having a blank wallpaper for 30 minutes after log in just because network manager hadn't connected in the time it takes plasma to get on its feet.

this is such a simple pattern, yet one that is pretty common (getting stuff from the network at regular intervals) should it be put into DataEngine, perhaps protected: setRequiresNetwork(bool)? or perhaps a few different levels such as "NoNetworking (presumably the default), NetworkOptional, NetworkRequired" so that we can at some point turn it on/off depending on whether or not the networking is expensive/cheap/etc? none/optional/required is perhaps not fine grained enough? discuss .... :)

CCMAIL:plasma-devel at kde.org


 M  +1 -1      CMakeLists.txt  
 M  +32 -6     weatherengine.cpp  
 M  +9 -0      weatherengine.h  


--- trunk/KDE/kdebase/workspace/plasma/dataengines/weather/CMakeLists.txt #954106:954107
@@ -2,6 +2,6 @@
 
 SET(weather_SRCS weatherengine.cpp)
 kde4_add_plugin(plasma_engine_weather ${weather_SRCS})
-TARGET_LINK_LIBRARIES (plasma_engine_weather ${KDE4_KIO_LIBS} ${KDE4_PLASMA_LIBS} weather_ion)
+TARGET_LINK_LIBRARIES (plasma_engine_weather ${KDE4_KIO_LIBS} ${KDE4_SOLID_LIBS} ${KDE4_PLASMA_LIBS} weather_ion)
 INSTALL (TARGETS plasma_engine_weather DESTINATION ${PLUGIN_INSTALL_DIR})
 INSTALL (FILES plasma-dataengine-weather.desktop DESTINATION ${SERVICES_INSTALL_DIR})
--- trunk/KDE/kdebase/workspace/plasma/dataengines/weather/weatherengine.cpp #954106:954107
@@ -19,6 +19,7 @@
  ***************************************************************************/
 
 #include "weatherengine.h"
+
 #include <KServiceTypeTrader>
 #include <KDateTime>
 #include <KLocale>
@@ -30,11 +31,17 @@
 class WeatherEngine::Private
 {
 public:
+    Private()
+        : m_networkAvailable(false)
+    {
+    }
+
     /**
      * Get instance of a loaded ion.
      * @returns a IonInterface instance of a loaded plugin.
      */
-    IonInterface* ionForSource(const QString& name) {
+    IonInterface* ionForSource(const QString& name)
+    {
         int offset = name.indexOf('|');
 
         if (offset < 1) {
@@ -60,6 +67,7 @@
 
     KDateTime m_localTime;
     QStringList m_ions;
+    bool m_networkAvailable;
 };
 
 /**
@@ -113,6 +121,10 @@
         setData("ions", info.pluginName(),
                 QString("%1|%2").arg(info.property("Name").toString()).arg(info.pluginName()));
     }
+
+    d->m_networkAvailable = Solid::Networking::status() == Solid::Networking::Connected;
+    connect(Solid::Networking::notifier(), SIGNAL(statusChanged(Solid::Networking::Status)),
+            this, SLOT(networkStatusChanged(Solid::Networking::Status)));
 }
 
 /**
@@ -195,6 +207,11 @@
         }
     }
 
+    if (!d->m_networkAvailable) {
+        setData(source, Data());
+        return true;
+    }
+
     QByteArray str = source.toLocal8Bit();
 
     ion->connectSource(source, this);
@@ -215,18 +232,27 @@
 
     QByteArray str = source.toLocal8Bit();
 
-    kDebug() << "updateSourceEvent()";
+    kDebug() << "updateSourceEvent()" << ion << d->m_networkAvailable;
     if (!ion) {
         return false;
     }
 
+    if (!d->m_networkAvailable) {
+        return false;
+    }
+
     ion->setProperty("timezone", d->m_localTime.isUtc());
     ion->setProperty("unit", KGlobal::locale()->measureSystem());
+    return ion->updateSourceEvent(source);
+}
 
-    if (ion->updateSourceEvent(source)) {
-        return true;
-    } else {
-        return false;
+void WeatherEngine::networkStatusChanged(Solid::Networking::Status status)
+{
+    d->m_networkAvailable = status == Solid::Networking::Connected;
+    //kDebug() << "status changed" << d->m_networkAvailable;
+
+    if (d->m_networkAvailable) {
+        updateAllSources();
     }
 }
 
--- trunk/KDE/kdebase/workspace/plasma/dataengines/weather/weatherengine.h #954106:954107
@@ -22,7 +22,11 @@
 
 #include <KService>
 #include <KGenericFactory>
+
+#include <Solid/Networking>
+
 #include <Plasma/DataEngine>
+
 #include "ions/ion.h"
 
 class QTimer;
@@ -93,6 +97,11 @@
      */
     bool updateSourceEvent(const QString& source);
 
+    /**
+     * Whenever networking changes, take action
+     */
+    void networkStatusChanged(Solid::Networking::Status);
+
 private:
     class Private;
     Private *const d;


More information about the Plasma-devel mailing list