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 #include +#include + +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 #include +#include #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)