From db9085233c3c7e428df21e68f1584c1827f14e2e Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 26 Mar 2017 18:18:30 +0200 Subject: [PATCH] added update check result as global MQTT topic --- src/ebusd/datahandler.h | 11 ++++++++--- src/ebusd/mainloop.cpp | 5 +++++ src/ebusd/mqtthandler.cpp | 10 +++++++++- src/ebusd/mqtthandler.h | 5 +++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/ebusd/datahandler.h b/src/ebusd/datahandler.h index 418cce0a..9d474882 100644 --- a/src/ebusd/datahandler.h +++ b/src/ebusd/datahandler.h @@ -145,15 +145,20 @@ class DataSink : virtual public DataHandler { */ virtual ~DataSink() {} + // @copydoc + bool isDataSink() override { return true; } + /** * Notify the sink of an updated @a Message. * @param message the updated @a Message. */ virtual void notifyUpdate(Message* message); - // @copydoc - bool isDataSink() override { return true; } - + /** + * Notify the sink of the latest update check result. + * @param checkResult a string describing available updates, or empty if no update is available. + */ + virtual void notifyUpdateCheckResult(string checkResult) {} protected: /** the allowed access levels. */ diff --git a/src/ebusd/mainloop.cpp b/src/ebusd/mainloop.cpp index 5b44ded3..ee1c8949 100644 --- a/src/ebusd/mainloop.cpp +++ b/src/ebusd/mainloop.cpp @@ -357,6 +357,11 @@ void MainLoop::run() { if (result == "200 OK") { m_updateCheck = message == "" ? "unknown" : message; logNotice(lf_main, "update check: %s", message.c_str()); + if (!dataSinks.empty()) { + for (list::iterator it = dataSinks.begin(); it != dataSinks.end(); it++) { + (*it)->notifyUpdateCheckResult(message == "OK" ? "" : m_updateCheck); + } + } } else { logError(lf_main, "update check error: %s", result.c_str()); } diff --git a/src/ebusd/mqtthandler.cpp b/src/ebusd/mqtthandler.cpp index bb8583de..0385feb0 100644 --- a/src/ebusd/mqtthandler.cpp +++ b/src/ebusd/mqtthandler.cpp @@ -261,7 +261,8 @@ void on_connect( MqttHandler::MqttHandler(UserInfo* userInfo, BusHandler* busHandler, MessageMap* messages) - : DataSink(userInfo, "mqtt"), DataSource(busHandler), Thread(), m_messages(messages), m_connected(false) { + : DataSink(userInfo, "mqtt"), DataSource(busHandler), Thread(), m_messages(messages), m_connected(false), + m_lastUpdateCheckResult(".") { bool enabled = g_port != 0; m_publishByField = false; m_mosquitto = NULL; @@ -478,6 +479,13 @@ void MqttHandler::notifyTopic(string topic, string data) { publishMessage(message, ostream); } +void MqttHandler::notifyUpdateCheckResult(string checkResult) { + if (checkResult != m_lastUpdateCheckResult) { + m_lastUpdateCheckResult = checkResult; + publishTopic(m_globalTopic+"updatecheck", checkResult.empty() ? "OK" : checkResult); + } +} + void MqttHandler::run() { time_t lastTaskRun, now, start, lastSignal = 0; bool signal = false; diff --git a/src/ebusd/mqtthandler.h b/src/ebusd/mqtthandler.h index c6d98120..58d9df0c 100644 --- a/src/ebusd/mqtthandler.h +++ b/src/ebusd/mqtthandler.h @@ -80,6 +80,8 @@ class MqttHandler : public DataSink, public DataSource, public Thread { */ void notifyTopic(string topic, string data); + // @copydoc + void notifyUpdateCheckResult(string checkResult) override; protected: // @copydoc @@ -135,6 +137,9 @@ class MqttHandler : public DataSink, public DataSource, public Thread { /** whether the connection to the broker is established. */ bool m_connected; + + /** the last update check result. */ + string m_lastUpdateCheckResult; }; } // namespace ebusd