deskflow/src/lib/gui/dotenv.cpp
Chris Rizzitello ed1217e9cc
Use Deskflow Name (#7519)
* Use Deskflow Name

* Remove business-oriented options from issue templates

* Remove business-oriented workflow

* Bump version to 3.0.0 (to avoid confusion with previously used version numbers 1.x & 2.x)

* Update readme to reflect new project name and goals

* Found some more "synergy" to rename

* Rename `synlib` to `app`

* Rename `syntool` to `deskflow-legacy`

* Rename `synwinhk` to `dfwhook`

* Rename dirs from synergy to deskflow

* Rename more "Synergy" files

* Rename app bundle ID

* Fixed copyright typo

* Rename only title in serial key dialog (to be moved downstream later)

* Preserve original serial key window for moving downstream

* Restore dialogs ready for moving downstream

* Rename `QDeskflowApplication` to `DeskflowApplication` (the Q is confusing)

* Restore Volker's original project name

* Fixed mimetype

* Fixed weird grammar

* Fixed (more) weird grammar

* Broken link, restoring (but we should move all links out of source)

* Broken link, restoring (but we should move all links out of source)

* Add write permission to valgrind-analysis.yml

* Restore AUR conflicts

* Apply Clang format

* Update ChangeLog

* Back out version change

---------

Co-authored-by: Nick Bolton <nick@symless.com>
2024-09-17 20:00:25 +01:00

117 lines
3.3 KiB
C++

/*
* Deskflow -- mouse and keyboard sharing utility
* Copyright (C) 2024 Symless Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package 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, see <http://www.gnu.org/licenses/>.
*/
#include "dotenv.h"
#include "paths.h"
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QProcess>
#include <QProcessEnvironment>
#include <QStandardPaths>
#include <QString>
#include <QTextStream>
namespace deskflow::gui {
QPair<QString, QString> getPair(const QString &line);
bool open(QFile &file, const QString &filePath) {
file.setFileName(filePath);
return file.open(QIODevice::ReadOnly | QIODevice::Text);
}
/**
* @brief A _very_ basic Qt .env file parser.
*
* This function re-invents the wheel to save adding a library dependency.
* It does not support many things that a proper .env parser would, such as
* trailing comments, escaping characters, multiline values, etc.
*
* If this function is not sufficient, replace it with a library such as:
* https://github.com/adeharo9/cpp-dotenv
*/
void dotenv(const QString &filename) {
QString filePath = filename;
QFile file;
if (!open(file, filePath)) {
QFileInfo fileInfo(filePath);
qInfo(
"no %s file in dir: %s", qPrintable(filename),
qPrintable(fileInfo.absolutePath()));
// if nothing in current dir, then try the config dir.
// this makes it a bit easier for engineers in the field to have an easily
// predictable location for the .env file.
const auto orgDir = paths::configDir();
filePath = orgDir.filePath(filename);
if (!open(file, filePath)) {
qInfo(
"no %s file in app config dir: %s", qPrintable(filename),
qPrintable(orgDir.absolutePath()));
return;
}
}
qInfo("loading env vars from: %s", qPrintable(filePath));
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if (line.startsWith('#'))
continue;
auto [key, value] = getPair(line);
if (key.isEmpty() || value.isEmpty())
continue;
const auto keyBytes = key.toUtf8();
const auto valueBytes = value.toUtf8();
const auto &key_c = keyBytes.constData();
const auto &value_c = valueBytes.constData();
qDebug("%s=%s", key_c, value_c);
qputenv(keyBytes, valueBytes);
}
}
QString stripQuotes(const QString &value) {
QString result = value;
if (result.startsWith('"') && result.endsWith('"')) {
result = result.mid(1, result.length() - 2);
}
return result;
}
QPair<QString, QString> getPair(const QString &line) {
auto pos = line.indexOf('=');
if (pos == -1) {
return QPair<QString, QString>("", "");
}
QString key = line.left(pos);
QString value = line.mid(pos + 1);
return QPair<QString, QString>(key.trimmed(), stripQuotes(value.trimmed()));
}
} // namespace deskflow::gui