diff --git a/src/lib/common/Settings.cpp b/src/lib/common/Settings.cpp index 546a3cc63..db93400a4 100644 --- a/src/lib/common/Settings.cpp +++ b/src/lib/common/Settings.cpp @@ -112,6 +112,9 @@ QVariant Settings::defaultValue(const QString &key) if (key == Core::Port) return 24800; + if (key == Core::ProcessMode) + return defaultProcessMode; + return QVariant(); } diff --git a/src/lib/common/Settings.h b/src/lib/common/Settings.h index df65f0ad3..e860d6b67 100644 --- a/src/lib/common/Settings.h +++ b/src/lib/common/Settings.h @@ -42,6 +42,7 @@ public: inline static const auto LastVersion = QStringLiteral("core/lastVersion"); inline static const auto Port = QStringLiteral("core/port"); inline static const auto PreventSleep = QStringLiteral("core/preventSleep"); + inline static const auto ProcessMode = QStringLiteral("core/processMode"); inline static const auto Scope = QStringLiteral("core/loadFromSystemScope"); inline static const auto ScreenName = QStringLiteral("core/screenName"); inline static const auto StartedBefore = QStringLiteral("core/startedBefore"); @@ -76,6 +77,20 @@ public: inline static const auto ExternalConfigFile = QStringLiteral("server/externalConfigFile"); }; + // Enums types used in settings + // The use of enum classes is not use for these + // enum classes are more specific when used with QVariant + // This leads longer function calls in code + // and longer more cryptic output in the settings file + // The using of standard enum will just write ints + // and we can read / write them as if they were ints + enum ProcessMode + { + Service, + Desktop + }; + Q_ENUM(ProcessMode) + static Settings *instance(); static void setSettingFile(const QString &settingsFile = QString()); static void setValue(const QString &key = QString(), const QVariant &value = QVariant()); @@ -105,6 +120,7 @@ private: QSettings *m_settings = nullptr; QString m_portableSettingsFile = QStringLiteral("%1.conf").arg(kAppName); + // clang-format off inline static const QStringList m_logLevels = { QStringLiteral("INFO") @@ -122,6 +138,7 @@ private: , Core::LastVersion , Core::Port , Core::PreventSleep + , Core::ProcessMode , Core::Scope , Core::ScreenName , Core::StartedBefore @@ -144,4 +161,10 @@ private: , Server::ExternalConfigFile }; // clang-format on + +#ifdef Q_OS_WIN + inline static const auto defaultProcessMode = Settings::ProcessMode::Service; +#else + inline static const auto defaultProcessMode = Settings::ProcessMode::Desktop; +#endif }; diff --git a/src/lib/gui/config/AppConfig.cpp b/src/lib/gui/config/AppConfig.cpp index e4e664313..c4c144efc 100644 --- a/src/lib/gui/config/AppConfig.cpp +++ b/src/lib/gui/config/AppConfig.cpp @@ -306,11 +306,6 @@ IConfigScopes &AppConfig::scopes() const return m_Scopes; } -ProcessMode AppConfig::processMode() const -{ - return m_EnableService ? ProcessMode::kService : ProcessMode::kDesktop; -} - ElevateMode AppConfig::elevateMode() const { return m_ElevateMode; diff --git a/src/lib/gui/config/AppConfig.h b/src/lib/gui/config/AppConfig.h index cf14e1762..7578d9e00 100644 --- a/src/lib/gui/config/AppConfig.h +++ b/src/lib/gui/config/AppConfig.h @@ -26,12 +26,6 @@ namespace deskflow::gui { const ElevateMode kDefaultElevateMode = ElevateMode::kAutomatic; -#if defined(Q_OS_WIN) -const ProcessMode kDefaultProcessMode = ProcessMode::kService; -#else -const ProcessMode kDefaultProcessMode = ProcessMode::kDesktop; -#endif // Q_OS_WIN - } // namespace deskflow::gui /** @@ -44,7 +38,6 @@ const ProcessMode kDefaultProcessMode = ProcessMode::kDesktop; */ class AppConfig : public QObject, public deskflow::gui::IAppConfig { - using ProcessMode = deskflow::gui::ProcessMode; using IConfigScopes = deskflow::gui::IConfigScopes; Q_OBJECT @@ -122,7 +115,6 @@ public: // IConfigScopes &scopes() const override; - ProcessMode processMode() const override; ElevateMode elevateMode() const override; bool isActiveScopeWritable() const override; bool isActiveScopeSystem() const override; @@ -212,7 +204,7 @@ private: bool m_ServerGroupChecked = false; bool m_UseInternalConfig = false; bool m_ClientGroupChecked = false; - bool m_EnableService = deskflow::gui::kDefaultProcessMode == ProcessMode::kService; + bool m_EnableService = false; bool m_LoadFromSystemScope = false; deskflow::gui::IConfigScopes &m_Scopes; diff --git a/src/lib/gui/config/IAppConfig.h b/src/lib/gui/config/IAppConfig.h index 62794b713..38be78fbc 100644 --- a/src/lib/gui/config/IAppConfig.h +++ b/src/lib/gui/config/IAppConfig.h @@ -14,12 +14,6 @@ namespace deskflow::gui { -enum class ProcessMode -{ - kService, - kDesktop -}; - class IAppConfig { using IConfigScopes = deskflow::gui::IConfigScopes; @@ -32,7 +26,6 @@ public: // virtual IConfigScopes &scopes() const = 0; - virtual ProcessMode processMode() const = 0; virtual ElevateMode elevateMode() const = 0; virtual bool enableService() const = 0; virtual bool isActiveScopeSystem() const = 0; diff --git a/src/lib/gui/core/CoreProcess.cpp b/src/lib/gui/core/CoreProcess.cpp index c69809d44..d1ae6cf88 100644 --- a/src/lib/gui/core/CoreProcess.cpp +++ b/src/lib/gui/core/CoreProcess.cpp @@ -36,14 +36,12 @@ const auto kLineSplitRegex = QRegularExpression("\r|\n|\r\n"); // free functions // -QString processModeToString(ProcessMode mode) +QString processModeToString(Settings::ProcessMode mode) { - using enum ProcessMode; - switch (mode) { - case kDesktop: + case Settings::ProcessMode::Desktop: return "desktop"; - case kService: + case Settings::ProcessMode::Service: return "service"; default: qFatal("invalid process mode"); @@ -239,7 +237,8 @@ void CoreProcess::onProcessFinished(int exitCode, QProcess::ExitStatus) void CoreProcess::applyLogLevel() { - if (m_appConfig.processMode() == ProcessMode::kService) { + const auto processMode = Settings::value(Settings::Core::ProcessMode).value(); + if (processMode == ProcessMode::Service) { qDebug() << "setting daemon log level:" << Settings::logLevelText(); if (!m_daemonIpcClient->sendLogLevel(Settings::logLevelText())) { qCritical() << "failed to set daemon ipc log level"; @@ -349,9 +348,11 @@ void CoreProcess::start(std::optional processModeOption) { QMutexLocker locker(&m_processMutex); - const auto processMode = processModeOption.value_or(m_appConfig.processMode()); + const auto currentMode = Settings::value(Settings::Core::ProcessMode).value(); + const auto processMode = processModeOption.value_or(currentMode); - qInfo("starting core %s process (%s mode)", qPrintable(modeString()), qPrintable(processModeToString(processMode))); + qInfo().noquote( + ) << QString("starting core %1 process (%2 mode)").arg(modeString(), processModeToString(processMode)); if (m_processState == ProcessState::Started) { qCritical("core process already started"); @@ -372,7 +373,7 @@ void CoreProcess::start(std::optional processModeOption) setConnectionState(ConnectionState::Connecting); - if (processMode == ProcessMode::kDesktop) { + if (processMode == ProcessMode::Desktop) { m_pDeps->process().create(); } @@ -393,9 +394,9 @@ void CoreProcess::start(std::optional processModeOption) if (Settings::value(Settings::Log::ToFile).toBool()) qInfo().noquote() << "log file:" << Settings::value(Settings::Log::File).toString(); - if (processMode == ProcessMode::kDesktop) { + if (processMode == ProcessMode::Desktop) { startForegroundProcess(app, args); - } else if (processMode == ProcessMode::kService) { + } else if (processMode == ProcessMode::Service) { startProcessFromDaemon(app, args); } @@ -406,7 +407,8 @@ void CoreProcess::stop(std::optional processModeOption) { QMutexLocker locker(&m_processMutex); - const auto processMode = processModeOption.value_or(m_appConfig.processMode()); + const auto currentMode = Settings::value(Settings::Core::ProcessMode).value(); + const auto processMode = processModeOption.value_or(currentMode); qInfo("stopping core process (%s mode)", qPrintable(processModeToString(processMode))); @@ -416,9 +418,9 @@ void CoreProcess::stop(std::optional processModeOption) } else if (m_processState != ProcessState::Stopped) { setProcessState(ProcessState::Stopping); - if (processMode == ProcessMode::kService) { + if (processMode == ProcessMode::Service) { stopProcessFromDaemon(); - } else if (processMode == ProcessMode::kDesktop) { + } else if (processMode == ProcessMode::Desktop) { stopForegroundProcess(); } @@ -431,19 +433,17 @@ void CoreProcess::stop(std::optional processModeOption) void CoreProcess::restart() { - using enum ProcessMode; - qDebug("restarting core process"); - const auto processMode = m_appConfig.processMode(); + const auto processMode = Settings::value(Settings::Core::ProcessMode).value(); if (m_lastProcessMode != processMode) { - if (processMode == kDesktop) { + if (processMode == ProcessMode::Desktop) { qDebug("process mode changed to desktop, stopping service process"); - stop(kService); - } else if (processMode == kService) { + stop(ProcessMode::Service); + } else if (processMode == ProcessMode::Service) { qDebug("process mode changed to service, stopping desktop process"); - stop(kDesktop); + stop(ProcessMode::Desktop); } else { qFatal("invalid process mode"); } @@ -461,7 +461,7 @@ void CoreProcess::cleanup() { qInfo("cleaning up core process"); - const auto isDesktop = m_appConfig.processMode() == ProcessMode::kDesktop; + const auto isDesktop = Settings::value(Settings::Core::ProcessMode).value() == ProcessMode::Desktop; const auto isRunning = m_processState == ProcessState::Started; if (isDesktop && isRunning) { stop(); @@ -475,7 +475,7 @@ bool CoreProcess::addGenericArgs(QStringList &args, const ProcessMode processMod args << "--name" << Settings::value(Settings::Core::ScreenName).toString(); - if (processMode != ProcessMode::kDesktop) { + if (processMode != ProcessMode::Desktop) { #if defined(Q_OS_WIN) // tell the client/server to shut down when a ms windows desk // is switched; this is because we may need to elevate or not @@ -753,12 +753,13 @@ void CoreProcess::persistLogDir() void CoreProcess::clearSettings() { - if (m_appConfig.processMode() == ProcessMode::kDesktop) { + const auto processMode = Settings::value(Settings::Core::ProcessMode).value(); + if (processMode == ProcessMode::Desktop) { qDebug("no core settings to clear in desktop mode"); return; } - if (m_appConfig.processMode() != ProcessMode::kService) { + if (processMode != ProcessMode::Service) { qFatal("invalid process mode"); } diff --git a/src/lib/gui/core/CoreProcess.h b/src/lib/gui/core/CoreProcess.h index 827e80cd1..9668676cb 100644 --- a/src/lib/gui/core/CoreProcess.h +++ b/src/lib/gui/core/CoreProcess.h @@ -6,6 +6,7 @@ #pragma once +#include "common/Settings.h" #include "gui/FileTail.h" #include "gui/config/IAppConfig.h" #include "gui/config/IServerConfig.h" @@ -28,6 +29,7 @@ class DaemonIpcClient; class CoreProcess : public QObject { + using ProcessMode = Settings::ProcessMode; using IServerConfig = deskflow::gui::IServerConfig; using QProcessProxy = deskflow::gui::proxy::QProcessProxy; diff --git a/src/test/shared/gui/mocks/AppConfigMock.h b/src/test/shared/gui/mocks/AppConfigMock.h index a8c6fea98..b1c9ba886 100644 --- a/src/test/shared/gui/mocks/AppConfigMock.h +++ b/src/test/shared/gui/mocks/AppConfigMock.h @@ -14,7 +14,6 @@ class AppConfigMock : public deskflow::gui::IAppConfig { - using ProcessMode = deskflow::gui::ProcessMode; public: AppConfigMock() @@ -26,7 +25,6 @@ public: // MOCK_METHOD(deskflow::gui::IConfigScopes &, scopes, (), (const, override)); - MOCK_METHOD(ProcessMode, processMode, (), (const, override)); MOCK_METHOD(ElevateMode, elevateMode, (), (const, override)); MOCK_METHOD(bool, enableService, (), (const, override)); MOCK_METHOD(bool, isActiveScopeSystem, (), (const, override)); diff --git a/src/test/unittests/gui/core/CoreProcessTests.cpp b/src/test/unittests/gui/core/CoreProcessTests.cpp index b05fb9507..05cb8aed1 100644 --- a/src/test/unittests/gui/core/CoreProcessTests.cpp +++ b/src/test/unittests/gui/core/CoreProcessTests.cpp @@ -71,7 +71,7 @@ public: { Settings::setValue(Settings::Server::ExternalConfig, true); Settings::setValue(Settings::Server::ExternalConfigFile, m_configFile); - ON_CALL(m_appConfig, processMode()).WillByDefault(Return(ProcessMode::kDesktop)); + Settings::setValue(Settings::Core::ProcessMode, Settings::ProcessMode::Desktop); } NiceMock m_appConfig; @@ -91,7 +91,7 @@ TEST_F(CoreProcessTests, start_serverDesktop_callsProcessStart) EXPECT_CALL(m_pDeps->m_process, start(_, _)).Times(1); - m_coreProcess.start(ProcessMode::kDesktop); + m_coreProcess.start(Settings::ProcessMode::Desktop); } TEST_F(CoreProcessTests, start_clientDesktop_callsProcessStart) @@ -101,7 +101,7 @@ TEST_F(CoreProcessTests, start_clientDesktop_callsProcessStart) EXPECT_CALL(m_pDeps->m_process, start(_, _)).Times(1); - m_coreProcess.start(ProcessMode::kDesktop); + m_coreProcess.start(Settings::ProcessMode::Desktop); } TEST_F(CoreProcessTests, stop_serverDesktop_callsProcessClose) @@ -111,7 +111,7 @@ TEST_F(CoreProcessTests, stop_serverDesktop_callsProcessClose) EXPECT_CALL(m_pDeps->m_process, close()).Times(1); - m_coreProcess.stop(ProcessMode::kDesktop); + m_coreProcess.stop(Settings::ProcessMode::Desktop); } TEST_F(CoreProcessTests, stop_clientDesktop_callsProcessClose) @@ -122,12 +122,12 @@ TEST_F(CoreProcessTests, stop_clientDesktop_callsProcessClose) EXPECT_CALL(m_pDeps->m_process, close()).Times(1); - m_coreProcess.stop(ProcessMode::kDesktop); + m_coreProcess.stop(Settings::ProcessMode::Desktop); } TEST_F(CoreProcessTests, restart_serverDesktop_callsProcessStart) { - ON_CALL(m_appConfig, processMode()).WillByDefault(Return(ProcessMode::kDesktop)); + Settings::setValue(Settings::Core::ProcessMode, Settings::ProcessMode::Desktop); m_coreProcess.setMode(CoreProcess::Mode::Server); m_coreProcess.start();