Blob Blame History Raw
diff -ur kde-workspace-4.11.7-weather-fix-bbcukmet-clear-sky/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp kde-workspace-4.11.7-weather-fix-bbcukmet-crash-kde#332392/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp
--- kde-workspace-4.11.7-weather-fix-bbcukmet-clear-sky/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp	2014-03-24 02:27:37.000000000 +0100
+++ kde-workspace-4.11.7-weather-fix-bbcukmet-crash-kde#332392/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.cpp	2014-03-25 16:00:40.000000000 +0100
@@ -23,6 +23,13 @@
 
 #include <KIO/Job>
 #include <KUnitConversion/Converter>
+#include <KDateTime>
+
+WeatherData::WeatherData()
+        : obsTime("N/A"), iconPeriodHour(12), iconPeriodMinute(0),
+          longitude(0.), latitude(0.), condition("N/A")
+{
+}
 
 // ctor, dtor
 UKMETIon::UKMETIon(QObject *parent, const QVariantList &args)
@@ -553,16 +560,31 @@
 
                 // Get the observation time and condition
                 int splitIndex = conditionString.lastIndexOf(':');
-                QStringRef conditionData = conditionString.midRef(splitIndex + 1); // Include ':'
-                data.obsTime = conditionString.midRef(0, splitIndex).toString();
+                if (splitIndex >= 0) {
+                    QString conditionData = conditionString.mid(splitIndex + 1); // Skip ':'
+                    data.obsTime = conditionString.left(splitIndex);
+
+                    if (data.obsTime.contains('-')) {
+                        // Saturday - 13:00 CET
+                        // Saturday - 12:00 GMT
+                        m_dateFormat = KDateTime::fromString(data.obsTime.section('-', 1, 1).trimmed(),
+                                                             "%H:%M %Z").toLocalZone().dateTime();
+                        if (m_dateFormat.isValid()) {
+                            data.iconPeriodHour = m_dateFormat.toString("hh").toInt();
+                            data.iconPeriodMinute = m_dateFormat.toString("mm").toInt();
+                        }
+                    } else {
+                        m_dateFormat = QDateTime();
+                    }
 
-                // Saturday - 13:00 CET
-                // Saturday - 12:00 GMT
-                m_dateFormat = QDateTime::fromString(data.obsTime.split("-")[1].trimmed(), "hh:mm 'GMT'");
-                data.iconPeriodHour = m_dateFormat.toString("hh").toInt();
-                data.iconPeriodMinute = m_dateFormat.toString("mm").toInt();
+                    if (conditionData.contains(',')) {
+                        data.condition = conditionData.section(',', 0, 0).trimmed();
 
-                data.condition = conditionData.toString().split(',')[0].trimmed();
+                        if (data.condition == "null") {
+                            data.condition = "N/A";
+                        }
+                    }
+                }
 
             } else if (xml.name() == "link") {
                 m_place[source].forecastHTMLUrl = xml.readElementText();
@@ -705,12 +727,12 @@
 
             // Sometimes only one of min or max are reported
             if (high.indexIn(line.split(',')[1]) == -1)
-                forecast->tempHigh = 0;
+                forecast->tempHigh = UNKNOWN_TEMPERATURE;
             else
                 forecast->tempHigh = high.cap(1).toInt();
 
             if (low.indexIn(line.split(',')[1]) == -1)
-                forecast->tempLow = 0;
+                forecast->tempLow = UNKNOWN_TEMPERATURE;
             else
                 forecast->tempLow = low.cap(1).toInt();
 
@@ -777,16 +799,21 @@
 
     const double lati = periodLatitude(source);
     const double longi = periodLongitude(source);
-    const Plasma::DataEngine::Data timeData = m_timeEngine->query(
-            QString("Local|Solar|Latitude=%1|Longitude=%2|DateTime=%3")
-                .arg(lati).arg(longi).arg(m_dateFormat.toString(Qt::ISODate)));
-
-    // Tell applet which icon to use for conditions and provide mapping for condition type to the icons to display
-    if (timeData["Corrected Elevation"].toDouble() >= 0.0) {
-        //kDebug() << "Using daytime icons\n";
-        data.insert("Condition Icon", getWeatherIcon(dayIcons(), condition(source)));
+
+    if (m_dateFormat.isValid()) {
+        const Plasma::DataEngine::Data timeData = m_timeEngine->query(
+                QString("Local|Solar|Latitude=%1|Longitude=%2|DateTime=%3")
+                    .arg(lati).arg(longi).arg(m_dateFormat.toString(Qt::ISODate)));
+
+        // Tell applet which icon to use for conditions and provide mapping for condition type to the icons to display
+        if (timeData["Corrected Elevation"].toDouble() >= 0.0) {
+            //kDebug() << "Using daytime icons\n";
+            data.insert("Condition Icon", getWeatherIcon(dayIcons(), condition(source)));
+        } else {
+            data.insert("Condition Icon", getWeatherIcon(nightIcons(), condition(source)));
+        }
     } else {
-        data.insert("Condition Icon", getWeatherIcon(nightIcons(), condition(source)));
+        data.insert("Condition Icon", getWeatherIcon(dayIcons(), condition(source)));
     }
 
     data.insert("Latitude", lati);
@@ -969,12 +996,22 @@
             m_weatherData[source].forecasts[i]->period.replace("Friday", i18nc("Short for Friday", "Fri"));
         }
 
+        int tempHigh = m_weatherData[source].forecasts[i]->tempHigh;
+        QString tempHighStr = (tempHigh == UNKNOWN_TEMPERATURE)
+                              ? QString::fromLatin1("N/A")
+                              : QString::number(tempHigh);
+
+        int tempLow = m_weatherData[source].forecasts[i]->tempLow;
+        QString tempLowStr = (tempLow == UNKNOWN_TEMPERATURE)
+                             ? QString::fromLatin1("N/A")
+                             : QString::number(tempLow);
+
         forecastData.append(QString("%1|%2|%3|%4|%5|%6") \
                             .arg(m_weatherData[source].forecasts[i]->period) \
                             .arg(m_weatherData[source].forecasts[i]->iconName) \
                             .arg(m_weatherData[source].forecasts[i]->summary) \
-                            .arg(m_weatherData[source].forecasts[i]->tempHigh) \
-                            .arg(m_weatherData[source].forecasts[i]->tempLow) \
+                            .arg(tempHighStr) \
+                            .arg(tempLowStr) \
                             .arg("N/U"));
         //.arg(m_weatherData[source].forecasts[i]->windSpeed)
         //arg(m_weatherData[source].forecasts[i]->windDirection));
diff -ur kde-workspace-4.11.7-weather-fix-bbcukmet-clear-sky/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h kde-workspace-4.11.7-weather-fix-bbcukmet-crash-kde#332392/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h
--- kde-workspace-4.11.7-weather-fix-bbcukmet-clear-sky/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h	2014-02-28 00:09:20.000000000 +0100
+++ kde-workspace-4.11.7-weather-fix-bbcukmet-crash-kde#332392/plasma/generic/dataengines/weather/ions/bbcukmet/ion_bbcukmet.h	2014-03-24 22:34:59.000000000 +0100
@@ -24,6 +24,7 @@
 
 #include <QtXml/QXmlStreamReader>
 #include <QDateTime>
+#include <climits>
 
 #include "../ion.h"
 #include "../dataengineconsumer.h"
@@ -39,6 +40,8 @@
 {
 
 public:
+    WeatherData();
+
     QString place;
     QString stationName;
     // Current observation information.
@@ -171,6 +174,8 @@
 
     QDateTime m_dateFormat;
     QStringList m_sourcesToReset;
+
+    static const int UNKNOWN_TEMPERATURE = INT_MIN;
 };
 
 K_EXPORT_PLASMA_DATAENGINE(bbcukmet, UKMETIon)