summaryrefslogtreecommitdiff
path: root/meecastweather/meecastweather.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'meecastweather/meecastweather.cpp')
-rw-r--r--meecastweather/meecastweather.cpp272
1 files changed, 272 insertions, 0 deletions
diff --git a/meecastweather/meecastweather.cpp b/meecastweather/meecastweather.cpp
new file mode 100644
index 0000000..c4daeb9
--- /dev/null
+++ b/meecastweather/meecastweather.cpp
@@ -0,0 +1,272 @@
+#include "harmaccuweather.h"
+
+using namespace sowatch;
+
+#define ACCUWEATHER_FILE_PATH "/home/user/.config/AccuWeather, Inc./awxapp.conf"
+
+HarmAccuWeather::HarmAccuWeather(QObject *parent) :
+ WeatherNotification(parent),
+ _watcher(new QFileSystemWatcher(this)),
+ _timer(new QTimer(this)),
+ _lastUpdate(QDateTime::fromTime_t(0))
+{
+ // This only works on Harmattan either way, so I guess
+ // hardcoding the path is OK.
+ _watcher->addPath(ACCUWEATHER_FILE_PATH);
+ connect(_watcher, SIGNAL(fileChanged(QString)), SLOT(fileChanged(QString)));
+
+ _timer->setInterval(5000);
+ _timer->setSingleShot(true);
+ connect(_timer, SIGNAL(timeout()), SLOT(update()));
+
+ // Perform an initial update
+ update();
+}
+
+QSettings* HarmAccuWeather::getAccuweatherData()
+{
+ return new QSettings(ACCUWEATHER_FILE_PATH, QSettings::IniFormat);
+}
+
+Notification::Type HarmAccuWeather::type() const
+{
+ return Notification::WeatherNotification;
+}
+
+uint HarmAccuWeather::count() const
+{
+ return 1;
+}
+
+QDateTime HarmAccuWeather::dateTime() const
+{
+ return _lastUpdate;
+}
+
+QString HarmAccuWeather::title() const
+{
+ return _lastLocation;
+}
+
+QString HarmAccuWeather::body() const
+{
+ switch (_lastWxCode) {
+ case 1:
+ case 2:
+ return tr("Sunny");
+
+ case 3:
+ case 4:
+ case 5:
+ return tr("Partly cloudy");
+ case 6:
+ return tr("Mostly cloudy");
+ case 7:
+ case 8:
+ return tr("Cloudy");
+
+ case 11:
+ return tr("Fog");
+
+ case 12:
+ return tr("Light rain");
+ case 13:
+ case 14:
+ return tr("Light rain with sun");
+ case 18:
+ case 26:
+ return tr("Heavy rain");
+
+ case 15:
+ case 16:
+ return tr("Thunderstorm");
+ case 17:
+ return tr("Thunderstorm with sun");
+
+ case 19:
+ return tr("Light snow");
+ case 20:
+ case 21:
+ return tr("Light snow with sun");
+ case 22:
+ return tr("Heavy snow");
+ case 29:
+ return tr("Heavy rain and snow");
+
+ case 25:
+ return tr("Blizzard");
+
+ case 30:
+ return tr("Hot");
+ case 31:
+ return tr("Cold");
+ case 32:
+ return tr("Wind");
+
+
+ // Night versions
+ case 33:
+ case 34:
+ return tr("Clear");
+ case 35:
+ return tr("Partly cloudy");
+ case 36:
+ case 37:
+ return tr("Mostly cloudy");
+ case 38:
+ return tr("Cloudy");
+ case 39:
+ case 40:
+ return tr("Light rain");
+ case 41:
+ case 42:
+ return tr("Thunderstorm");
+ case 43:
+ return tr("Light snow");
+ case 44:
+ return tr("Heavy snow");
+
+ default:
+ return QString("? %1").arg(_lastWxCode);
+ }
+}
+
+WeatherNotification::WeatherType HarmAccuWeather::forecast()
+{
+ switch (_lastWxCode) {
+ case 1:
+ case 2:
+ return Sunny;
+
+ case 3:
+ case 4:
+ case 5:
+ return PartlyCloudy;
+
+ case 6:
+ case 7:
+ case 8:
+ return Cloudy;
+
+ case 11:
+ return Fog;
+
+ case 12:
+ case 13:
+ case 14:
+ case 18:
+ case 26:
+ return Rain;
+
+ case 15:
+ case 16:
+ case 17:
+ return Thunderstorm;
+
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 29:
+ return Snow;
+
+ // Night versions
+ case 33:
+ case 34:
+ return Sunny;
+ case 35:
+ return PartlyCloudy;
+ case 36:
+ case 37:
+ case 38:
+ return Cloudy;
+ case 39:
+ case 40:
+ return Rain;
+ case 41:
+ case 42:
+ return Thunderstorm;
+ case 43:
+ case 44:
+ return Snow;
+
+ default:
+ return UnknownWeather;
+ }
+}
+
+int HarmAccuWeather::temperature()
+{
+ return _lastTemp;
+}
+
+WeatherNotification::Unit HarmAccuWeather::temperatureUnits()
+{
+ return _metric ? Celsius : Fahrenheit;
+}
+
+void HarmAccuWeather::activate()
+{
+ // Launch accuweather?
+}
+
+void HarmAccuWeather::dismiss()
+{
+ // Do nothing
+}
+
+void HarmAccuWeather::fileChanged(const QString &path)
+{
+ Q_UNUSED(path);
+ qDebug() << "accuweather config file changed";
+ _timer->start();
+}
+
+void HarmAccuWeather::update()
+{
+ QSettings* s = getAccuweatherData();
+
+ qDebug() << "reading accuweather config file";
+
+ QDateTime lastUpdate = s->value("LastUpdate").toDateTime();
+ if (lastUpdate > _lastUpdate) {
+ _lastUpdate = lastUpdate;
+ bool anythingChanged = false;
+
+ qDebug() << "reading weather info at" << _lastUpdate;
+
+ bool useMetric = s->value("useMetric").toBool();
+ if (useMetric != _metric) {
+ _metric = useMetric;
+ anythingChanged = true;
+ }
+
+ int temp = s->value("LastTemp").toInt();
+ if (_lastTemp != temp) {
+ _lastTemp = temp;
+ anythingChanged = true;
+ }
+
+ QString location = s->value("LastLocation").toString();
+ if (_lastLocation != location) {
+ _lastLocation = location;
+ anythingChanged = true;
+ }
+
+ int wxCode = s->value("LastWxCode").toInt();
+ if (_lastWxCode != wxCode) {
+ _lastWxCode = wxCode;
+ anythingChanged = true;
+ }
+
+ if (anythingChanged) {
+ qDebug() << "weather info changed wxcode=" << wxCode;
+ emit changed();
+ }
+ }
+
+ delete s;
+}