From 2ecf718cc9d460ad192de196aac8d13e30a7ab4c Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Wed, 15 Aug 2012 15:53:09 +0200 Subject: preparing meecastweather plugin --- meecastweather/meecastplugin.cpp | 37 +++++ meecastweather/meecastplugin.h | 25 ++++ meecastweather/meecastprovider.cpp | 29 ++++ meecastweather/meecastprovider.h | 28 ++++ meecastweather/meecastweather.cpp | 272 +++++++++++++++++++++++++++++++++++++ meecastweather/meecastweather.h | 52 +++++++ meecastweather/meecastweather.pro | 24 ++++ sowatch.pro | 2 + 8 files changed, 469 insertions(+) create mode 100644 meecastweather/meecastplugin.cpp create mode 100644 meecastweather/meecastplugin.h create mode 100644 meecastweather/meecastprovider.cpp create mode 100644 meecastweather/meecastprovider.h create mode 100644 meecastweather/meecastweather.cpp create mode 100644 meecastweather/meecastweather.h create mode 100644 meecastweather/meecastweather.pro 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 + +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 +#include +#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 + +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 +#include +#include +#include + +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 -- cgit v1.2.3