From 0a551fe10e764103909e6842202669bcf1b94e24 Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Thu, 3 Feb 2022 17:39:19 +0100 Subject: [PATCH] #17 proper parsing of command lie params --- .vscode/launch.json | 2 +- DGWRemoteControl/DGWRemoteControlApp.cpp | 106 ++++++++++++++++++++--- DGWRemoteControl/DGWRemoteControlApp.h | 25 ++++++ 3 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 DGWRemoteControl/DGWRemoteControlApp.h diff --git a/.vscode/launch.json b/.vscode/launch.json index 264e6c4..592d6ba 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -33,7 +33,7 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/DGWRemoteControl/dgwremotecontrol", - "args": ["--name", "blabla", "F4FXL__B", "link", "never", "DCS208_C"], + "args": ["--name", "blabla", "F4FXL B", "linkk", "never", "DCS208_C"], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], diff --git a/DGWRemoteControl/DGWRemoteControlApp.cpp b/DGWRemoteControl/DGWRemoteControlApp.cpp index 2528934..0ed500b 100644 --- a/DGWRemoteControl/DGWRemoteControlApp.cpp +++ b/DGWRemoteControl/DGWRemoteControlApp.cpp @@ -21,9 +21,13 @@ #include #include #include +#include +#include "DGWRemoteControlApp.h" #include "Version.h" #include "ProgramArgs.h" +#include "Log.h" +#include "DStarDefines.h" const std::string NAME_OPTION("name"); const std::string REPEATER_PARAM("Callsign"); @@ -33,22 +37,104 @@ const std::string REFLECTOR_PARAM("Param2"); int main(int argc, const char* argv[]) { - std::string name; + std::string name, repeater, actionText, user, reflector; + RECONNECT reconnect; + + if(!getCLIParams(argc, argv, name, repeater, actionText, reconnect, user, reflector)) { + ::fprintf(stderr, "\ndgwremotecontrol v%s : invalid command line usage:\n\n", LONG_VERSION.c_str()); + ::fprintf(stderr, "\t\tdgwremotecontrol [-name ] link \n"); + ::fprintf(stderr, "\t\tdgwremotecontrol [-name ] unlink\n"); + ::fprintf(stderr, "\t\tdgwremotecontrol [-name ] drop \n"); + ::fprintf(stderr, "\t\tdgwremotecontrol [-name ] drop all\n\n"); + return 1; + } + + + return 0; +} + +bool getCLIParams(int argc, const char* argv[], std::string& name, std::string& repeater, std::string& actionText, RECONNECT& reconnect, std::string& user, std::string& reflector) +{ + bool ret = true; std::unordered_map namedArgs; std::vector positionalArgs; CProgramArgs::eatArguments(argc, argv, namedArgs, positionalArgs); - if(namedArgs.size() == 0U && positionalArgs.size() == 0U) { - ::fprintf(stderr, "\ndgwremotecontrol v%s : invalid command line usage:\n\n", LONG_VERSION.c_str()); - ::fprintf(stderr, "\t\tdgwremotecontrol [--name ] link \n"); - ::fprintf(stderr, "\t\tdgwremotecontrol [--name ] unlink\n"); - ::fprintf(stderr, "\t\tdgwremotecontrol [--name ] drop \n"); - ::fprintf(stderr, "\t\tdgwremotecontrol [--name ] drop all\n\n"); - return 1; + if(namedArgs.count(NAME_OPTION) > 0U) { + name = namedArgs[NAME_OPTION]; + } + + if(positionalArgs.size() < 1) { + return false; } + // dgwremotecontrol [-name ] link + if(positionalArgs.size() == 4U) { + repeater = positionalArgs[0]; - return 0; -} \ No newline at end of file + actionText = boost::to_lower_copy(positionalArgs[1]); + if(actionText != "link") { + CLog::logError("Invalid action %s. Expected link", positionalArgs[1].c_str()); + ret = false; + } + + std::string reconnectText = boost::to_lower_copy(positionalArgs[2]); + if(reconnectText == "never") reconnect = RECONNECT_NEVER; + else if(reconnectText == "5") reconnect = RECONNECT_5MINS; + else if(reconnectText == "10") reconnect = RECONNECT_10MINS; + else if(reconnectText == "15") reconnect = RECONNECT_15MINS; + else if(reconnectText == "20") reconnect = RECONNECT_20MINS; + else if(reconnectText == "25") reconnect = RECONNECT_25MINS; + else if(reconnectText == "30") reconnect = RECONNECT_30MINS; + else if(reconnectText == "60") reconnect = RECONNECT_60MINS; + else if(reconnectText == "90") reconnect = RECONNECT_90MINS; + else if(reconnectText == "120") reconnect = RECONNECT_120MINS; + else if(reconnectText == "180") reconnect = RECONNECT_180MINS; + else if(reconnectText == "fixed") reconnect = RECONNECT_FIXED; + else { + CLog::logError("Invalid reconnect value %s. Valid values are 5,10,15,20,25,30,60,90,120,180,fixed", positionalArgs[2].c_str()); + ret = false; + } + reflector = boost::to_upper_copy(positionalArgs[3]); + boost::replace_all(reflector, "_", " "); + } + // dgwremotecontrol [-name ] unlink + else if(positionalArgs.size() == 2U) { + repeater = positionalArgs[0]; + actionText = boost::to_lower_copy(positionalArgs[1]); + if(actionText != "unlink") { + CLog::logError("Invalid action %s. Expected unlink", positionalArgs[1].c_str()); + ret = false; + } + reconnect = RECONNECT_NEVER; + } + // dgwremotecontrol [-name ] drop + // dgwremotecontrol [-name ] drop all + else if(positionalArgs.size() == 3U) { + repeater = positionalArgs[0]; + + actionText = boost::to_lower_copy(positionalArgs[1]); + if(actionText != "drop") { + CLog::logError("Invalid action %s. Expected drop", positionalArgs[1].c_str()); + ret = false; + } + + user = positionalArgs[2]; + } + + boost::to_upper(repeater); + repeater.resize(LONG_CALLSIGN_LENGTH, ' '); + boost::replace_all(repeater, "_", " "); + + boost::to_upper(reflector); + reflector.resize(LONG_CALLSIGN_LENGTH, ' '); + boost::replace_all(reflector, "_", " "); + + boost::to_upper(user); + user.resize(LONG_CALLSIGN_LENGTH, ' '); + boost::replace_all(user, "_", " "); + + return ret; +} diff --git a/DGWRemoteControl/DGWRemoteControlApp.h b/DGWRemoteControl/DGWRemoteControlApp.h new file mode 100644 index 0000000..39566a7 --- /dev/null +++ b/DGWRemoteControl/DGWRemoteControlApp.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2010,2011 by Jonathan Naylor G4KLX + * Copyright (c) 2021-2022 by Geoffrey Merck F4FXL / KC3FRA + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#pragma once + +#include + +#include "Defs.h" + +bool getCLIParams(int argc, const char* argv[], std::string& name, std::string& repeater, std::string& actionText, RECONNECT& reconnect, std::string& user, std::string& reflector); \ No newline at end of file