2018-09-29 15:56:04 +03:00
|
|
|
/*
|
2021-01-05 13:04:05 +03:00
|
|
|
* Copyright (C) 2018-2021 QuasarApp.
|
2018-09-29 15:56:04 +03:00
|
|
|
* Distributed under the lgplv3 software license, see the accompanying
|
|
|
|
* Everyone is permitted to copy and distribute verbatim copies
|
|
|
|
* of this license document, but changing it is not allowed.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "params.h"
|
|
|
|
#include <QVariantMap>
|
|
|
|
#include <QDebug>
|
2019-01-16 22:17:05 +03:00
|
|
|
#include <QFileInfo>
|
2019-08-22 14:21:43 +03:00
|
|
|
#include <iostream>
|
2019-08-23 21:14:32 +03:00
|
|
|
#include <QDateTime>
|
2020-04-04 15:42:56 +03:00
|
|
|
#include <QCoreApplication>
|
2019-08-23 21:14:32 +03:00
|
|
|
|
2019-01-27 19:45:30 +03:00
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
#include "windows.h"
|
|
|
|
#else
|
|
|
|
#include <unistd.h>
|
2019-01-27 20:14:06 +03:00
|
|
|
#include <limits.h>
|
2019-01-27 19:45:30 +03:00
|
|
|
#endif
|
2018-09-29 15:56:04 +03:00
|
|
|
|
2020-04-18 21:28:35 +03:00
|
|
|
#define APP_PATH "appPath"
|
|
|
|
#define APP_NAME "appName"
|
|
|
|
|
2018-09-29 15:56:04 +03:00
|
|
|
using namespace QuasarAppUtils;
|
|
|
|
|
|
|
|
static QVariantMap params = QVariantMap();
|
2020-03-09 14:35:08 +03:00
|
|
|
static int _argc = 0;
|
2018-09-29 15:56:04 +03:00
|
|
|
|
2020-04-18 21:28:35 +03:00
|
|
|
|
2018-09-29 15:56:04 +03:00
|
|
|
bool Params::isEndable(const QString& key) {
|
|
|
|
return params.contains(key);
|
|
|
|
}
|
|
|
|
|
2020-04-04 15:42:56 +03:00
|
|
|
void Params::log(const QString &log, VerboseLvl vLvl) {
|
2019-08-22 14:21:43 +03:00
|
|
|
|
2019-08-23 23:55:28 +03:00
|
|
|
writeLoginFile(log, vLvl);
|
2019-08-22 14:21:43 +03:00
|
|
|
|
2020-04-14 17:57:54 +03:00
|
|
|
auto lvl = getVerboseLvl();
|
2019-03-28 18:58:36 +03:00
|
|
|
|
2020-04-04 15:42:56 +03:00
|
|
|
if (vLvl <= lvl) {
|
2019-03-28 18:58:36 +03:00
|
|
|
|
2020-04-04 15:42:56 +03:00
|
|
|
switch (vLvl) {
|
2019-03-28 18:58:36 +03:00
|
|
|
|
2020-04-04 15:42:56 +03:00
|
|
|
case VerboseLvl::Error:
|
|
|
|
case VerboseLvl::Warning: {
|
|
|
|
std::cerr << lvlToString(vLvl) + ": " + log.toStdString() << std::endl;
|
|
|
|
break;
|
|
|
|
}
|
2019-03-28 18:58:36 +03:00
|
|
|
|
2020-04-04 15:42:56 +03:00
|
|
|
default: {
|
|
|
|
std::cout << lvlToString(vLvl) + ": " + log.toStdString() << std::endl;
|
|
|
|
break;
|
2019-03-28 18:58:36 +03:00
|
|
|
}
|
2020-04-04 15:42:56 +03:00
|
|
|
}
|
|
|
|
|
2019-01-02 13:42:51 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-18 22:28:17 +03:00
|
|
|
Help::Charters Params::getparamsHelp() {
|
|
|
|
return {
|
|
|
|
{
|
|
|
|
"Base Options", {
|
|
|
|
{"-verbose (level 1 - 3)", "Shows debug log"},
|
|
|
|
{"-fileLog (path to file)", "Sets path of log file. Default it is path to executable file with suffix '.log'"},
|
|
|
|
}
|
|
|
|
}
|
2019-08-22 14:21:43 +03:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
void Params::showHelp(const QStringList &help) {
|
|
|
|
for (const QString& line : help) {
|
|
|
|
std::cout << line.toStdString() << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-18 22:28:17 +03:00
|
|
|
void Params::showHelp(const Help::Charters &help) {
|
|
|
|
Help::print(help);
|
|
|
|
}
|
|
|
|
|
2020-04-14 17:57:54 +03:00
|
|
|
VerboseLvl Params::getVerboseLvl() {
|
|
|
|
return static_cast<VerboseLvl>(getArg("verbose", DEFAULT_VERBOSE_LVL).toInt());
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Params::isDebug() {
|
|
|
|
return getVerboseLvl() >= VerboseLvl::Debug;
|
|
|
|
}
|
|
|
|
|
2021-01-24 14:04:31 +03:00
|
|
|
bool Params::isDebugBuild() {
|
|
|
|
#ifdef QT_DEBUG
|
|
|
|
return true;
|
|
|
|
#else
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2020-02-18 22:28:17 +03:00
|
|
|
void Params::showHelp() {
|
|
|
|
Help::print(getparamsHelp());
|
|
|
|
}
|
|
|
|
|
2020-04-18 21:28:35 +03:00
|
|
|
QVariantMap Params::getUserParamsMap() {
|
|
|
|
auto result = params;
|
|
|
|
result.remove(APP_PATH);
|
|
|
|
result.remove(APP_NAME);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2020-05-17 23:21:12 +03:00
|
|
|
void Params::clearParsedData() {
|
|
|
|
params.clear();
|
|
|
|
_argc = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Params::getCurrentExecutable() {
|
2020-09-28 23:42:54 +03:00
|
|
|
return getCurrentExecutableDir() + "/" + getStrArg(APP_NAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Params::getCurrentExecutableDir() {
|
|
|
|
return getStrArg(APP_PATH);
|
2020-05-17 23:21:12 +03:00
|
|
|
}
|
|
|
|
|
2019-09-16 12:38:10 +03:00
|
|
|
int Params::size() {
|
|
|
|
return params.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
int Params::customParamasSize() {
|
2020-03-09 14:35:08 +03:00
|
|
|
if (_argc)
|
|
|
|
return _argc - 1;
|
|
|
|
|
2019-09-16 12:38:10 +03:00
|
|
|
return size() - 2;
|
|
|
|
}
|
|
|
|
|
2019-08-23 20:41:13 +03:00
|
|
|
QString Params::timeString() {
|
|
|
|
return QDateTime::currentDateTime().toString();
|
|
|
|
}
|
|
|
|
|
2020-04-04 15:42:56 +03:00
|
|
|
std::string Params::lvlToString(VerboseLvl vLvl) {
|
2019-08-22 14:21:43 +03:00
|
|
|
switch (vLvl) {
|
|
|
|
|
|
|
|
case VerboseLvl::Error: {
|
|
|
|
return "Error";
|
|
|
|
}
|
|
|
|
|
|
|
|
case VerboseLvl::Warning: {
|
|
|
|
return "Warning";
|
|
|
|
}
|
|
|
|
|
|
|
|
case VerboseLvl::Info: {
|
|
|
|
return "Info";
|
|
|
|
}
|
|
|
|
|
|
|
|
case VerboseLvl::Debug: {
|
|
|
|
return "Verbose log";
|
|
|
|
}
|
2020-04-04 15:42:56 +03:00
|
|
|
default: return "";
|
2019-08-22 14:21:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Params::writeLoginFile(const QString &log, VerboseLvl vLvl) {
|
2020-04-04 15:42:56 +03:00
|
|
|
if (isEndable("fileLog")) {
|
2019-08-22 14:21:43 +03:00
|
|
|
|
2020-05-17 23:21:12 +03:00
|
|
|
QString path = getCurrentExecutable() + ".log";
|
2020-04-04 15:42:56 +03:00
|
|
|
auto file = getStrArg("fileLog");
|
|
|
|
if (file.size()) {
|
|
|
|
QString path = file;
|
2019-08-22 14:21:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
QFile logFile(path);
|
|
|
|
|
2019-08-22 17:48:23 +03:00
|
|
|
if (logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
|
2019-08-22 14:21:43 +03:00
|
|
|
|
|
|
|
QTextStream stream(&logFile);
|
2020-09-07 09:54:25 +03:00
|
|
|
#if QT_VERSION > QT_VERSION_CHECK(5, 14, 0)
|
2020-08-06 14:14:29 +03:00
|
|
|
stream << timeString() <<"| " << QString::fromStdString(lvlToString(vLvl)) + ": " + log << Qt::endl;
|
2020-09-07 09:54:25 +03:00
|
|
|
#else
|
|
|
|
stream << timeString() <<"| " << QString::fromStdString(lvlToString(vLvl)) + ": " + log << endl;
|
|
|
|
#endif
|
2019-08-22 14:21:43 +03:00
|
|
|
logFile.close();
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
2019-11-01 20:28:17 +03:00
|
|
|
|
2019-08-22 14:21:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-03-09 15:32:39 +03:00
|
|
|
bool Params::parseParams(const int argc, const char *argv[]) {
|
2019-09-10 18:22:13 +03:00
|
|
|
|
|
|
|
QStringList params;
|
|
|
|
for (int i = 1; i < argc; i++) {
|
|
|
|
params.push_back(argv[i]);
|
|
|
|
}
|
|
|
|
|
2020-03-09 15:32:39 +03:00
|
|
|
_argc = argc;
|
2019-09-10 18:22:13 +03:00
|
|
|
return parseParams(params);
|
|
|
|
}
|
|
|
|
|
2019-11-21 18:03:13 +03:00
|
|
|
bool Params::parseParams(int argc, char *argv[]) {
|
|
|
|
return parseParams(argc, const_cast<const char**>(argv));
|
|
|
|
}
|
|
|
|
|
2019-09-10 18:22:13 +03:00
|
|
|
bool Params::parseParams(const QStringList ¶msArray) {
|
2018-09-29 15:56:04 +03:00
|
|
|
params.clear();
|
2019-01-27 19:45:30 +03:00
|
|
|
|
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
char buffer[MAX_PATH];
|
2019-11-01 20:39:44 +03:00
|
|
|
memset(buffer, 0, sizeof buffer);
|
2019-11-01 20:28:17 +03:00
|
|
|
|
2019-01-27 19:45:30 +03:00
|
|
|
GetModuleFileNameA(nullptr, buffer, MAX_PATH);
|
2020-04-18 21:28:35 +03:00
|
|
|
params [APP_PATH] = QFileInfo(buffer).absolutePath();
|
|
|
|
params [APP_NAME] = QFileInfo(buffer).fileName();
|
2019-08-22 14:21:43 +03:00
|
|
|
|
2019-01-27 19:45:30 +03:00
|
|
|
#else
|
2019-01-27 20:14:06 +03:00
|
|
|
char path[2048];
|
2019-11-01 20:28:17 +03:00
|
|
|
memset(path, 0, sizeof path);
|
|
|
|
|
2019-05-10 09:56:07 +03:00
|
|
|
if (readlink("/proc/self/exe", path, 2048) < 0) {
|
2020-04-04 15:42:56 +03:00
|
|
|
QuasarAppUtils::Params::log("parseParams can't get self path!",
|
2020-04-04 18:17:26 +03:00
|
|
|
QuasarAppUtils::Error);
|
2019-05-10 09:56:07 +03:00
|
|
|
return false;
|
|
|
|
}
|
2020-04-18 21:28:35 +03:00
|
|
|
params [APP_PATH] = QFileInfo(path).absolutePath();
|
|
|
|
params [APP_NAME] = QFileInfo(path).fileName();
|
2019-08-22 14:21:43 +03:00
|
|
|
|
2019-01-27 19:45:30 +03:00
|
|
|
#endif
|
|
|
|
|
2020-04-18 21:28:35 +03:00
|
|
|
if (!getStrArg(APP_PATH).size()) {
|
2019-01-27 19:45:30 +03:00
|
|
|
return false;
|
|
|
|
}
|
2018-09-29 15:56:04 +03:00
|
|
|
|
2019-09-10 18:22:13 +03:00
|
|
|
for (int i = 0 ; i < paramsArray.size(); ++i) {
|
|
|
|
if (paramsArray[i][0] == '-') {
|
|
|
|
if (i < (paramsArray.size() - 1) && paramsArray[i + 1][0] != '-') {
|
|
|
|
params[paramsArray[i].mid(1)] = paramsArray[i + 1];
|
2018-09-29 15:56:04 +03:00
|
|
|
i++;
|
|
|
|
} else {
|
2020-04-04 15:42:56 +03:00
|
|
|
QuasarAppUtils::Params::log("Missing argument for " + paramsArray[i],
|
2020-04-04 18:17:26 +03:00
|
|
|
QuasarAppUtils::Error);
|
|
|
|
return false;
|
2018-09-29 15:56:04 +03:00
|
|
|
}
|
|
|
|
} else {
|
2019-09-10 18:22:13 +03:00
|
|
|
params[paramsArray[i]] = "";
|
2018-09-29 15:56:04 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2019-08-26 20:32:33 +03:00
|
|
|
QString Params::getStrArg(const QString& key, const QString &def) {
|
|
|
|
return params.value(key, def).toString();
|
2018-09-29 15:56:04 +03:00
|
|
|
}
|
|
|
|
|
2019-08-26 21:15:34 +03:00
|
|
|
QVariant Params::getArg(const QString& key,const QVariant& def) {
|
|
|
|
return params.value(key, def);
|
2018-09-29 15:56:04 +03:00
|
|
|
}
|
2019-02-02 16:01:28 +03:00
|
|
|
|
|
|
|
void Params::setArg(const QString &key, const QVariant &val) {
|
|
|
|
params.insert(key, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Params::setEnable(const QString &key, bool enable) {
|
|
|
|
if (enable) {
|
|
|
|
params.insert(key, "");
|
|
|
|
} else {
|
|
|
|
params.remove(key);
|
|
|
|
}
|
|
|
|
}
|