250 lines
9.3 KiB
C++
250 lines
9.3 KiB
C++
/**
|
||
* @file paths.hpp
|
||
* @brief Стандартные пути к каталогам и файлам
|
||
*/
|
||
|
||
#ifndef MYX_FILESYSTEM_PATHS_HPP_
|
||
#define MYX_FILESYSTEM_PATHS_HPP_
|
||
|
||
#pragma once
|
||
|
||
#include <myx/core/config.hpp>
|
||
|
||
#include <QDir>
|
||
#include <QFileInfo>
|
||
#include <QString>
|
||
|
||
namespace myx {
|
||
|
||
namespace filesystem {
|
||
|
||
/// @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам
|
||
class Paths
|
||
{
|
||
enum class HierarchyType : intptr_t
|
||
{
|
||
/// @brief Тип расположения файлов не определён
|
||
kUndefined = 0x00,
|
||
/// @brief Не определено ни одно из типовых размещений файлов
|
||
/// @details Если исполняемый файл не находится в каталоге bin или не найдены
|
||
/// необходимые сопутствующие каталоги, то предполается,
|
||
/// что все файлы находятся в одном каталоге с исполняемым файлом
|
||
kFlat = 0x01,
|
||
/// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /opt
|
||
kOpt = 0x02,
|
||
/// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr
|
||
kUsr = 0x03,
|
||
/// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local
|
||
kUsrLocal = 0x04,
|
||
/// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local/rtis (используется для работ в проекте Сирена)
|
||
kUsrLocalRtis = 0x05,
|
||
/// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /home
|
||
kHome = 0x06,
|
||
/// @brief Исполняемый файл и сопутствующие каталоги находятся в каталоге программного проекта
|
||
kDevelopment = 0x07
|
||
};
|
||
|
||
public:
|
||
Paths( const Paths& ) = delete;
|
||
Paths& operator=( const Paths& ) = delete;
|
||
Paths( Paths&& ) = delete;
|
||
Paths& operator=( Paths&& ) = delete;
|
||
|
||
/**
|
||
* @brief getInstance
|
||
* @return Уникальный экземпляр класса Paths
|
||
*/
|
||
static Paths& instance()
|
||
{
|
||
static Paths sPaths;
|
||
return( sPaths );
|
||
}
|
||
|
||
/**
|
||
* @brief Обновление путей с учётом расположения исполняемого файла
|
||
*/
|
||
bool init();
|
||
|
||
/**
|
||
* @brief Обновление путей с учётом расположения исполняемого файла
|
||
* @param configFileName Имя файла настроек
|
||
*/
|
||
bool init( const QString& configFileName );
|
||
|
||
/**
|
||
* @brief Обновление путей с учётом расположения исполняемого файла
|
||
* @param projectName Имя проекта
|
||
* @param configFileExtension Расширение для файла настроек
|
||
*/
|
||
bool init( const QString& projectName, const QString& configFileExtension );
|
||
|
||
/**
|
||
* @brief Создание стандартных каталогов
|
||
*/
|
||
bool makeDefaultSystemDirectories();
|
||
bool makeDefaultUserDirectories();
|
||
bool makeDefaultDirectories();
|
||
|
||
/**
|
||
* @brief Поиск существующего файла настойки.
|
||
* Поиск выполняется до тех пор пока не будет найден файл в следующем порядке:
|
||
* 1. Имя файла, указанное в качестве параметра функции
|
||
* 2. Имя файла, заданное переменной окружения вида PROJECT_NAME_CONFIG
|
||
* 3. Имя файла, полученное из внутренней переменной класса
|
||
* Если файл настройки не будет найден, то будет возвращена пустая строка
|
||
*/
|
||
QString findConfigFile( const QString& defaultConfigFile = QLatin1String("") );
|
||
|
||
/**
|
||
* @brief Полный путь к базовому каталогу
|
||
*/
|
||
const QString& prefixDirectory() const;
|
||
|
||
/**
|
||
* @brief Имя исполняемого файла
|
||
*/
|
||
const QString& executableName() const;
|
||
|
||
/**
|
||
* @brief Полный путь к исполняемому файлу
|
||
*/
|
||
const QString& executableFilePath() const;
|
||
|
||
/**
|
||
* @brief Полный путь к каталогу с исполняемым файлом
|
||
*/
|
||
const QString& executableDirectory() const;
|
||
|
||
/**
|
||
* @brief Имя файла настройки
|
||
*/
|
||
const QString& configFileName() const;
|
||
|
||
/**
|
||
* @brief Расширение у файла настройки
|
||
*/
|
||
const QString& configFileExtension() const;
|
||
|
||
/**
|
||
* @brief Полный путь к файлу настройки
|
||
*/
|
||
const QString& configFilePath() const;
|
||
|
||
/**
|
||
* @brief Полный путь к пользовательскому каталогу с файлами настройки
|
||
*/
|
||
const QString& userConfigDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к системному каталогу с файлами настройки
|
||
*/
|
||
const QString& systemConfigDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к пользовательскому каталогу с изменяемыми файлами
|
||
*/
|
||
const QString& userVarDataDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к системному каталогу с изменяемыми файлами
|
||
*/
|
||
const QString& systemVarDataDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к пользовательскому каталогу с неизменяемыми файлами
|
||
*/
|
||
const QString& userConstDataDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к системному каталогу с неизменяемыми файлами
|
||
*/
|
||
const QString& systemConstDataDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к пользовательскому каталогу с журналами работы
|
||
*/
|
||
const QString& userLogDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к системному каталогу с журналами работы
|
||
*/
|
||
const QString& systemLogDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к каталогу с временными файлами
|
||
*/
|
||
const QString& tempDirectory() const;
|
||
|
||
/**
|
||
* @brief Полный путь к домашнему каталогу текущего пользователя
|
||
*/
|
||
const QString& homeDirectory() const;
|
||
|
||
/**
|
||
* @brief Имя подкаталога для проекта
|
||
*/
|
||
const QString& projectName() const;
|
||
|
||
protected:
|
||
Paths();
|
||
~Paths() = default;
|
||
|
||
private:
|
||
/// @brief Тип расположения файлов по каталогам
|
||
HierarchyType m_hierarchyType { HierarchyType::kFlat };
|
||
|
||
/// @brief Имя проекта, которое используется при формировании имён файлов и каталогов
|
||
QString m_projectName;
|
||
|
||
QString m_executableName;
|
||
QString m_executableFilePath;
|
||
QString m_executableDirectory;
|
||
|
||
/// @brief Общий префикс для файлов проекта
|
||
QString m_prefixDirectory;
|
||
|
||
/// @brief Путь к каталогу с временными файлами
|
||
QString m_tempDirectory;
|
||
/// @brief Путь к домашнему каталогу текущего пользователя
|
||
QString m_homeDirectory;
|
||
|
||
/// @brief Путь к пользовательскому каталогу с изменяемыми файлами
|
||
QString m_userVarDataDirectory;
|
||
/// @brief Путь к системному каталогу с изменяемыми файлами
|
||
QString m_systemVarDataDirectory;
|
||
|
||
/// @brief Путь к пользовательскому каталогу с неизменяемыми файлами
|
||
QString m_userConstDataDirectory;
|
||
/// @brief Путь к системному каталогу с неизменяемыми файлами
|
||
QString m_systemConstDataDirectory;
|
||
|
||
/// @brief Путь к пользовательскому каталогу с журналами работы
|
||
QString m_userLogDirectory;
|
||
/// @brief Путь к системному каталогу с журналами работы
|
||
QString m_systemLogDirectory;
|
||
|
||
/// @brief Путь к пользовательскому каталогу с файлами настройки
|
||
QString m_userConfigDirectory;
|
||
/// @brief Путь к системному каталогу с файлами настройки
|
||
QString m_systemConfigDirectory;
|
||
|
||
/// @brief Полный путь к файлу настройки
|
||
QString m_configFilePath;
|
||
/// @brief Имя файла настройки
|
||
QString m_configFileName;
|
||
|
||
void setupSystemDirectories( const QString& defaultPrefixDirectory,
|
||
const QString& defaultEtcDirectory,
|
||
const QString& defaultConstDataDirectory,
|
||
const QString& defaultVarDataDirectory,
|
||
const QString& defaultLogDirectory );
|
||
bool initCommon();
|
||
HierarchyType getHierarchyType();
|
||
}; // class Paths
|
||
|
||
} // namespace filesystem
|
||
|
||
} // namespace myx
|
||
|
||
#endif // MYX_FILESYSTEM_PATHS_HPP_
|