diff --git a/src/lib/deskflow/ArgParser.cpp b/src/lib/deskflow/ArgParser.cpp deleted file mode 100644 index 42bd4ea8c..000000000 --- a/src/lib/deskflow/ArgParser.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2014 - 2016 Symless Ltd. - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#include "deskflow/ArgParser.h" - -#include "base/Log.h" -#include "deskflow/App.h" - -#ifdef WINAPI_MSWINDOWS -#include -#endif - -#include -#include - -ArgParser::ArgParser(App *app) : m_app(app) -{ -} - -bool ArgParser::parseGenericArgs(int argc, const char *const *argv, int &i) const -{ - if (isArg(i, argc, argv, "-h", "--help")) { - if (m_app) { - m_app->help(); - } - } else { - // option not supported here - return false; - } - - return true; -} - -bool ArgParser::parseDeprecatedArgs(int argc, const char *const *argv, int &i) const -{ - static const std::vector deprecatedArgs = {"--crypto-pass", "--res-w", "--res-h", - "--prm-wc", "--prm-hc", "--log"}; - - for (auto &arg : deprecatedArgs) { - if (isArg(i, argc, argv, nullptr, arg)) { - LOG_NOTE("%s is deprecated", arg); - i++; - return true; - } - } - - return false; -} - -bool ArgParser::isArg( - int argi, int argc, const char *const *argv, const char *name1, const char *name2, int minRequiredParameters -) -{ - if ((name1 != nullptr && strcmp(argv[argi], name1) == 0) || (name2 != nullptr && strcmp(argv[argi], name2) == 0)) { - // match. check args left. - if (argi + minRequiredParameters >= argc) { - LOG_PRINT("%s: missing arguments for `%s'" BYE, "deskflow-core", argv[argi], "deskflow-core"); - return false; - } - return true; - } - - // no match - return false; -} - -void ArgParser::splitCommandString(const std::string_view &command, std::vector &argv) -{ - if (command.empty()) { - return; - } - - size_t leftDoubleQuote = 0; - size_t rightDoubleQuote = 0; - searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote); - - size_t startPos = 0; - size_t space = command.find(" ", startPos); - - while (space != std::string::npos) { - bool ignoreThisSpace = false; - - // check if the space is between two double quotes - if (space > leftDoubleQuote && space < rightDoubleQuote) { - ignoreThisSpace = true; - } else if (space > rightDoubleQuote) { - searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote, rightDoubleQuote + 1); - } - - if (!ignoreThisSpace) { - auto subString = command.substr(startPos, space - startPos); - - removeDoubleQuotes(subString); - argv.emplace_back(subString); - } - - // find next space - if (ignoreThisSpace) { - space = command.find(" ", rightDoubleQuote + 1); - } else { - startPos = space + 1; - space = command.find(" ", startPos); - } - } - - auto subString = command.substr(startPos, command.size()); - removeDoubleQuotes(subString); - argv.emplace_back(subString); -} - -bool ArgParser::searchDoubleQuotes(const std::string_view &command, size_t &left, size_t &right, size_t startPos) -{ - bool result = false; - left = std::string::npos; - right = std::string::npos; - - left = command.find("\"", startPos); - if (left != std::string::npos) { - right = command.find("\"", left + 1); - if (right != std::string::npos) { - result = true; - } - } - - if (!result) { - left = 0; - right = 0; - } - - return result; -} - -void ArgParser::removeDoubleQuotes(std::string_view &arg) -{ - // if string is surrounded by double quotes, remove them - if (arg[0] == '\"' && arg[arg.size() - 1] == '\"') { - arg = arg.substr(1, arg.size() - 2); - } -} - -const char **ArgParser::getArgv(std::vector &argsArray) -{ - size_t argc = argsArray.size(); - - // caller is responsible for deleting the outer array only - // we use the c string pointers from argsArray and assign - // them to the inner array. So caller only need to use - // delete[] to delete the outer array - const auto **argv = new const char *[argc]; - - for (size_t i = 0; i < argc; i++) { - argv[i] = argsArray[i].c_str(); - } - - return argv; -} - -std::string ArgParser::assembleCommand( - std::vector &argsArray, const std::string_view &ignoreArg, int parametersRequired -) -{ - std::string result; - - for (auto it = argsArray.begin(); it != argsArray.end(); ++it) { - if (it->compare(ignoreArg) == 0) { - it = it + parametersRequired; - continue; - } - - // if there is a space in this arg, use double quotes surround it - if ((*it).find(" ") != std::string::npos) { - (*it).insert(0, "\""); - (*it).push_back('\"'); - } - - result.append(*it); - // add space to saperate args - result.append(" "); - } - - if (!result.empty()) { - // remove the tail space - result = result.substr(0, result.size() - 1); - } - - return result; -} - -bool ArgParser::checkUnexpectedArgs() const -{ - return false; -} diff --git a/src/lib/deskflow/ArgParser.h b/src/lib/deskflow/ArgParser.h deleted file mode 100644 index c9812596b..000000000 --- a/src/lib/deskflow/ArgParser.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2014 - 2016 Symless Ltd. - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#pragma once - -#include -#include - -namespace deskflow { -class ServerArgs; -} // namespace deskflow - -class App; - -class ArgParser -{ - -public: - explicit ArgParser(App *app); - - bool parseGenericArgs(int argc, const char *const *argv, int &i) const; - bool parseDeprecatedArgs(int argc, const char *const *argv, int &i) const; - - static bool isArg( - int argi, int argc, const char *const *argv, const char *name1, const char *name2, int minRequiredParameters = 0 - ); - static void splitCommandString(const std::string_view &command, std::vector &argv); - static bool searchDoubleQuotes(const std::string_view &command, size_t &left, size_t &right, size_t startPos = 0); - static void removeDoubleQuotes(std::string_view &arg); - static const char **getArgv(std::vector &argsArray); - static std::string assembleCommand( - std::vector &argsArray, const std::string_view &ignoreArg = std::string_view(), - int parametersRequired = 0 - ); - -private: - bool checkUnexpectedArgs() const; - -private: - App *m_app; -}; diff --git a/src/lib/deskflow/CMakeLists.txt b/src/lib/deskflow/CMakeLists.txt index 8b18089c9..49da6c155 100644 --- a/src/lib/deskflow/CMakeLists.txt +++ b/src/lib/deskflow/CMakeLists.txt @@ -67,8 +67,6 @@ add_library(${lib_name} STATIC ${PLATFORM_CODE} App.h AppUtil.cpp AppUtil.h - ArgParser.cpp - ArgParser.h Chunk.cpp Chunk.h ClientApp.cpp diff --git a/src/lib/deskflow/ClientApp.cpp b/src/lib/deskflow/ClientApp.cpp index d8f5ac77c..e69b17ba4 100644 --- a/src/lib/deskflow/ClientApp.cpp +++ b/src/lib/deskflow/ClientApp.cpp @@ -16,7 +16,6 @@ #include "common/Constants.h" #include "common/ExitCodes.h" #include "common/Settings.h" -#include "deskflow/ArgParser.h" #include "deskflow/ProtocolTypes.h" #include "deskflow/Screen.h" #include "deskflow/ScreenException.h" diff --git a/src/lib/deskflow/ServerApp.cpp b/src/lib/deskflow/ServerApp.cpp index d367874f9..7424a1d86 100644 --- a/src/lib/deskflow/ServerApp.cpp +++ b/src/lib/deskflow/ServerApp.cpp @@ -15,7 +15,6 @@ #include "common/ExitCodes.h" #include "common/Settings.h" #include "deskflow/App.h" -#include "deskflow/ArgParser.h" #include "deskflow/Screen.h" #include "deskflow/ScreenException.h" #include "net/SocketException.h" diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp index ee750e07e..e11bfbb7a 100644 --- a/src/lib/net/SecureListenSocket.cpp +++ b/src/lib/net/SecureListenSocket.cpp @@ -11,7 +11,6 @@ #include "arch/ArchException.h" #include "base/String.h" #include "common/Settings.h" -#include "deskflow/ArgParser.h" #include "net/NetworkAddress.h" #include "net/SocketMultiplexer.h" #include "net/TSocketMultiplexerMethodJob.h" diff --git a/src/unittests/deskflow/ArgParserTests.cpp b/src/unittests/deskflow/ArgParserTests.cpp deleted file mode 100644 index d1875aa7b..000000000 --- a/src/unittests/deskflow/ArgParserTests.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello - * SPDX-FileCopyrightText: (C) 2014 - 2016 Symless Ltd. - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#include "ArgParserTests.h" - -// This file is generated at build time -#include - -void ArgParserTests::initTestCase() -{ - m_arch.init(); - m_log.setFilter(LogLevel::Debug2); -} - -void ArgParserTests::isArg() -{ - int i = 1; - const int argc = 2; - const char *argShort[argc] = {"stub", "-t"}; - QVERIFY(ArgParser::isArg(i, argc, argShort, "-t", NULL)); - - const char *argLong[argc] = {"stub", "--test"}; - QVERIFY(ArgParser::isArg(i, argc, argLong, NULL, "--test")); -} - -void ArgParserTests::missingArg() -{ - int i = 1; - const int argc = 2; - const char *argv[argc] = {"stub", "-t"}; - - QVERIFY(!ArgParser::isArg(i, argc, argv, "-t", NULL, 1)); -} - -void ArgParserTests::withQuotes() -{ - std::string command("\"stub\""); - size_t left = 0; - size_t right = 0; - - QVERIFY(ArgParser::searchDoubleQuotes(command, left, right)); - QCOMPARE(left, 0); - QCOMPARE(right, 5); - - command = "stub"; - left = 0; - right = 0; - - QVERIFY(!ArgParser::searchDoubleQuotes(command, left, right)); - QCOMPARE(0, left); - QCOMPARE(0, right); - - command = "\"stub"; - left = 0; - right = 0; - - QVERIFY(!ArgParser::searchDoubleQuotes(command, left, right)); - QCOMPARE(left, 0); - QCOMPARE(right, 0); -} - -void ArgParserTests::splitCommand() -{ - std::string command("stub"); - std::vector argv; - ArgParser::splitCommandString(command, argv); - - QCOMPARE(argv.size(), 1); - QCOMPARE(argv.at(0), "stub"); - - command = "stub1 stub2"; - argv.resize(0); - ArgParser::splitCommandString(command, argv); - - QCOMPARE(2, argv.size()); - QCOMPARE(argv.at(0), "stub1"); - QCOMPARE(argv.at(1), "stub2"); - - command = "stub1 stub2 stub3"; - argv.resize(0); - ArgParser::splitCommandString(command, argv); - - QCOMPARE(3, argv.size()); - QCOMPARE(argv.at(0), "stub1"); - QCOMPARE(argv.at(1), "stub2"); - QCOMPARE(argv.at(2), "stub3"); - - command = "\"stub1\" stub2 \"stub3 space\""; - argv.resize(0); - ArgParser::splitCommandString(command, argv); - - QCOMPARE(3, argv.size()); - QCOMPARE(argv.at(0), "stub1"); - QCOMPARE(argv.at(1), "stub2"); - QCOMPARE(argv.at(2), "stub3 space"); -} - -void ArgParserTests::getArgv() -{ - std::vector argArray; - argArray.push_back("stub1"); - argArray.push_back("stub2"); - argArray.push_back("stub3 space"); - const char **argv = ArgParser::getArgv(argArray); - - std::string row1(argv[0]); - std::string row2(argv[1]); - std::string row3(argv[2]); - - QCOMPARE(row1, "stub1"); - QCOMPARE(row2, "stub2"); - QCOMPARE(row3, "stub3 space"); - - delete[] argv; -} - -void ArgParserTests::assembleCommand() -{ - std::vector argArray; - argArray.push_back("stub1"); - argArray.push_back("stub2"); - std::string command = ArgParser::assembleCommand(argArray); - - QCOMPARE(command, "stub1 stub2"); - - argArray.resize(0); - argArray.push_back("stub1"); - argArray.push_back("stub2"); - command = ArgParser::assembleCommand(argArray, "stub2"); - - QCOMPARE(command, "stub1"); - - argArray.resize(0); - argArray.push_back("stub1"); - argArray.push_back("stub2"); - argArray.push_back("stub3"); - argArray.push_back("stub4"); - command = ArgParser::assembleCommand(argArray, "stub2", 1); - - QCOMPARE(command, "stub1 stub4"); - - argArray.resize(0); - argArray.push_back("stub1 space"); - argArray.push_back("stub2"); - argArray.push_back("stub3 space"); - command = ArgParser::assembleCommand(argArray); - - QCOMPARE(command, "\"stub1 space\" stub2 \"stub3 space\""); -} - -void ArgParserTests::deprecatedArg_crypoPass_true() -{ - int i = 1; - const int argc = 3; - const char *kCryptoPassCmd[argc] = {"stub", "--crypto-pass", "mock_pass"}; - - QVERIFY(m_parser.parseDeprecatedArgs(argc, kCryptoPassCmd, i)); - QCOMPARE(i, 2); -} - -void ArgParserTests::deprecatedArg_crypoPass_false() -{ - int i = 1; - const int argc = 3; - const char *kCryptoPassCmd[argc] = {"stub", "--mock-arg", "mock_value"}; - - QVERIFY(!m_parser.parseDeprecatedArgs(argc, kCryptoPassCmd, i)); - QCOMPARE(i, 1); -} - -QTEST_MAIN(ArgParserTests) diff --git a/src/unittests/deskflow/ArgParserTests.h b/src/unittests/deskflow/ArgParserTests.h deleted file mode 100644 index f02d60a56..000000000 --- a/src/unittests/deskflow/ArgParserTests.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#include "base/Log.h" -#include "deskflow/ArgParser.h" - -#include - -class ArgParserTests : public QObject -{ - Q_OBJECT -private Q_SLOTS: - void initTestCase(); - // Test are run in order top to bottom - void isArg(); - void missingArg(); - void withQuotes(); - void splitCommand(); - void getArgv(); - void assembleCommand(); - void deprecatedArg_crypoPass_true(); - void deprecatedArg_crypoPass_false(); - -private: - Arch m_arch; - Log m_log; - ArgParser m_parser = ArgParser(nullptr); -}; diff --git a/src/unittests/deskflow/CMakeLists.txt b/src/unittests/deskflow/CMakeLists.txt index ce9f0f623..b7d136415 100644 --- a/src/unittests/deskflow/CMakeLists.txt +++ b/src/unittests/deskflow/CMakeLists.txt @@ -5,14 +5,6 @@ if(WIN32) set(extra_libs version) endif() -create_test( - NAME ArgParserTests - DEPENDS app - LIBS arch base ${extra_libs} - SOURCE ArgParserTests.cpp - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src/lib/deskflow" -) - create_test( NAME CoreArgParserTests DEPENDS app