diff --git a/libretroshare/src/retroshare/rsconfig.h b/libretroshare/src/retroshare/rsconfig.h index a47eb7e8d..e3b74aa4b 100644 --- a/libretroshare/src/retroshare/rsconfig.h +++ b/libretroshare/src/retroshare/rsconfig.h @@ -289,6 +289,7 @@ public: /* Operating Mode */ virtual uint32_t getOperatingMode() = 0; virtual bool setOperatingMode(uint32_t opMode) = 0; + virtual bool setOperatingMode(const std::string &opModeStr) = 0; /* Data Rate Control - to be moved here */ virtual int SetMaxDataRates( int downKb, int upKb ) = 0; diff --git a/libretroshare/src/rsserver/p3serverconfig.cc b/libretroshare/src/rsserver/p3serverconfig.cc index 1d74573d6..eab0f5722 100644 --- a/libretroshare/src/rsserver/p3serverconfig.cc +++ b/libretroshare/src/rsserver/p3serverconfig.cc @@ -380,7 +380,7 @@ uint32_t p3ServerConfig::getOperatingMode() { mode = RS_OPMODE_GAMING; } - else if (modestr == "MINIMAL_TRANSFER") + else if (modestr == "MINIMAL") { mode = RS_OPMODE_MINIMAL; } @@ -410,7 +410,7 @@ bool p3ServerConfig::setOperatingMode(uint32_t opMode) break; case RS_OPMODE_MINIMAL: - modestr = "MINIMAL_TRANSFER"; + modestr = "MINIMAL"; break; } mGeneralConfig->setSetting(RS_CONFIG_OPERATING_STRING, modestr); @@ -423,6 +423,31 @@ bool p3ServerConfig::setOperatingMode(uint32_t opMode) return switchToOperatingMode(opMode); } +bool p3ServerConfig::setOperatingMode(const std::string &opModeStr) +{ + uint32_t opMode = RS_OPMODE_FULL; + std::string upper; + stringToUpperCase(opModeStr, upper); + + if (upper == "NOTURTLE") + { + opMode = RS_OPMODE_NOTURTLE; + } + else if (upper == "GAMING") + { + opMode = RS_OPMODE_GAMING; + } + else if (upper == "MINIMAL") + { + opMode = RS_OPMODE_MINIMAL; + } + else // "FULL" by default + { + opMode = RS_OPMODE_FULL; + } + + return setOperatingMode(opMode); +} bool p3ServerConfig::switchToOperatingMode(uint32_t opMode) { diff --git a/libretroshare/src/rsserver/p3serverconfig.h b/libretroshare/src/rsserver/p3serverconfig.h index d9ce3eaed..134558049 100644 --- a/libretroshare/src/rsserver/p3serverconfig.h +++ b/libretroshare/src/rsserver/p3serverconfig.h @@ -91,6 +91,7 @@ virtual bool setConfigurationOption(uint32_t key, const std::string &opt); /* Operating Mode */ virtual uint32_t getOperatingMode(); virtual bool setOperatingMode(uint32_t opMode); +virtual bool setOperatingMode(const std::string &opModeStr); virtual int SetMaxDataRates( int downKb, int upKb ); virtual int GetMaxDataRates( int &downKb, int &upKb ); diff --git a/libretroshare/src/rsserver/rsinit.cc b/libretroshare/src/rsserver/rsinit.cc index cdf00b9e9..eba6f679c 100644 --- a/libretroshare/src/rsserver/rsinit.cc +++ b/libretroshare/src/rsserver/rsinit.cc @@ -138,6 +138,7 @@ class RsInitConfig std::string load_trustedpeer_file; bool udpListenerOnly; + std::string opModeStr; }; static RsInitConfig *rsInitConfig = NULL; @@ -189,6 +190,7 @@ void RsInit::InitRsConfig() rsInitConfig->passwd = ""; rsInitConfig->debugLevel = PQL_WARNING; rsInitConfig->udpListenerOnly = false; + rsInitConfig->opModeStr = std::string("FULL"); /* setup the homePath (default save location) */ // rsInitConfig->homePath = getHomePath(); @@ -363,11 +365,11 @@ int RsInit::InitRetroShare(int _argc, char **_argv, bool /* strictCheck */) >> parameter('l',"log-file" ,rsInitConfig->logfname ,"logfile" ,"Set Log filename." ,false) >> parameter('d',"debug-level" ,rsInitConfig->debugLevel ,"level" ,"Set debug level." ,false) #ifdef TO_REMOVE - // This as removed because it is not used anymore. - + // This was removed because it is not used anymore. >> parameter('w',"password" ,rsInitConfig->passwd ,"password" ,"Set Login Password." ,false) #endif >> parameter('i',"ip-address" ,rsInitConfig->inet ,"nnn.nnn.nnn.nnn", "Force IP address to use (if cannot be detected)." ,false) + >> parameter('o',"opmode" ,rsInitConfig->opModeStr ,"opmode" ,"Set Operating mode (Full, NoTurtle, Gaming, Minimal)." ,false) >> parameter('p',"port" ,rsInitConfig->port ,"port", "Set listenning port to use." ,false) >> parameter('c',"base-dir" ,opt_base_dir ,"directory", "Set base directory." ,false) >> parameter('U',"user-id" ,prefUserString ,"ID", "[ocation Id] Sets Account to Use, Useful when Autologin is enabled.",false) @@ -1733,6 +1735,10 @@ int RsServer::StartupRetroShare() mPeerMgr->forceHiddenNode(); } + if (!rsInitConfig->opModeStr.empty()) + { + rsConfig->setOperatingMode(rsInitConfig->opModeStr); + } mNetMgr -> checkNetAddress(); if (rsInitConfig->hiddenNodeSet) { diff --git a/libretroshare/src/util/argstream.h b/libretroshare/src/util/argstream.h index 1d7901fcc..1044effbd 100644 --- a/libretroshare/src/util/argstream.h +++ b/libretroshare/src/util/argstream.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2004 Xavier Décoret +/* Copyright (C) 2004 Xavier Decoret * * argstream is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -71,8 +71,8 @@ namespace private: std::string shortName_; std::string longName_; - std::string valueName_; T* value_; + std::string valueName_; T initialValue_; std::string description_; bool mandatory_; @@ -282,8 +282,8 @@ namespace bool mandatory) : shortName_(1,s), longName_(l), - valueName_(valueName), value_(&v), + valueName_(valueName), initialValue_(v), description_(desc), mandatory_(mandatory) @@ -296,8 +296,8 @@ namespace const char* desc, bool mandatory) : longName_(l), - valueName_(valueName), value_(&v), + valueName_(valueName), initialValue_(v), description_(desc), mandatory_(mandatory) @@ -310,8 +310,8 @@ namespace const char* desc, bool mandatory) : shortName_(1,s), - valueName_(valueName), value_(&v), + valueName_(valueName), initialValue_(v), description_(desc), mandatory_(mandatory) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 5f140a72b..f33c04191 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -1492,6 +1492,23 @@ void MainWindow::processLastArgs() /* Now use files from the command line, because no RetroShare was running */ openRsCollection(Rshare::files()->takeFirst()); } + /* Handle the -opmode options. */ + if (opModeStatus) { + QString opmode = Rshare::opmode().toLower(); + if (opmode == "noturtle") { + opModeStatus->setCurrentIndex(RS_OPMODE_NOTURTLE - 1); + } else if (opmode == "gaming") { + opModeStatus->setCurrentIndex(RS_OPMODE_GAMING - 1); + } else if (opmode == "minimal") { + opModeStatus->setCurrentIndex(RS_OPMODE_MINIMAL - 1); + } else { + opModeStatus->setCurrentIndex(RS_OPMODE_FULL - 1); + } + opModeStatus->setOpMode(); + } else { + std::cerr << "ERR: MainWindow::processLastArgs opModeStatus is not initialized."; + } + } void MainWindow::switchVisibilityStatus(StatusElement e,bool b) diff --git a/retroshare-gui/src/gui/statusbar/OpModeStatus.h b/retroshare-gui/src/gui/statusbar/OpModeStatus.h index 3ca418cc3..2190d1e0e 100644 --- a/retroshare-gui/src/gui/statusbar/OpModeStatus.h +++ b/retroshare-gui/src/gui/statusbar/OpModeStatus.h @@ -46,7 +46,7 @@ public: QColor getOpMode_Minimal_Color() const; void setOpMode_Minimal_Color( QColor c ); -private slots: +public slots: void setOpMode(); private: diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index ad618d3bc..674e23065 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -189,6 +189,17 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO); Q_INIT_RESOURCE(images); Q_INIT_RESOURCE(icons); + // Loop through all command-line args/values to get help wanted before RsInit exit. + for (int i = 0; i < args.size(); ++i) { + QString arg; + /* Get the argument name and set a blank value */ + arg = args.at(i); + if ((arg.toLower() == "-h") || (arg.toLower() == "--help")) { + QApplication dummyApp (argc, argv); // needed for QMessageBox + Rshare::showUsageMessageBox(); + } + } + // This is needed to allocate rsNotify, so that it can be used to ask for PGP passphrase // RsControl::earlyInitNotificationSystem() ; diff --git a/retroshare-gui/src/rshare.cpp b/retroshare-gui/src/rshare.cpp index 040992afe..ff6038de0 100644 --- a/retroshare-gui/src/rshare.cpp +++ b/retroshare-gui/src/rshare.cpp @@ -55,23 +55,27 @@ #include "rshare.h" /* Available command-line arguments. */ -#define ARG_LANGUAGE "lang" /**< Argument specifying language. */ -#define ARG_GUISTYLE "style" /**< Argument specfying GUI style. */ -#define ARG_GUISTYLESHEET "stylesheet" /**< Argument specfying GUI style. */ #define ARG_RESET "reset" /**< Reset Rshare's saved settings. */ #define ARG_DATADIR "datadir" /**< Directory to use for data files. */ #define ARG_LOGFILE "logfile" /**< Location of our logfile. */ #define ARG_LOGLEVEL "loglevel" /**< Log verbosity. */ +#define ARG_GUISTYLE "style" /**< Argument specfying GUI style. */ +#define ARG_GUISTYLESHEET "stylesheet" /**< Argument specfying GUI style. */ +#define ARG_LANGUAGE "lang" /**< Argument specifying language. */ +#define ARG_OPMODE_S "o" /**< OpMode (Full, NoTurtle, Gaming, Minimal) */ +#define ARG_OPMODE_L "opmode" /**< OpMode (Full, NoTurtle, Gaming, Minimal) */ #define ARG_RSLINK_S "r" /**< Open RsLink with protocol retroshare:// */ #define ARG_RSLINK_L "link" /**< Open RsLink with protocol retroshare:// */ -#define ARG_RSFILE_S "f" /**< Open RsFile with or without arg */ -#define ARG_RSFILE_L "rsfile" /**< Open RsFile with or without arg */ +#define ARG_RSFILE_S "f" /**< Open RsFile with or without arg. */ +#define ARG_RSFILE_L "rsfile" /**< Open RsFile with or without arg. */ //Other defined for server in /libretroshare/src/rsserver/rsinit.cc:351 // The arguments here can be send to a running instance. // If the command line contains arguments not listed here, we have to start a new instance. -// For exmample, the user wants to start a second instance using --base-dir arg of libretroshare. +// For example, the user wants to start a second instance using --base-dir arg of libretroshare. static const char* const forwardableArgs[] = { + ARG_OPMODE_S, + ARG_OPMODE_L, ARG_RSLINK_S, ARG_RSLINK_L, ARG_RSFILE_S, @@ -81,11 +85,12 @@ static const char* const forwardableArgs[] = { /* Static member variables */ QMap Rshare::_args; /**< List of command-line arguments. */ +Log Rshare::_log; /**< Logs debugging messages to file or stdout. */ QString Rshare::_style; /**< The current GUI style. */ QString Rshare::_stylesheet; /**< The current GUI stylesheet. */ QString Rshare::_language; /**< The current language. */ QString Rshare::_dateformat; /**< The format of dates in feed items etc. */ -Log Rshare::_log; /**< Logs debugging messages to file or stdout. */ +QString Rshare::_opmode; /**< The operating mode passed by args. */ QStringList Rshare::_links; /**< List of links passed by arguments. */ QStringList Rshare::_files; /**< List of files passed by arguments. */ QDateTime Rshare::mStartupTime; @@ -425,35 +430,45 @@ Rshare::showUsageMessageBox() tcol(tr("Resets ALL stored RetroShare settings."))); out << trow(tcol("-" ARG_DATADIR" <dir>") + tcol(tr("Sets the directory RetroShare uses for data files."))); - out << trow(tcol("-" ARG_LOGFILE" <file>") + + out << trow(tcol("-" ARG_LOGFILE" <" + tr("filename") + ">") + tcol(tr("Sets the name and location of RetroShare's logfile."))); - out << trow(tcol("-" ARG_LOGLEVEL" <level>") + + out << trow(tcol("-" ARG_LOGLEVEL" <" + tr("level") + ">") + tcol(tr("Sets the verbosity of RetroShare's logging.") + "
[" + Log::logLevels().join("|") +"]")); - out << trow(tcol("-" ARG_GUISTYLE" <style>") + + out << trow(tcol("-" ARG_GUISTYLE" <" + tr("style") +">") + tcol(tr("Sets RetroShare's interface style.") + "
[" + QStyleFactory::keys().join("|") + "]")); - out << trow(tcol("-" ARG_GUISTYLESHEET" <stylesheet>") + - tcol(tr("Sets RetroShare's interface stylesheets."))); - out << trow(tcol("-" ARG_LANGUAGE" <language>") + + out << trow(tcol("-" ARG_GUISTYLESHEET" <" + tr("stylesheet") + ">") + + tcol(tr("Sets RetroShare's interface stylesheets."))); + out << trow(tcol("-" ARG_LANGUAGE" <" + tr("language") + ">") + tcol(tr("Sets RetroShare's language.") + "
[" + LanguageSupport::languageCodes().join("|") + "]")); + out << trow(tcol("--" ARG_OPMODE_L" <" + tr("opmode") + ">") + + tcol(tr("Sets RetroShare's operating mode.") + + "
[full|noturtle|gaming|minimal]")); + out << trow(tcol("-" ARG_RSLINK_L" <" + tr("RsLinkURL") + ">") + + tcol(tr("Open RsLink with protocol retroshare://"))); + out << trow(tcol("-" ARG_RSFILE_L" <" + tr("filename") + ">") + + tcol(tr("Open RsFile with or without arg."))); out << ""; VMessageBox::information(0, - tr("RetroShare Usage Information"), usage, VMessageBox::Ok); + tr("RetroShare GUI Usage Information"), usage, VMessageBox::Ok); } /** Returns true if the specified argument expects a value. */ bool Rshare::argNeedsValue(QString argName) { - return (argName == ARG_GUISTYLE || - argName == ARG_GUISTYLESHEET || - argName == ARG_LANGUAGE || + return ( argName == ARG_DATADIR || argName == ARG_LOGFILE || - argName == ARG_LOGLEVEL || + argName == ARG_LOGLEVEL || + argName == ARG_GUISTYLE || + argName == ARG_GUISTYLESHEET || + argName == ARG_LANGUAGE || + argName == ARG_OPMODE_S || + argName == ARG_OPMODE_L || argName == ARG_RSLINK_S || argName == ARG_RSLINK_L || argName == ARG_RSFILE_S || @@ -494,6 +509,14 @@ Rshare::parseArguments(QStringList args, bool firstRun) } } + /* handle opmode that could be change while running.*/ + QString omValue = QString(value).prepend(";").append(";").toLower(); + QString omValues = QString(";full;noturtle;gaming;minimal;"); + if ((arg == ARG_OPMODE_S || arg == ARG_OPMODE_L ) && + omValues.contains(omValue)) { + _opmode = value; + } + /* Don't send theses argument to _args map to allow multiple. */ if (arg == ARG_RSLINK_S || arg == ARG_RSLINK_L) { _links.append(value); @@ -510,10 +533,17 @@ Rshare::parseArguments(QStringList args, bool firstRun) bool Rshare::validateArguments(QString &errmsg) { - /* Check for a language that Retroshare recognizes. */ - if (_args.contains(ARG_LANGUAGE) && - !LanguageSupport::isValidLanguageCode(_args.value(ARG_LANGUAGE))) { - errmsg = tr("Invalid language code specified:")+" " + _args.value(ARG_LANGUAGE); + /* Check for a writable log file */ + if (_args.contains(ARG_LOGFILE) && !_log.isOpen()) { + errmsg = tr("Unable to open log file '%1': %2") + .arg(_args.value(ARG_LOGFILE)) + .arg(_log.errorString()); + return false; + } + /* Check for a valid log level */ + if (_args.contains(ARG_LOGLEVEL) && + !Log::logLevels().contains(_args.value(ARG_LOGLEVEL))) { + errmsg = tr("Invalid log level specified:")+" " + _args.value(ARG_LOGLEVEL); return false; } /* Check for a valid GUI style */ @@ -523,17 +553,22 @@ Rshare::validateArguments(QString &errmsg) errmsg = tr("Invalid GUI style specified:")+" " + _args.value(ARG_GUISTYLE); return false; } - /* Check for a valid log level */ - if (_args.contains(ARG_LOGLEVEL) && - !Log::logLevels().contains(_args.value(ARG_LOGLEVEL))) { - errmsg = tr("Invalid log level specified:")+" " + _args.value(ARG_LOGLEVEL); + /* Check for a language that Retroshare recognizes. */ + if (_args.contains(ARG_LANGUAGE) && + !LanguageSupport::isValidLanguageCode(_args.value(ARG_LANGUAGE))) { + errmsg = tr("Invalid language code specified:")+" " + _args.value(ARG_LANGUAGE); return false; } - /* Check for a writable log file */ - if (_args.contains(ARG_LOGFILE) && !_log.isOpen()) { - errmsg = tr("Unable to open log file '%1': %2") - .arg(_args.value(ARG_LOGFILE)) - .arg(_log.errorString()); + /* Check for an opmode that Retroshare recognizes. */ + if (_args.contains(ARG_OPMODE_S) && + !QString(";full;noturtle;gaming;minimal;").contains(QString(_args.value(ARG_OPMODE_S)).prepend(";").append(";").toLower())) { + errmsg = tr("Invalid operating mode specified:")+" " + _args.value(ARG_OPMODE_S); + return false; + } + /* Check for an opmode that Retroshare recognizes. */ + if (_args.contains(ARG_OPMODE_L) && + !QString(";full;noturtle;gaming;minimal;").contains(QString(_args.value(ARG_OPMODE_L)).prepend(";").append(";").toLower())) { + errmsg = tr("Invalid operating mode specified:")+" " + _args.value(ARG_OPMODE_L); return false; } return true; diff --git a/retroshare-gui/src/rshare.h b/retroshare-gui/src/rshare.h index cc982ba93..fd17b0f13 100644 --- a/retroshare-gui/src/rshare.h +++ b/retroshare-gui/src/rshare.h @@ -107,12 +107,14 @@ public: /** Initialize plugins. */ static void initPlugins(); - /** Returns the current language. */ - static QString language() { return _language; } /** Returns the current GUI style. */ static QString style() { return _style; } /** Returns the current GUI stylesheet. */ static QString stylesheet() { return _stylesheet; } + /** Returns the current language. */ + static QString language() { return _language; } + /** Returns the operating mode. */ + static QString opmode() { return _opmode; } /** Returns links passed by arguments. */ static QStringList* links() { return &_links; } /** Returns files passed by arguments. */ @@ -181,11 +183,12 @@ private: static bool argNeedsValue(QString argName); static QMap _args; /**< List of command-line arguments. */ + static Log _log; /**< Logs debugging messages to file or stdout. */ static QString _style; /**< The current GUI style. */ static QString _stylesheet; /**< The current GUI stylesheet. */ static QString _language; /**< The current language. */ static QString _dateformat; /**< The format for dates in feed items etc. */ - static Log _log; /**< Logs debugging messages to file or stdout. */ + static QString _opmode; /**< The operating mode passed by args. */ static QStringList _links; /**< List of links passed by arguments. */ static QStringList _files; /**< List of files passed by arguments. */ static QDateTime mStartupTime; // startup time