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)