From 9547366891974242a66d81113aed1cdc08a4ad54 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 23 Jun 2017 17:06:46 +0200 Subject: [PATCH] feat(SettingsAdvanced): send logs in progress --- assets/languages/en.ts | 12 ++++++ assets/languages/fr.ts | 12 ++++++ src/app/App.cpp | 2 +- src/app/logger/Logger.cpp | 8 +++- src/app/logger/Logger.hpp | 4 +- src/components/core/CoreHandlers.cpp | 24 ++++++++++-- src/components/core/CoreHandlers.hpp | 19 ++++++++-- src/components/core/CoreManager.cpp | 27 +++++++++++++- src/components/core/CoreManager.hpp | 4 ++ src/components/settings/SettingsModel.cpp | 17 +++++++++ src/components/settings/SettingsModel.hpp | 6 +++ ui/views/App/Settings/SettingsAdvanced.qml | 43 ++++++++++++++++++++-- 12 files changed, 162 insertions(+), 16 deletions(-) diff --git a/assets/languages/en.ts b/assets/languages/en.ts index 6c8893621..0103776dc 100644 --- a/assets/languages/en.ts +++ b/assets/languages/en.ts @@ -985,6 +985,18 @@ your friend's SIP address or username. logsUploadUrlLabel Logs upload server url + + logsUploadFailed + Failed to upload logs. + + + logsEnabledLabel + Logs enabled + + + cleanLogs + CLEAN LOGS + SettingsAudio diff --git a/assets/languages/fr.ts b/assets/languages/fr.ts index 5fbd3e926..510a938c9 100644 --- a/assets/languages/fr.ts +++ b/assets/languages/fr.ts @@ -983,6 +983,18 @@ Cliquez ici : <a href="%1">%1</a> logsUploadUrlLabel Url du serveur de logs + + logsUploadFailed + L'envoi des logs a échoué.> + + + logsEnabledLabel + Logs activés. + + + cleanLogs + SUPPRIMER LOGS + SettingsAudio diff --git a/src/app/App.cpp b/src/app/App.cpp index b38bf02e2..7b9c07afe 100644 --- a/src/app/App.cpp +++ b/src/app/App.cpp @@ -86,7 +86,7 @@ App::App (int &argc, char *argv[]) : SingleApplication(argc, argv, true, Mode::U // Initialize logger. shared_ptr config = ::getConfigIfExists(*mParser); - Logger::init(SettingsModel::getLogsFolder(config)); + Logger::init(SettingsModel::getLogsFolder(config), SettingsModel::getLogsEnabled(config)); if (mParser->isSet("verbose")) Logger::getInstance()->setVerbose(true); diff --git a/src/app/logger/Logger.cpp b/src/app/logger/Logger.cpp index 3e840caef..979e44086 100644 --- a/src/app/logger/Logger.cpp +++ b/src/app/logger/Logger.cpp @@ -155,7 +155,11 @@ void Logger::log (QtMsgType type, const QMessageLogContext &context, const QStri // ----------------------------------------------------------------------------- -void Logger::init (const QString &folder) { +void Logger::enable (bool status) { + linphone_core_enable_log_collection(status ? LinphoneLogCollectionEnabled : LinphoneLogCollectionDisabled); +} + +void Logger::init (const QString &folder, bool enabled) { Q_ASSERT(!folder.isEmpty()); if (mInstance) @@ -173,5 +177,5 @@ void Logger::init (const QString &folder) { linphone_core_set_log_collection_path(::Utils::appStringToCoreString(folder).c_str()); linphone_core_set_log_collection_max_file_size(MAX_LOGS_COLLECTION_SIZE); - linphone_core_enable_log_collection(LinphoneLogCollectionEnabled); + mInstance->enable(enabled); } diff --git a/src/app/logger/Logger.hpp b/src/app/logger/Logger.hpp index 453d4a115..f676c9f93 100644 --- a/src/app/logger/Logger.hpp +++ b/src/app/logger/Logger.hpp @@ -39,7 +39,9 @@ public: mVerbose = verbose; } - static void init (const QString &folder); + void enable (bool status); + + static void init (const QString &folder, bool enabled); static Logger *getInstance () { return mInstance; diff --git a/src/components/core/CoreHandlers.cpp b/src/components/core/CoreHandlers.cpp index a73e344ca..dd2c3cdea 100644 --- a/src/components/core/CoreHandlers.cpp +++ b/src/components/core/CoreHandlers.cpp @@ -98,6 +98,14 @@ void CoreHandlers::onCallStateChanged ( App::getInstance()->getNotifier()->notifyReceivedCall(call); } +void CoreHandlers::onCallStatsUpdated ( + const shared_ptr &, + const shared_ptr &call, + const shared_ptr &stats +) { + call->getData("call-model").updateStats(stats); +} + void CoreHandlers::onGlobalStateChanged ( const shared_ptr &, linphone::GlobalState gstate, @@ -114,12 +122,20 @@ void CoreHandlers::onGlobalStateChanged ( } } -void CoreHandlers::onCallStatsUpdated ( +void CoreHandlers::onLogCollectionUploadStateChanged ( const shared_ptr &, - const shared_ptr &call, - const shared_ptr &stats + linphone::CoreLogCollectionUploadState state, + const string & ) { - call->getData("call-model").updateStats(stats); + emit logsUploadStateChanged(state); +} + +void CoreHandlers::onLogCollectionUploadProgressIndication ( + const shared_ptr &, + size_t, + size_t +) { + // TODO; } void CoreHandlers::onMessageReceived ( diff --git a/src/components/core/CoreHandlers.hpp b/src/components/core/CoreHandlers.hpp index 8e4d49462..59587cfc2 100644 --- a/src/components/core/CoreHandlers.hpp +++ b/src/components/core/CoreHandlers.hpp @@ -46,6 +46,7 @@ signals: void callTransferFailed (const std::shared_ptr &call); void callTransferSucceeded (const std::shared_ptr &call); void coreStarted (); + void logsUploadStateChanged (linphone::CoreLogCollectionUploadState state); void messageReceived (const std::shared_ptr &message); void presenceReceived (const QString &sipAddress, const std::shared_ptr &presenceModel); void registrationStateChanged (const std::shared_ptr &proxyConfig, linphone::RegistrationState state); @@ -71,16 +72,28 @@ private: const std::string &message ) override; + void onCallStatsUpdated ( + const std::shared_ptr &core, + const std::shared_ptr &call, + const std::shared_ptr &stats + ) override; + void onGlobalStateChanged ( const std::shared_ptr &core, linphone::GlobalState gstate, const std::string &message ) override; - void onCallStatsUpdated ( + void onLogCollectionUploadStateChanged ( const std::shared_ptr &core, - const std::shared_ptr &call, - const std::shared_ptr &stats + linphone::CoreLogCollectionUploadState state, + const std::string &info + ) override; + + void onLogCollectionUploadProgressIndication ( + const std::shared_ptr &lc, + size_t offset, + size_t total ) override; void onMessageReceived ( diff --git a/src/components/core/CoreManager.cpp b/src/components/core/CoreManager.cpp index 86ba96842..02f9348c2 100644 --- a/src/components/core/CoreManager.cpp +++ b/src/components/core/CoreManager.cpp @@ -40,7 +40,8 @@ using namespace std; CoreManager *CoreManager::mInstance = nullptr; -CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject(parent), mHandlers(make_shared(this)) { +CoreManager::CoreManager (QObject *parent, const QString &configPath) : + QObject(parent), mHandlers(make_shared(this)) { mPromiseBuild = QtConcurrent::run(this, &CoreManager::createLinphoneCore, configPath); QObject::connect(&mPromiseWatcher, &QFutureWatcher::finished, this, [] { @@ -50,7 +51,9 @@ CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject( emit mInstance->coreCreated(); }); - QObject::connect(mHandlers.get(), &CoreHandlers::coreStarted, this, [] { + CoreHandlers *coreHandlers = mHandlers.get(); + + QObject::connect(coreHandlers, &CoreHandlers::coreStarted, this, [] { mInstance->mCallsListModel = new CallsListModel(mInstance); mInstance->mContactsListModel = new ContactsListModel(mInstance); mInstance->mSipAddressesModel = new SipAddressesModel(mInstance); @@ -60,6 +63,11 @@ CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject( emit mInstance->coreStarted(); }); + QObject::connect( + coreHandlers, &CoreHandlers::logsUploadStateChanged, + this, &CoreManager::handleLogsUploadStateChanged + ); + mPromiseWatcher.setFuture(mPromiseBuild); } @@ -190,6 +198,21 @@ void CoreManager::iterate () { // ----------------------------------------------------------------------------- +void CoreManager::handleLogsUploadStateChanged (linphone::CoreLogCollectionUploadState state) { + switch (state) { + case linphone::CoreLogCollectionUploadStateInProgress: + break; + case linphone::CoreLogCollectionUploadStateDelivered: + emit logsUploaded(true); + break; + case linphone::CoreLogCollectionUploadStateNotDelivered: + emit logsUploaded(false); + break; + } +} + +// ----------------------------------------------------------------------------- + QString CoreManager::getDownloadUrl () { return QStringLiteral(DOWNLOAD_URL); } diff --git a/src/components/core/CoreManager.hpp b/src/components/core/CoreManager.hpp index e588fcda0..9116f807e 100644 --- a/src/components/core/CoreManager.hpp +++ b/src/components/core/CoreManager.hpp @@ -125,6 +125,8 @@ signals: void coreCreated (); void coreStarted (); + void logsUploaded (bool success); + private: CoreManager (QObject *parent, const QString &configPath); @@ -138,6 +140,8 @@ private: void iterate (); + void handleLogsUploadStateChanged (linphone::CoreLogCollectionUploadState state); + static QString getDownloadUrl (); std::shared_ptr mCore; diff --git a/src/components/settings/SettingsModel.cpp b/src/components/settings/SettingsModel.cpp index b29301511..0810aa92c 100644 --- a/src/components/settings/SettingsModel.cpp +++ b/src/components/settings/SettingsModel.cpp @@ -22,6 +22,7 @@ #include +#include "../../app/logger/Logger.hpp" #include "../../app/paths/Paths.hpp" #include "../../utils/Utils.hpp" #include "../core/CoreManager.hpp" @@ -746,8 +747,24 @@ void SettingsModel::setLogsUploadUrl (const QString &url) { // ----------------------------------------------------------------------------- +bool SettingsModel::getLogsEnabled () const { + return getLogsEnabled(mConfig); +} + +void SettingsModel::setLogsEnabled (bool status) { + mConfig->setInt(UI_SECTION, "logs_enabled", status); + Logger::getInstance()->enable(status); + emit logsEnabledChanged(status); +} + +// --------------------------------------------------------------------------- + QString SettingsModel::getLogsFolder (const shared_ptr &config) { return ::Utils::coreStringToAppString( config->getString(UI_SECTION, "logs_folder", Paths::getLogsDirPath()) ); } + +bool SettingsModel::getLogsEnabled (const std::shared_ptr &config) { + return config->getInt(UI_SECTION, "logs_enabled", false); +} diff --git a/src/components/settings/SettingsModel.hpp b/src/components/settings/SettingsModel.hpp index 806b73df0..de0102c1c 100644 --- a/src/components/settings/SettingsModel.hpp +++ b/src/components/settings/SettingsModel.hpp @@ -124,6 +124,7 @@ class SettingsModel : public QObject { Q_PROPERTY(QString logsFolder READ getLogsFolder WRITE setLogsFolder NOTIFY logsFolderChanged); Q_PROPERTY(QString logsUploadUrl READ getLogsUploadUrl WRITE setLogsUploadUrl NOTIFY logsUploadUrlChanged); + Q_PROPERTY(bool logsEnabled READ getLogsEnabled WRITE setLogsEnabled NOTIFY logsEnabledChanged); public: enum MediaEncryption { @@ -291,9 +292,13 @@ public: QString getLogsUploadUrl () const; void setLogsUploadUrl (const QString &url); + bool getLogsEnabled () const; + void setLogsEnabled (bool status); + // --------------------------------------------------------------------------- static QString getLogsFolder (const std::shared_ptr &config); + static bool getLogsEnabled (const std::shared_ptr &config); static const std::string UI_SECTION; @@ -376,6 +381,7 @@ signals: void logsFolderChanged (const QString &folder); void logsUploadUrlChanged (const QString &url); + void logsEnabledChanged (bool status); private: std::shared_ptr mConfig; diff --git a/ui/views/App/Settings/SettingsAdvanced.qml b/ui/views/App/Settings/SettingsAdvanced.qml index decf026d7..2831bbd9e 100644 --- a/ui/views/App/Settings/SettingsAdvanced.qml +++ b/ui/views/App/Settings/SettingsAdvanced.qml @@ -38,6 +38,7 @@ TabContainer { label: qsTr('logsUploadUrlLabel') TextField { + readOnly: true text: SettingsModel.logsUploadUrl onEditingFinished: SettingsModel.logsUploadUrl = text @@ -45,14 +46,50 @@ TabContainer { } } + FormLine { + FormGroup { + label: qsTr('logsEnabledLabel') + + Switch { + checked: SettingsModel.logsEnabled + + onClicked: SettingsModel.logsEnabled = !checked + } + } + } + FormEmptyLine {} } - TextButtonB { + Row { anchors.right: parent.right - text: qsTr('sendLogs') + spacing: 5 - onClicked: CoreManager.sendLogs() + TextButtonB { + text: qsTr('cleanLogs') + + onClicked: CoreManager.cleanLogs() + } + + TextButtonB { + enabled: !sendLogsBlock.loading + text: qsTr('sendLogs') + + onClicked: sendLogsBlock.execute() + } + } + + RequestBlock { + id: sendLogsBlock + + action: CoreManager.sendLogs + width: parent.width + + Connections { + target: CoreManager + + onLogsUploaded: sendLogsBlock.stop(success ? '' : qsTr('logsUploadFailed')) + } } // -------------------------------------------------------------------------