From eeaf139bd901e80f96215701c6f5428aaac4bcc2 Mon Sep 17 00:00:00 2001 From: sithlord48 Date: Wed, 17 Sep 2025 21:39:24 -0400 Subject: [PATCH] refactor: move no-restart to CoreArgs chore: Client remove unused ClientArgs member m_args --- src/lib/client/Client.cpp | 7 +- src/lib/client/Client.h | 4 +- src/lib/common/Settings.cpp | 6 +- src/lib/common/Settings.h | 2 + src/lib/deskflow/App.h | 8 +- src/lib/deskflow/ArgParser.cpp | 8 +- src/lib/deskflow/ArgsBase.h | 3 - src/lib/deskflow/ClientApp.cpp | 20 ++--- src/lib/deskflow/CoreArgParser.cpp | 7 ++ src/lib/deskflow/CoreArgs.h | 22 ++++- src/lib/deskflow/ServerApp.cpp | 16 +--- src/unittests/deskflow/ArgParserTests.cpp | 24 ------ src/unittests/deskflow/ArgParserTests.h | 2 - src/unittests/deskflow/CoreArgParserTests.cpp | 80 +++++++++++++++++++ src/unittests/deskflow/CoreArgParserTests.h | 8 ++ 15 files changed, 137 insertions(+), 80 deletions(-) diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index 534ddac9a..70ec64a7a 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -45,15 +45,14 @@ using namespace deskflow::client; Client::Client( IEventQueue *events, const std::string &name, const NetworkAddress &address, ISocketFactory *socketFactory, - deskflow::Screen *screen, deskflow::ClientArgs const &args + deskflow::Screen *screen ) : m_name(name), m_serverAddress(address), m_socketFactory(socketFactory), m_screen(screen), m_events(events), - m_useSecureNetwork(Settings::value(Settings::Security::TlsEnabled).toBool()), - m_args(args) + m_useSecureNetwork(Settings::value(Settings::Security::TlsEnabled).toBool()) { assert(m_socketFactory != nullptr); assert(m_screen != nullptr); @@ -422,7 +421,7 @@ void Client::setupConnection() handleDisconnected(); }); m_events->addHandler(EventTypes::SocketStopRetry, m_stream->getEventTarget(), [this](const auto &) { - m_args.m_restartable = false; + Settings::setValue(Settings::Core::RestartOnFailure, false); }); } diff --git a/src/lib/client/Client.h b/src/lib/client/Client.h index e66e7999b..cc31769c5 100644 --- a/src/lib/client/Client.h +++ b/src/lib/client/Client.h @@ -12,7 +12,6 @@ #include "HelloBack.h" #include "base/EventTypes.h" -#include "deskflow/ClientArgs.h" #include "deskflow/Clipboard.h" #include "mt/CondVar.h" #include "net/NetworkAddress.h" @@ -60,7 +59,7 @@ public: */ Client( IEventQueue *events, const std::string &name, const NetworkAddress &address, ISocketFactory *socketFactory, - deskflow::Screen *screen, deskflow::ClientArgs const &args + deskflow::Screen *screen ); Client(Client const &) = delete; Client(Client &&) = delete; @@ -202,7 +201,6 @@ private: bool m_useSecureNetwork = false; bool m_enableClipboard = true; size_t m_maximumClipboardSize = INT_MAX; - deskflow::ClientArgs m_args; size_t m_resolvedAddressesCount = 0; std::unique_ptr m_pHelloBack; }; diff --git a/src/lib/common/Settings.cpp b/src/lib/common/Settings.cpp index e23dd742a..97a065894 100644 --- a/src/lib/common/Settings.cpp +++ b/src/lib/common/Settings.cpp @@ -117,9 +117,9 @@ QVariant Settings::defaultValue(const QString &key) return false; } - if ((key == Gui::CloseToTray) || (key == Gui::LogExpanded) || (key == Gui::SymbolicTrayIcon) || - (key == Gui::CloseReminder) || (key == Security::TlsEnabled) || (key == Security::CheckPeers) || - (key == Client::LanguageSync) || (key == Gui::ShowGenericClientFailureDialog)) { + if ((key == Core::RestartOnFailure) || (key == Gui::CloseToTray) || (key == Gui::LogExpanded) || + (key == Gui::SymbolicTrayIcon) || (key == Gui::CloseReminder) || (key == Security::TlsEnabled) || + (key == Security::CheckPeers) || (key == Client::LanguageSync) || (key == Gui::ShowGenericClientFailureDialog)) { return true; } diff --git a/src/lib/common/Settings.h b/src/lib/common/Settings.h index 943ac018c..e1e5bdc2a 100644 --- a/src/lib/common/Settings.h +++ b/src/lib/common/Settings.h @@ -50,6 +50,7 @@ public: inline static const auto StartedBefore = QStringLiteral("core/startedBefore"); inline static const auto UpdateUrl = QStringLiteral("core/updateUrl"); inline static const auto Display = QStringLiteral("core/display"); + inline static const auto RestartOnFailure = QStringLiteral("core/restartOnFailure"); }; struct Daemon { @@ -173,6 +174,7 @@ private: , Settings::Core::StartedBefore , Settings::Core::UpdateUrl , Settings::Core::Display + , Settings::Core::RestartOnFailure , Settings::Daemon::Command , Settings::Daemon::Elevate , Settings::Daemon::LogFile diff --git a/src/lib/deskflow/App.h b/src/lib/deskflow/App.h index 51dcfa9f9..faf9c5013 100644 --- a/src/lib/deskflow/App.h +++ b/src/lib/deskflow/App.h @@ -128,14 +128,8 @@ private: #else #define DAEMON_RUNNING(running_) #endif -constexpr static auto s_helpGeneralArgs = // - " -1, --no-restart do not try to restart on failure.\n" - "* --restart restart the server automatically if it fails.\n"; -constexpr static auto s_helpVersionArgs = // - " -h, --help display this help and exit.\n"; - -constexpr static auto s_helpCommonArgs = " [--restart|--no-restart]"; +constexpr static auto s_helpVersionArgs = " -h, --help display this help and exit.\n"; #if !defined(WINAPI_LIBEI) && WINAPI_XWINDOWS constexpr static auto s_helpNoWayland = // diff --git a/src/lib/deskflow/ArgParser.cpp b/src/lib/deskflow/ArgParser.cpp index ca8a88c0a..55c79100e 100644 --- a/src/lib/deskflow/ArgParser.cpp +++ b/src/lib/deskflow/ArgParser.cpp @@ -101,13 +101,7 @@ bool ArgParser::parseClientArgs(deskflow::ClientArgs &args, int argc, const char bool ArgParser::parseGenericArgs(int argc, const char *const *argv, int &i) const { - if (isArg(i, argc, argv, "-1", "--no-restart")) { - // don't try to restart - argsBase().m_restartable = false; - } else if (isArg(i, argc, argv, nullptr, "--restart")) { - // try to restart - argsBase().m_restartable = true; - } else if (isArg(i, argc, argv, nullptr, "--no-hooks")) { + if (isArg(i, argc, argv, nullptr, "--no-hooks")) { argsBase().m_noHooks = true; } else if (isArg(i, argc, argv, "-h", "--help")) { if (m_app) { diff --git a/src/lib/deskflow/ArgsBase.h b/src/lib/deskflow/ArgsBase.h index 091d68a28..977f0a654 100644 --- a/src/lib/deskflow/ArgsBase.h +++ b/src/lib/deskflow/ArgsBase.h @@ -32,9 +32,6 @@ public: /// @brief Stores what type of object this is ClassType m_classType = ClassType::Base; - /// @brief Should the app restart automatically - bool m_restartable = true; - /// @brief Should the app use hooks bool m_noHooks = false; diff --git a/src/lib/deskflow/ClientApp.cpp b/src/lib/deskflow/ClientApp.cpp index fb7ceb9d7..bcbfcd6ee 100644 --- a/src/lib/deskflow/ClientApp.cpp +++ b/src/lib/deskflow/ClientApp.cpp @@ -89,7 +89,8 @@ void ClientApp::parseArgs(int argc, const char *const *argv) // we'll try to resolve the address each time we connect to the // server. a bad port will never get better. patch by Brent // Priddy. - if (!args().m_restartable || e.getError() == SocketAddressException::SocketError::BadPort) { + if (!Settings::value(Settings::Core::RestartOnFailure).toBool() || + e.getError() == SocketAddressException::SocketError::BadPort) { LOG_CRIT("%s: %s" BYE, args().m_pname, e.what(), args().m_pname); bye(s_exitFailed); } @@ -106,20 +107,15 @@ void ClientApp::help() << " [--yscroll ]" << " [--sync-language]" << " [--invert-scroll]" -#ifdef WINAPI_XWINDOWS - << " [--display ]" -#endif - << s_helpCommonArgs << " " + << " " << "\n\n" << "Connect to a " << kAppName << " mouse/keyboard sharing server.\n" - << "\n" - << s_helpGeneralArgs << " --yscroll defines the vertical scrolling delta,\n" + << " --yscroll defines the vertical scrolling delta,\n" << " which is 120 by default.\n" << " --sync-language enable language synchronization.\n" << " --invert-scroll invert scroll direction on this\n" << " computer.\n" << s_helpVersionArgs << "\n" - << "* marks defaults.\n" << s_helpNoWayland @@ -252,7 +248,7 @@ void ClientApp::handleClientRefused(const Event &e) { std::unique_ptr info(static_cast(e.getData())); - if (!args().m_restartable || !info->m_retry) { + if (!Settings::value(Settings::Core::RestartOnFailure).toBool() || !info->m_retry) { LOG_ERR("failed to connect to server: %s", info->m_what.c_str()); getEvents()->addEvent(Event(EventTypes::Quit)); } else { @@ -266,7 +262,7 @@ void ClientApp::handleClientRefused(const Event &e) void ClientApp::handleClientDisconnected() { LOG_IPC("disconnected from server"); - if (!args().m_restartable) { + if (!Settings::value(Settings::Core::RestartOnFailure).toBool()) { getEvents()->addEvent(Event(EventTypes::Quit)); } else if (!m_suspended) { scheduleClientRestart(s_retryTime); @@ -275,7 +271,7 @@ void ClientApp::handleClientDisconnected() Client *ClientApp::openClient(const std::string &name, const NetworkAddress &address, deskflow::Screen *screen) { - auto *client = new Client(getEvents(), name, address, getSocketFactory(), screen, args()); + auto *client = new Client(getEvents(), name, address, getSocketFactory(), screen); try { getEvents()->addHandler(EventTypes::ClientConnected, client->getEventTarget(), [this](const auto &) { @@ -343,7 +339,7 @@ bool ClientApp::startClient() return false; } - if (args().m_restartable) { + if (Settings::value(Settings::Core::RestartOnFailure).toBool()) { scheduleClientRestart(retryTime); return true; } else { diff --git a/src/lib/deskflow/CoreArgParser.cpp b/src/lib/deskflow/CoreArgParser.cpp index 3c1546b26..01e802da5 100644 --- a/src/lib/deskflow/CoreArgParser.cpp +++ b/src/lib/deskflow/CoreArgParser.cpp @@ -95,6 +95,13 @@ void CoreArgParser::parse() auto value = m_parser.value(CoreArgs::displayOption); Settings::setValue(Settings::Core::Display, value); } + + if (m_parser.isSet(CoreArgs::restartOption)) { + bool value = + ((m_parser.value(CoreArgs::restartOption).toLower() == "true") || + (m_parser.value(CoreArgs::restartOption) == "1")); + Settings::setValue(Settings::Core::RestartOnFailure, value); + } } [[noreturn]] void CoreArgParser::showHelpText() const diff --git a/src/lib/deskflow/CoreArgs.h b/src/lib/deskflow/CoreArgs.h index 542f2f86d..ca3a2a740 100644 --- a/src/lib/deskflow/CoreArgs.h +++ b/src/lib/deskflow/CoreArgs.h @@ -51,7 +51,23 @@ struct CoreArgs "prevent-sleep", "When true the machine will be prevented from sleeping while the program is running", "value" ); - inline static const auto options = {helpOption, versionOption, configOption, interfaceOption, - portOption, nameOption, logLevelOption, logFileOption, - secureOption, tlsCertOption, preventSleepOption, displayOption}; + inline static const auto restartOption = QCommandLineOption( + {"r", "restartOnFailure"}, "Set if the core should automatically restart if it fails", "value" + ); + + inline static const auto options = { + helpOption, + versionOption, + configOption, + interfaceOption, + portOption, + nameOption, + logLevelOption, + logFileOption, + secureOption, + tlsCertOption, + preventSleepOption, + restartOption, + displayOption + }; }; diff --git a/src/lib/deskflow/ServerApp.cpp b/src/lib/deskflow/ServerApp.cpp index 35d784eec..4b7d01440 100644 --- a/src/lib/deskflow/ServerApp.cpp +++ b/src/lib/deskflow/ServerApp.cpp @@ -104,16 +104,8 @@ void ServerApp::help() { std::stringstream help; help << "\n\nServer Mode:\n\n" - << "Usage: " << kAppId << "-core server" - << " --config " - -#if WINAPI_XWINDOWS - << " [--display ]" -#endif - - << s_helpCommonArgs << "\n" + << "Usage: " << kAppId << "-core server \n" << " -c, --config path of the configuration file\n" - << s_helpGeneralArgs << " --disable-client-cert-check disable client SSL certificate \n" " checking (deprecated)\n" << s_helpVersionArgs << "\n" @@ -368,7 +360,7 @@ bool ServerApp::initServer() return false; } - if (args().m_restartable) { + if (Settings::value(Settings::Core::RestartOnFailure).toBool()) { // install a timer and handler to retry later assert(m_timer == nullptr); LOG_DEBUG("retry in %.0f seconds", retryTime); @@ -428,7 +420,7 @@ bool ServerApp::startServer() m_serverState = Started; return true; } catch (SocketAddressInUseException &e) { - if (args().m_restartable) { + if (Settings::value(Settings::Core::RestartOnFailure).toBool()) { LOG_ERR("cannot listen for clients: %s", e.what()); } else { LOG_CRIT("cannot listen for clients: %s", e.what()); @@ -440,7 +432,7 @@ bool ServerApp::startServer() return false; } - if (args().m_restartable) { + if (Settings::value(Settings::Core::RestartOnFailure).toBool()) { // install a timer and handler to retry later assert(m_timer == nullptr); const auto retryTime = 10.0; diff --git a/src/unittests/deskflow/ArgParserTests.cpp b/src/unittests/deskflow/ArgParserTests.cpp index b25743d55..49ddef862 100644 --- a/src/unittests/deskflow/ArgParserTests.cpp +++ b/src/unittests/deskflow/ArgParserTests.cpp @@ -276,30 +276,6 @@ void ArgParserTests::deprecatedArg_crypoPass_false() QCOMPARE(i, 1); } -void ArgParserTests::generic_noRestart() -{ - int i = 1; - const int argc = 2; - const char *kNoRestartCmd[argc] = {"stub", "--no-restart"}; - - m_parser.parseGenericArgs(argc, kNoRestartCmd, i); - - QVERIFY(!m_parser.argsBase().m_restartable); - QCOMPARE(i, 1); -} - -void ArgParserTests::generic_restart() -{ - int i = 1; - const int argc = 2; - const char *kRestartCmd[argc] = {"stub", "--restart"}; - - m_parser.parseGenericArgs(argc, kRestartCmd, i); - - QVERIFY(m_parser.argsBase().m_restartable); - QCOMPARE(i, 1); -} - void ArgParserTests::generic_unknown() { int i = 1; diff --git a/src/unittests/deskflow/ArgParserTests.h b/src/unittests/deskflow/ArgParserTests.h index 93212d1e7..87e755fa4 100644 --- a/src/unittests/deskflow/ArgParserTests.h +++ b/src/unittests/deskflow/ArgParserTests.h @@ -32,8 +32,6 @@ private Q_SLOTS: void client_badArgs(); void deprecatedArg_crypoPass_true(); void deprecatedArg_crypoPass_false(); - void generic_noRestart(); - void generic_restart(); void generic_unknown(); void generic_noHook(); diff --git a/src/unittests/deskflow/CoreArgParserTests.cpp b/src/unittests/deskflow/CoreArgParserTests.cpp index 0fb5d1b79..266a6ec48 100644 --- a/src/unittests/deskflow/CoreArgParserTests.cpp +++ b/src/unittests/deskflow/CoreArgParserTests.cpp @@ -190,6 +190,86 @@ void CoreArgParserTests::preventSleep_0() QVERIFY(!Settings::value(Settings::Core::PreventSleep).toBool()); } +void CoreArgParserTests::restartLongOption_0() +{ + QStringList args = {"stub", "client", "--restartOnFailure", "0"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(!Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + +void CoreArgParserTests::restartLongOption_1() +{ + QStringList args = {"stub", "client", "--restartOnFailure", "1"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + +void CoreArgParserTests::restartLongOption_false() +{ + QStringList args = {"stub", "client", "--restartOnFailure", "false"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(!Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + +void CoreArgParserTests::restartLongOption_true() +{ + QStringList args = {"stub", "client", "--restartOnFailure", "true"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + +void CoreArgParserTests::restartShortOption_0() +{ + QStringList args = {"stub", "client", "-r", "0"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(!Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + +void CoreArgParserTests::restartShortOption_1() +{ + QStringList args = {"stub", "client", "-r", "1"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + +void CoreArgParserTests::restartShortOption_false() +{ + QStringList args = {"stub", "client", "-r", "false"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(!Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + +void CoreArgParserTests::restartShortOption_true() +{ + QStringList args = {"stub", "client", "-r", "true"}; + + CoreArgParser parser(args); + parser.parse(); + + QVERIFY(Settings::value(Settings::Core::RestartOnFailure).toBool()); +} + void CoreArgParserTests::preventSleep_true() { QStringList args = {"stub", "client", "--prevent-sleep", "true"}; diff --git a/src/unittests/deskflow/CoreArgParserTests.h b/src/unittests/deskflow/CoreArgParserTests.h index a7064b1d0..d4531f752 100644 --- a/src/unittests/deskflow/CoreArgParserTests.h +++ b/src/unittests/deskflow/CoreArgParserTests.h @@ -32,6 +32,14 @@ private Q_SLOTS: void preventSleep_false(); void preventSleep_1(); void preventSleep_0(); + void restartLongOption_0(); + void restartLongOption_1(); + void restartLongOption_false(); + void restartLongOption_true(); + void restartShortOption_0(); + void restartShortOption_1(); + void restartShortOption_false(); + void restartShortOption_true(); private: inline static const QString m_settingsPath = QStringLiteral("tmp/test");