summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meecastweather/meecastplugin.cpp37
-rw-r--r--meecastweather/meecastplugin.h25
-rw-r--r--meecastweather/meecastprovider.cpp29
-rw-r--r--meecastweather/meecastprovider.h28
-rw-r--r--meecastweather/meecastweather.cpp272
-rw-r--r--meecastweather/meecastweather.h52
-rw-r--r--meecastweather/meecastweather.pro24
-rw-r--r--sowatch.pro2
8 files changed, 469 insertions, 0 deletions
diff --git a/meecastweather/meecastplugin.cpp b/meecastweather/meecastplugin.cpp
new file mode 100644
index 0000000..ff7b6cf
--- /dev/null
+++ b/meecastweather/meecastplugin.cpp
@@ -0,0 +1,37 @@
+#include "harmaccuprovider.h"
+#include "harmaccuplugin.h"
+
+using namespace sowatch;
+
+HarmAccuPlugin::HarmAccuPlugin(QObject *parent) :
+ QObject(parent)
+{
+}
+
+HarmAccuPlugin::~HarmAccuPlugin()
+{
+}
+
+QStringList HarmAccuPlugin::providers()
+{
+ QStringList providers;
+ providers << "harmaccu";
+ return providers;
+}
+
+NotificationPluginInterface::NotificationProviderInfo HarmAccuPlugin::describeProvider(const QString &driver)
+{
+ NotificationProviderInfo info;
+ if (driver != "harmaccu") return info;
+ info.name = "Accuweather";
+ return info;
+}
+
+NotificationProvider* HarmAccuPlugin::getProvider(const QString& id, ConfigKey *settings, QObject *parent)
+{
+ Q_UNUSED(settings);
+ if (id != "harmaccu") return 0;
+ return new HarmAccuProvider(parent);
+}
+
+Q_EXPORT_PLUGIN2(harmaccuweather, HarmAccuPlugin)
diff --git a/meecastweather/meecastplugin.h b/meecastweather/meecastplugin.h
new file mode 100644
index 0000000..535b4a2
--- /dev/null
+++ b/meecastweather/meecastplugin.h
@@ -0,0 +1,25 @@
+#ifndef CKITCALLPLUGIN_H
+#define CKITCALLPLUGIN_H
+
+#include <sowatch.h>
+
+namespace sowatch
+{
+
+class HarmAccuPlugin : public QObject, public NotificationPluginInterface
+{
+ Q_OBJECT
+ Q_INTERFACES(sowatch::NotificationPluginInterface)
+
+public:
+ HarmAccuPlugin(QObject *parent = 0);
+ ~HarmAccuPlugin();
+
+ QStringList providers();
+ NotificationProviderInfo describeProvider(const QString &driver);
+ NotificationProvider* getProvider(const QString& driver, ConfigKey *settings, QObject *parent = 0);
+};
+
+}
+
+#endif // CKITCALLPLUGIN_H
diff --git a/meecastweather/meecastprovider.cpp b/meecastweather/meecastprovider.cpp
new file mode 100644
index 0000000..2c26b67
--- /dev/null
+++ b/meecastweather/meecastprovider.cpp
@@ -0,0 +1,29 @@
+#include <QtCore/QtDebug>
+#include <QtCore/QTimer>
+#include "harmaccuweather.h"
+#include "harmaccuprovider.h"
+
+using namespace sowatch;
+
+HarmAccuProvider::HarmAccuProvider(QObject *parent) :
+ NotificationProvider(parent)
+{
+ // Give some time to send the first notification
+ QTimer::singleShot(2000, this, SLOT(generateNotification()));
+}
+
+HarmAccuProvider::~HarmAccuProvider()
+{
+}
+
+void HarmAccuProvider::generateNotification()
+{
+ QSettings* s = HarmAccuWeather::getAccuweatherData();
+ if (s->contains("LastUpdate")) {
+ qDebug() << "generating harmaccuweather notification";
+ emit incomingNotification(new HarmAccuWeather(this));
+ } else {
+ qWarning() << "Accuweather config file does not seem to exist";
+ }
+ delete s;
+}
diff --git a/meecastweather/meecastprovider.h b/meecastweather/meecastprovider.h
new file mode 100644
index 0000000..4524e12
--- /dev/null
+++ b/meecastweather/meecastprovider.h
@@ -0,0 +1,28 @@
+#ifndef HARMACCUPROVIDER_H
+#define HARMACCUPROVIDER_H
+
+#include <sowatch.h>
+
+namespace sowatch
+{
+
+class HarmAccuWeather;
+
+class HarmAccuProvider : public NotificationProvider
+{
+ Q_OBJECT
+
+public:
+ explicit HarmAccuProvider(QObject *parent = 0);
+ ~HarmAccuProvider();
+
+public slots:
+ void generateNotification();
+
+private:
+
+};
+
+}
+
+#endif // HARMACCUPROVIDER_H
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;
+}
diff --git a/meecastweather/meecastweather.h b/meecastweather/meecastweather.h
new file mode 100644
index 0000000..8b403b9
--- /dev/null
+++ b/meecastweather/meecastweather.h
@@ -0,0 +1,52 @@
+#ifndef HARMACCUWEATHER_H
+#define HARMACCUWEATHER_H
+
+#include <QtCore/QFileSystemWatcher>
+#include <QtCore/QTimer>
+#include <QtCore/QSettings>
+#include <sowatch.h>
+
+namespace sowatch
+{
+
+class HarmAccuWeather : public WeatherNotification
+{
+ Q_OBJECT
+
+public:
+ explicit HarmAccuWeather(QObject *parent = 0);
+
+ static QSettings* getAccuweatherData();
+
+ Type type() const;
+ uint count() const;
+ QDateTime dateTime() const;
+ QString title() const;
+ QString body() const;
+
+ WeatherType forecast();
+ int temperature();
+ Unit temperatureUnits();
+
+ void activate();
+ void dismiss();
+
+private slots:
+ void fileChanged(const QString& path);
+ void update();
+
+private:
+ QFileSystemWatcher* _watcher;
+ QTimer* _timer;
+
+ bool _metric;
+ QDateTime _lastUpdate;
+ QString _lastLocation;
+ int _lastTemp;
+ int _lastWxCode;
+
+};
+
+}
+
+#endif // HARMACCUWEATHER_H
diff --git a/meecastweather/meecastweather.pro b/meecastweather/meecastweather.pro
new file mode 100644
index 0000000..bccc255
--- /dev/null
+++ b/meecastweather/meecastweather.pro
@@ -0,0 +1,24 @@
+TARGET = meecastweather
+TEMPLATE = lib
+CONFIG += plugin
+CONFIG += mobility
+MOBILITY += systeminfo
+
+SOURCES += meecastplugin.cpp meecastprovider.cpp meecastweather.cpp
+
+HEADERS += meecastplugin.h meecastprovider.h meecastweather.h
+
+unix: LIBS += -L$$OUT_PWD/../libsowatch/ -lsowatch
+
+INCLUDEPATH += $$PWD/../libsowatch
+DEPENDPATH += $$PWD/../libsowatch
+
+unix:!symbian {
+ !isEmpty(MEEGO_VERSION_MAJOR)|maemo5 {
+ QMAKE_RPATHDIR += /opt/sowatch/lib
+ target.path = /opt/sowatch/lib/notifications
+ } else {
+ target.path = /usr/lib/sowatch/notifications
+ }
+ INSTALLS += target
+}
diff --git a/sowatch.pro b/sowatch.pro
index 628802a..f0aae71 100644
--- a/sowatch.pro
+++ b/sowatch.pro
@@ -28,11 +28,13 @@ contains(MEEGO_EDITION,harmattan) {
# Harmattan specific stuff
SUBDIRS += meegohandsetnotification ckitcallnotification harmaccuweather
SUBDIRS += qmafwwatchlet
+ SUBDIRS += meecastweather
meegohandsetnotification.depends = libsowatch
ckitcallnotification.depends = libsowatch
harmaccuweather.depends = libsowatch
qmafwwatchlet.depends = libsowatch
+ meecastweather.depends = libsowatch
} else:simulator {
# This notification provider builds almost everywhere so it's good enough as testcase
SUBDIRS += harmaccuweather