Blame SOURCES/kde-workspace-4.11.7-weather-fix-bbcukmet-crash-kde#332392.patch

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