From c5cb5cb359ee25689150c6361ebc506b70972cca Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Wed, 7 Sep 2016 10:23:05 +0300 Subject: [PATCH] initial import of telemetry handler --- .../awesome-widget/plugin/awesomewidget.cpp | 2 + .../plugin/awtelemetryhandler.cpp | 165 ++++++++++++++++++ .../plugin/awtelemetryhandler.h | 54 ++++++ 3 files changed, 221 insertions(+) create mode 100644 sources/awesome-widget/plugin/awtelemetryhandler.cpp create mode 100644 sources/awesome-widget/plugin/awtelemetryhandler.h diff --git a/sources/awesome-widget/plugin/awesomewidget.cpp b/sources/awesome-widget/plugin/awesomewidget.cpp index ec86494..a4828b3 100644 --- a/sources/awesome-widget/plugin/awesomewidget.cpp +++ b/sources/awesome-widget/plugin/awesomewidget.cpp @@ -24,6 +24,7 @@ #include "awconfighelper.h" #include "awformatterconfigfactory.h" #include "awkeys.h" +#include "awtelemetryhandler.h" void AWPlugin::registerTypes(const char *uri) @@ -36,4 +37,5 @@ void AWPlugin::registerTypes(const char *uri) qmlRegisterType(uri, 1, 0, "AWFormatterConfigFactory"); qmlRegisterType(uri, 1, 0, "AWKeys"); + qmlRegisterType(uri, 1, 0, "AWTelemetryHandler"); } diff --git a/sources/awesome-widget/plugin/awtelemetryhandler.cpp b/sources/awesome-widget/plugin/awtelemetryhandler.cpp new file mode 100644 index 0000000..451b470 --- /dev/null +++ b/sources/awesome-widget/plugin/awtelemetryhandler.cpp @@ -0,0 +1,165 @@ +/*************************************************************************** + * This file is part of awesome-widgets * + * * + * awesome-widgets is free software: you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * awesome-widgets is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + +#include "awtelemetryhandler.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "awdebug.h" + + +AWTelemetryHandler::AWTelemetryHandler(QObject *parent) + : QObject(parent) +{ + qCDebug(LOG_AW) << __PRETTY_FUNCTION__; + + m_genericConfig = QString("%1/awesomewidgets/general.ini") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)); + m_localFile = QString("%1/awesomewidgets/telemetry.ini") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)); + + init(); +} + + +AWTelemetryHandler::~AWTelemetryHandler() +{ + qCDebug(LOG_AW) << __PRETTY_FUNCTION__; +} + + +QStringList AWTelemetryHandler::get(const QString group) const +{ + qCDebug(LOG_AW) << "Get stored data for group" << group; + + QStringList values; + + QSettings settings(m_localFile, QSettings::IniFormat); + settings.beginGroup(group); + for (auto key : settings.childKeys()) + values.append(settings.value(key).toString()); + settings.endGroup(); + + return values; +} + + +QString AWTelemetryHandler::getLast(const QString group) const +{ + qCDebug(LOG_AW) << "Get last stored data for group" << group; + + return get(group).last(); +} + + +bool AWTelemetryHandler::put(const QString group, const QString value) const +{ + qCDebug(LOG_AW) << "Store data with group" << group << "and value" << value; + + QSettings settings(m_localFile, QSettings::IniFormat); + settings.beginGroup(group); + // values will be stored as num=value inside specified group + QString key + = QString("%1").arg(settings.childKeys().count(), 3, 10, QChar('0')); + settings.setValue(key, value); + settings.endGroup(); + + // sync settings + settings.sync(); + // check status + if (settings.status() != QSettings::NoError) + return false; + // rotate + return rotate(); +} + + +bool AWTelemetryHandler::rotate() const +{ + QSettings settings(m_localFile, QSettings::IniFormat); + for (auto group : settings.childGroups()) { + QStringList data; + settings.beginGroup(group); + // load current data + for (auto key : settings.childKeys()) + data.append(settings.value(key).toString()); + // remove first item from list + while (data.count() > m_storeCount) + data.takeFirst(); + // clear values + settings.remove(QString("")); + // save new values + for (auto value : data) { + QString key = QString("%1").arg(settings.childKeys().count(), 3, 10, + QChar('0')); + settings.setValue(key, value); + } + settings.endGroup(); + } + + // sync settings + settings.sync(); + // return status + return (settings.status() == QSettings::NoError); +} + + +void AWTelemetryHandler::init() +{ + QSettings settings(m_genericConfig, QSettings::IniFormat); + settings.beginGroup(QString("Telemetry")); + + // unique client id + m_clientId + = settings.value(QString("ClientID"), QUuid::createUuid().toString()) + .toString(); + setConfiguration(QString("ClientID"), m_clientId, false); + // count items to store + m_storeCount = settings.value(QString("StoreHistory"), 100).toInt(); + setConfiguration(QString("StoreHistory"), m_storeCount, false); + + settings.endGroup(); +} + + +bool AWTelemetryHandler::setConfiguration(const QString key, + const QVariant value, + const bool override) const +{ + qCDebug(LOG_AW) << "Set configuration key" << key << "to value" << value + << "force override enabled" << override; + + QSettings settings(m_genericConfig, QSettings::IniFormat); + settings.beginGroup(QString("Telemetry")); + if (!settings.childKeys().contains(key) || !override) + return true; + + settings.setValue(key, value); + settings.endGroup(); + settings.sync(); + + return (settings.status() == QSettings::NoError); +} diff --git a/sources/awesome-widget/plugin/awtelemetryhandler.h b/sources/awesome-widget/plugin/awtelemetryhandler.h new file mode 100644 index 0000000..a5f2c35 --- /dev/null +++ b/sources/awesome-widget/plugin/awtelemetryhandler.h @@ -0,0 +1,54 @@ +/*************************************************************************** + * This file is part of awesome-widgets * + * * + * awesome-widgets is free software: you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * awesome-widgets is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * + ***************************************************************************/ + + +#ifndef AWTELEMETRYHANDLER_H +#define AWTELEMETRYHANDLER_H + +#include +#include + + +class QAbstractButton; +class QNetworkReply; + +class AWTelemetryHandler : public QObject +{ + Q_OBJECT + +public: + explicit AWTelemetryHandler(QObject *parent = nullptr); + virtual ~AWTelemetryHandler(); + Q_INVOKABLE QStringList get(const QString group) const; + Q_INVOKABLE QString getLast(const QString group) const; + Q_INVOKABLE bool put(const QString group, const QString value) const; + Q_INVOKABLE bool rotate() const; + +private slots: + +private: + void init(); + bool setConfiguration(const QString key, const QVariant value, + const bool override) const; + QString m_clientId; + QString m_genericConfig; + QString m_localFile; + int m_storeCount = 0; +}; + + +#endif /* AWTELEMETRYHANDLER_H */