mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-17 11:28:07 +00:00
369 lines
12 KiB
C++
369 lines
12 KiB
C++
/*
|
|
* Copyright (c) 2010-2024 Belledonne Communications SARL.
|
|
*
|
|
* This file is part of linphone-desktop
|
|
* (see https://www.linphone.org).
|
|
*
|
|
* 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <QCoreApplication>
|
|
#include <QDir>
|
|
#include <QStandardPaths>
|
|
#include <QtDebug>
|
|
|
|
#include "config.h"
|
|
|
|
#include "tool/Constants.hpp"
|
|
#include "tool/Utils.hpp"
|
|
|
|
#include "Paths.hpp"
|
|
|
|
// =============================================================================
|
|
|
|
static inline bool dirPathExists(const QString &path) {
|
|
QDir dir(path);
|
|
return dir.exists();
|
|
}
|
|
/*
|
|
static inline bool filePathExists (const QString &path, const bool& isWritable) {
|
|
QFileInfo info(path);
|
|
if (!dirPathExists(info.path()))
|
|
return false;
|
|
if( isWritable && !info.isWritable())
|
|
return false;
|
|
QFile file(path);
|
|
return file.exists();
|
|
}
|
|
*/
|
|
static inline void ensureDirPathExists(const QString &path) {
|
|
QDir dir(path);
|
|
if (!dir.exists() && !dir.mkpath(path)) qFatal("Unable to access at directory: `%s`", path.toStdString().c_str());
|
|
}
|
|
|
|
static inline void ensureFilePathExists(const QString &path) {
|
|
QFileInfo info(path);
|
|
ensureDirPathExists(info.path());
|
|
|
|
QFile file(path);
|
|
if (!file.exists() && !file.open(QIODevice::ReadWrite))
|
|
qFatal("Unable to access at path: `%s`", path.toStdString().c_str());
|
|
}
|
|
|
|
static inline QString getReadableDirPath(const QString &dirname) {
|
|
return QDir::toNativeSeparators(dirname);
|
|
}
|
|
|
|
static inline QString getWritableDirPath(const QString &dirname) {
|
|
ensureDirPathExists(dirname);
|
|
return getReadableDirPath(dirname);
|
|
}
|
|
|
|
static inline QString getReadableFilePath(const QString &filename) {
|
|
return QDir::toNativeSeparators(filename);
|
|
}
|
|
|
|
static inline QString getWritableFilePath(const QString &filename) {
|
|
ensureFilePathExists(filename);
|
|
return getReadableFilePath(filename);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// On Windows or Linux, the folders of the application are :
|
|
// bin/linphone
|
|
// lib/
|
|
// lib64/
|
|
// plugins/
|
|
// share/
|
|
|
|
// But in some cases, it can be :
|
|
// /linphone
|
|
// lib/
|
|
// lib64/
|
|
// share/
|
|
|
|
// On Mac, we have :
|
|
// Contents/
|
|
// Frameworks/
|
|
// MacOs/linphone
|
|
// Plugins/
|
|
// Resources/
|
|
// share/
|
|
|
|
static inline QDir getAppPackageDir() {
|
|
QDir dir(QCoreApplication::applicationDirPath());
|
|
if (dir.dirName() == QLatin1String("MacOS")) {
|
|
dir.cdUp();
|
|
} else if (!dir.exists("lib") && !dir.exists("lib64")) { // Check if these folders are in the current path
|
|
dir.cdUp();
|
|
if (!dir.exists("lib") && !dir.exists("lib64") && !dir.exists("plugins"))
|
|
qWarning() << "The application's location is not correct: You have to put your 'bin/' folder next to "
|
|
"'lib/' or 'plugins/' folder.";
|
|
}
|
|
return dir;
|
|
}
|
|
|
|
static inline QString getAppPackageDataDirPath() {
|
|
QDir dir = getAppPackageDir();
|
|
#ifdef __APPLE__
|
|
if (!dir.cd("Resources")) {
|
|
dir.mkdir("Resources");
|
|
dir.cd("Resources");
|
|
}
|
|
#endif
|
|
if (!dir.cd("share")) {
|
|
dir.mkdir("share");
|
|
dir.cd("share");
|
|
}
|
|
return dir.absolutePath();
|
|
}
|
|
|
|
static inline QString getAppPackageMsPluginsDirPath() {
|
|
QDir dir = getAppPackageDir();
|
|
dir.cd(MSPLUGINS_DIR);
|
|
return dir.absolutePath();
|
|
}
|
|
|
|
static inline QString getAppPackagePluginsDirPath() {
|
|
return getAppPackageDir().absolutePath() + Constants::PathPlugins;
|
|
}
|
|
|
|
static inline QString getAppBinDirPath() {
|
|
return getAppPackageDir().absolutePath() + Constants::PathBin;
|
|
}
|
|
|
|
static inline QString getAppAssistantConfigDirPath() {
|
|
return getAppPackageDataDirPath() + Constants::PathAssistantConfig;
|
|
}
|
|
|
|
static inline QString getAppConfigFilePath() {
|
|
return QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + Constants::PathConfig;
|
|
}
|
|
|
|
static inline QString getAppCallHistoryFilePath() {
|
|
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + Constants::PathCallHistoryList;
|
|
}
|
|
|
|
static inline QString getAppFactoryConfigFilePath() {
|
|
return getAppPackageDataDirPath() + Constants::PathFactoryConfig;
|
|
}
|
|
|
|
static inline QString getAppFriendsFilePath() {
|
|
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + Constants::PathFriendsList;
|
|
}
|
|
|
|
static inline QString getAppRootCaFilePath() {
|
|
QString rootca = getAppPackageDataDirPath() + Constants::PathRootCa;
|
|
if (Paths::filePathExists(rootca)) { // Packaged
|
|
return rootca;
|
|
} else {
|
|
lInfo() << "Root ca path does not exist. Create it";
|
|
QFileInfo rootcaInfo(rootca);
|
|
if (!rootcaInfo.absoluteDir().exists()) {
|
|
QDir dataDir(getAppPackageDataDirPath());
|
|
if (!dataDir.mkpath(Constants::PathRootCa)) {
|
|
lCritical() << "ERROR : COULD NOT CREATE DIRECTORY WITH PATH" << Constants::PathRootCa;
|
|
return "";
|
|
}
|
|
}
|
|
QFile rootCaFile(rootca);
|
|
if (rootCaFile.open(QIODevice::ReadWrite)) return rootca;
|
|
else {
|
|
lCritical() << "ERROR : COULD NOT CREATE ROOTCA WITH PATH" << rootca;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
static inline QString getAppMessageHistoryFilePath() {
|
|
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + Constants::PathMessageHistoryList;
|
|
}
|
|
|
|
static inline QString getAppPluginsDirPath() {
|
|
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + Constants::PathPlugins;
|
|
}
|
|
// -----------------------------------------------------------------------------
|
|
|
|
bool Paths::filePathExists(const QString &path, const bool isWritable) {
|
|
QFileInfo info(path);
|
|
if (!dirPathExists(info.path())) return false;
|
|
if (isWritable && !info.isWritable()) return false;
|
|
QFile file(path);
|
|
return file.exists();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
QString Paths::getAppLocalDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/");
|
|
}
|
|
|
|
QString Paths::getAssistantConfigDirPath() {
|
|
return "://data/assistant/";
|
|
}
|
|
|
|
QString Paths::getAvatarsDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathAvatars);
|
|
}
|
|
|
|
QString Paths::getVCardsPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathVCards);
|
|
}
|
|
|
|
QString Paths::getCallHistoryFilePath() {
|
|
return getWritableFilePath(getAppCallHistoryFilePath());
|
|
}
|
|
|
|
QString Paths::getCapturesDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) +
|
|
Constants::PathCaptures);
|
|
}
|
|
|
|
QString Paths::getCodecsDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathCodecs);
|
|
}
|
|
|
|
QString Paths::getConfigDirPath(bool writable) {
|
|
return writable ? getWritableFilePath(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) +
|
|
QDir::separator())
|
|
: getReadableFilePath(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) +
|
|
QDir::separator());
|
|
}
|
|
|
|
QString Paths::getConfigFilePath(const QString &configPath, bool writable) {
|
|
QString path;
|
|
if (!configPath.isEmpty()) {
|
|
QFileInfo file(configPath);
|
|
if (!writable &&
|
|
(!file.exists() || !file.isFile())) { // This file cannot be found. Check if it exists in standard folder
|
|
QString defaultConfigPath = getConfigDirPath(false);
|
|
file = QFileInfo(defaultConfigPath + QDir::separator() + configPath);
|
|
if (!file.exists() || !file.isFile()) path = "";
|
|
else path = file.absoluteFilePath();
|
|
} else path = file.absoluteFilePath();
|
|
} else path = getAppConfigFilePath();
|
|
return writable ? getWritableFilePath(path) : getReadableFilePath(path);
|
|
}
|
|
|
|
QString Paths::getDatabaseFilePath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)) +
|
|
Constants::PathDatabase;
|
|
}
|
|
|
|
QString Paths::getFactoryConfigFilePath() {
|
|
return getReadableFilePath(getAppFactoryConfigFilePath());
|
|
}
|
|
|
|
QString Paths::getFriendsListFilePath() {
|
|
return getReadableFilePath(getAppFriendsFilePath());
|
|
}
|
|
|
|
QString Paths::getDownloadDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathFiles);
|
|
}
|
|
|
|
QString Paths::getLimeDatabasePath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)) +
|
|
Constants::PathLimeDatabase;
|
|
}
|
|
|
|
QString Paths::getLogsDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathLogs);
|
|
}
|
|
|
|
QString Paths::getCrashpadDirPath() {
|
|
#ifdef HAVE_CRASH_HANDLER
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathCrashpad);
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
QString Paths::getMetricsDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathMetrics);
|
|
}
|
|
|
|
QString Paths::getMessageHistoryFilePath() {
|
|
return getReadableFilePath(
|
|
getAppMessageHistoryFilePath()); // No need to ensure that the file exists as this DB is deprecated
|
|
}
|
|
|
|
QString Paths::getPackageDataDirPath() {
|
|
return getReadableDirPath(getAppPackageDataDirPath() + Constants::PathData);
|
|
}
|
|
|
|
QString Paths::getPackageMsPluginsDirPath() {
|
|
return getReadableDirPath(getAppPackageMsPluginsDirPath());
|
|
}
|
|
|
|
QString Paths::getPackagePluginsAppDirPath() {
|
|
return getReadableDirPath(getAppPackagePluginsDirPath() + Constants::PathPluginsApp);
|
|
}
|
|
|
|
QString Paths::getPackageSoundsResourcesDirPath() {
|
|
return getReadableDirPath(getAppPackageDataDirPath() + Constants::PathSounds);
|
|
}
|
|
|
|
QString Paths::getPackageTopDirPath() {
|
|
return getReadableDirPath(getAppPackageDataDirPath());
|
|
}
|
|
|
|
QString Paths::getPluginsAppDirPath() {
|
|
return getWritableDirPath(getAppPluginsDirPath() + Constants::PathPluginsApp);
|
|
}
|
|
|
|
QStringList Paths::getPluginsAppFolders() {
|
|
QStringList pluginPaths;
|
|
pluginPaths << Paths::getPluginsAppDirPath();
|
|
pluginPaths << Paths::getPackagePluginsAppDirPath();
|
|
return pluginPaths;
|
|
}
|
|
|
|
QString Paths::getRootCaFilePath() {
|
|
return getReadableFilePath(getAppRootCaFilePath());
|
|
}
|
|
|
|
QString Paths::getToolsDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathTools);
|
|
}
|
|
QString Paths::getUserCertificatesDirPath() {
|
|
return getWritableDirPath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathUserCertificates);
|
|
}
|
|
|
|
QString Paths::getZrtpSecretsFilePath() {
|
|
return getWritableFilePath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) +
|
|
Constants::PathZrtpSecrets);
|
|
}
|
|
|
|
QString Paths::getCrashpadHandlerFilePath() {
|
|
#ifdef HAVE_CRASH_HANDLER
|
|
return getAppBinDirPath() + Constants::PathCrashpadHandler;
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void Paths::migrate() {
|
|
}
|