myxlib/src/myx/filesystem/paths.hpp

322 lines
11 KiB
C++
Raw Normal View History

2019-11-25 13:57:54 +00:00
/**
* @file paths.hpp
* @brief Стандартные пути к каталогам и файлам
*/
#ifndef MYX_FILESYSTEM_PATHS_HPP_
#define MYX_FILESYSTEM_PATHS_HPP_
#pragma once
2019-11-25 12:08:34 +00:00
#include <myx/filesystem/current_executable.hpp>
#include <QString>
#include <QDir>
#include <QFileInfo>
#include <atomic>
#include <future>
#include <mutex>
#include <thread>
namespace myx {
namespace filesystem {
class Paths
{
enum class HierarchyType : intptr_t
{
kSplit = 0x00,
kFlat = 0x01,
kOpt = 0x02,
kStandard = 0x04,
kUser = 0x08,
kHome = 0x10,
};
/// @brief Тип расположения файлов по каталогам
HierarchyType m_hierarchyType { HierarchyType::kFlat };
/// @brief Параметры текущего исполняемого файла
CurrentExecutable m_currentExecutable;
/// @brief Имя проекта, которое используется при формировании имён файлов и каталогов
QString m_projectName;
/// @brief Путь к каталогу с временными файлами
QDir m_tempDirectory;
/// @brief Путь к домашнему каталогу текущего пользователя
QDir m_homeDirectory;
/// @brief Путь к пользовательскому каталогу с изменяемыми файлами
QDir m_userVarDataDirectory;
/// @brief Путь к системному каталогу с изменяемыми файлами
QDir m_systemVarDataDirectory;
/// @brief Путь к пользовательскому каталогу с неизменяемыми файлами
QDir m_userConstDataDirectory;
/// @brief Путь к системному каталогу с неизменяемыми файлами
QDir m_systemConstDataDirectory;
/// @brief Путь к пользовательскому каталогу с журналами работы
QDir m_userLogDirectory;
/// @brief Путь к системному каталогу с журналами работы
QDir m_systemLogDirectory;
/// @brief Путь к пользовательскому каталогу с файлами настройки
QDir m_userConfigDirectory;
/// @brief Путь к системному каталогу с файлами настройки
QDir m_systemConfigDirectory;
/// @brief Полный путь к файлу настройки
QFileInfo m_configFilePath;
/// @brief Имя файла настройки
QString m_configFileName;
/// @brief Расширение для файла настройки
QString m_configFileExtension;
Paths();
~Paths() = default;
Paths( const Paths& ) = delete;
Paths& operator=( const Paths& ) = delete;
HierarchyType getHierarchyType();
static std::atomic< Paths* > m_instance;
static std::mutex m_mutex;
2019-11-25 12:08:34 +00:00
public:
2019-11-25 13:57:54 +00:00
/**
* @brief getInstance
* @return Уникальный экземпляр класса Paths
2019-11-25 13:57:54 +00:00
*/
static Paths* getInstance()
{
Paths* localInstance = m_instance.load( std::memory_order_acquire );
if ( !localInstance )
{
std::lock_guard< std::mutex > myLock( m_mutex );
localInstance = m_instance.load( std::memory_order_relaxed );
if ( !localInstance )
{
localInstance = new Paths();
m_instance.store( localInstance, std::memory_order_release );
}
}
return( localInstance );
}
/**
* @brief Обновление путей с учётом расположения исполняемого файла
*/
bool init( const QString& projectDir, const QString& configFileExtension = "conf" );
/**
* @brief Создание стандартных каталогов
*/
bool makeDefaultDirectories();
/**
* @brief Поиск существующего файла настойки.
* Поиск выполняется до тех пор пока не будет найден файл в следующем порядке:
* 1. Имя файла, указанное в качестве параметра функции
* 2. Имя файла, заданное переменной окружения вида PROJECT_NAME_CONFIG
* 3. Имя файла, полученное из внутренней переменной класса
* Если файл настройки не будет найден, то будет возвращена пустая строка
*/
QString findConfigFile( const QString& defaultConfigFile = "" );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к базовому каталогу
*/
const QDir& prefixDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к базовому каталогу
*/
void setPrefixDirectory( const QString& prefixDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к каталогу с исполняемым файлом
*/
QDir binaryDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к каталогу с исполняемым файлом
*/
void setBinaryDirectory( const QString& binaryDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к пользовательскому каталогу с файлами настройки
2019-11-25 13:57:54 +00:00
*/
const QDir& userConfigDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к пользовательскому каталогу с файлами настройки
2019-11-25 13:57:54 +00:00
*/
void setUserConfigDirectory( const QString& userConfigDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к системному каталогу с файлами настройки
2019-11-25 13:57:54 +00:00
*/
const QDir& systemConfigDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к системному каталогу с файлами настройки
2019-11-25 13:57:54 +00:00
*/
void setSystemConfigDirectory( const QString& systemConfigDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к локальному каталогу с файлами настройки
2019-11-25 13:57:54 +00:00
*/
const QDir& localConfigDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к локальному каталогу с файлами настройки
2019-11-25 13:57:54 +00:00
*/
void setLocalConfigDirectory( const QString& localConfigDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Полный путь к файлу настройки
2019-11-25 13:57:54 +00:00
*/
const QFileInfo& configFilePath() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка полного пути к файлу настройки
2019-11-25 13:57:54 +00:00
*/
void setConfigFilePath( const QFileInfo& configFilePath );
2019-11-25 13:57:54 +00:00
/**
* @brief Имя файла настройки
2019-11-25 13:57:54 +00:00
*/
const QString& configFileName() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка имени файла настройки
2019-11-25 13:57:54 +00:00
*/
void setConfigFileName( const QString& configFileName );
2019-11-25 13:57:54 +00:00
/**
* @brief Расширение у файла настройки
2019-11-25 13:57:54 +00:00
*/
const QString& configFileExtension() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка расширения у файла настройки
2019-11-25 13:57:54 +00:00
*/
void setConfigFileExtension( const QString& configFileExtension );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к пользовательскому каталогу с изменяемыми файлами
2019-11-25 13:57:54 +00:00
*/
const QDir& userVarDataDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к пользовательскому каталогу с изменяемыми файлами
2019-11-25 13:57:54 +00:00
*/
void setUserVarDataDirectory( const QString& userVarDataDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к системному каталогу с изменяемыми файлами
2019-11-25 13:57:54 +00:00
*/
const QDir& systemVarDataDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к системному каталогу с изменяемыми файлами
2019-11-25 13:57:54 +00:00
*/
void setSystemVarDataDirectory( const QString& systemVarDataDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к локальному каталогу с изменяемыми файлами
2019-11-25 13:57:54 +00:00
*/
const QDir& localVarDataDirectory() const;
2019-11-25 13:57:54 +00:00
/**
* @brief Установка пути к локальному каталогу с изменяемыми файлами
2019-11-25 13:57:54 +00:00
*/
void setLocalVarDataDirectory( const QString& localVarDataDirectory );
2019-11-25 13:57:54 +00:00
/**
* @brief Получение пути к пользовательскому каталогу с неизменяемыми файлами
2019-11-25 13:57:54 +00:00
*/
const QDir& userConstDataDirectory() const;
/**
* @brief Установка пути к пользовательскому каталогу с неизменяемыми файлами
*/
void setUserConstDataDirectory( const QString& userConstDataDirectory );
/**
* @brief Получение пути к системному каталогу с неизменяемыми файлами
*/
const QDir& systemConstDataDirectory() const;
/**
* @brief Установка пути к системному каталогу с неизменяемыми файлами
*/
void setSystemConstDataDirectory( const QString& systemConstDataDirectory );
/**
* @brief Получение пути к локальному каталогу с неизменяемыми файлами
*/
const QDir& localConstDataDirectory() const;
/**
* @brief Установка пути к локальному каталогу с неизменяемыми файлами
*/
void setLocalConstDataDirectory( const QString& localConstDataDirectory );
/**
* @brief Получение пути к пользовательскому каталогу с журналами работы
*/
const QDir& userLogDirectory() const;
/**
* @brief Установка пути к пользовательскому каталогу с журналами работы
*/
void setUserLogDirectory( const QString& userLogDirectory );
/**
* @brief Получение пути к системному каталогу с журналами работы
*/
const QDir& systemLogDirectory() const;
/**
* @brief Установка пути к системному каталогу с журналами работы
*/
void setSystemLogDirectory( const QString& systemLogDirectory );
/**
* @brief Получение пути к локальному каталогу с журналами работы
*/
const QDir& localLogDirectory() const;
/**
* @brief Установка пути к локальному каталогу с журналами работы
*/
void setLocalLogDirectory( const QString& localLogDirectory );
/**
* @brief Получение пути к каталогу с временными файлами
*/
const QDir& tempDirectory() const;
/**
* @brief Установка пути к каталогу с временными файлами
*/
void setTempDirectory( const QString& tempDirectory );
/**
* @brief Получение пути к домашнему каталогу текущего пользователя
*/
const QDir& homeDirectory() const;
/**
* @brief Имя подкаталога для проекта
*/
const QString& projectDirectoryName() const;
/**
* @brief Установка имени подкаталога для проекта
*/
void setProjectDirectoryName( const QString& projectDirectoryName );
/**
* @brief Имя исполняемого файла
*/
QString executableFileName() const;
/**
* @brief Полный путь к исполняемому файлу
*/
const QFileInfo& executableFilePath() const;
}; // class Paths
} // namespace filesystem
} // namespace myx
#endif // MYX_FILESYSTEM_PATHS_HPP_