myxlib/src/myx/filesystem/paths.hpp

322 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file paths.hpp
* @brief Стандартные пути к каталогам и файлам
*/
#ifndef MYX_FILESYSTEM_PATHS_HPP_
#define MYX_FILESYSTEM_PATHS_HPP_
#pragma once
#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;
public:
/**
* @brief getInstance
* @return Уникальный экземпляр класса Paths
*/
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 = "" );
/**
* @brief Получение пути к базовому каталогу
*/
const QDir& prefixDirectory() const;
/**
* @brief Установка пути к базовому каталогу
*/
void setPrefixDirectory( const QString& prefixDirectory );
/**
* @brief Получение пути к каталогу с исполняемым файлом
*/
QDir binaryDirectory() const;
/**
* @brief Установка пути к каталогу с исполняемым файлом
*/
void setBinaryDirectory( const QString& binaryDirectory );
/**
* @brief Получение пути к пользовательскому каталогу с файлами настройки
*/
const QDir& userConfigDirectory() const;
/**
* @brief Установка пути к пользовательскому каталогу с файлами настройки
*/
void setUserConfigDirectory( const QString& userConfigDirectory );
/**
* @brief Получение пути к системному каталогу с файлами настройки
*/
const QDir& systemConfigDirectory() const;
/**
* @brief Установка пути к системному каталогу с файлами настройки
*/
void setSystemConfigDirectory( const QString& systemConfigDirectory );
/**
* @brief Получение пути к локальному каталогу с файлами настройки
*/
const QDir& localConfigDirectory() const;
/**
* @brief Установка пути к локальному каталогу с файлами настройки
*/
void setLocalConfigDirectory( const QString& localConfigDirectory );
/**
* @brief Полный путь к файлу настройки
*/
const QFileInfo& configFilePath() const;
/**
* @brief Установка полного пути к файлу настройки
*/
void setConfigFilePath( const QFileInfo& configFilePath );
/**
* @brief Имя файла настройки
*/
const QString& configFileName() const;
/**
* @brief Установка имени файла настройки
*/
void setConfigFileName( const QString& configFileName );
/**
* @brief Расширение у файла настройки
*/
const QString& configFileExtension() const;
/**
* @brief Установка расширения у файла настройки
*/
void setConfigFileExtension( const QString& configFileExtension );
/**
* @brief Получение пути к пользовательскому каталогу с изменяемыми файлами
*/
const QDir& userVarDataDirectory() const;
/**
* @brief Установка пути к пользовательскому каталогу с изменяемыми файлами
*/
void setUserVarDataDirectory( const QString& userVarDataDirectory );
/**
* @brief Получение пути к системному каталогу с изменяемыми файлами
*/
const QDir& systemVarDataDirectory() const;
/**
* @brief Установка пути к системному каталогу с изменяемыми файлами
*/
void setSystemVarDataDirectory( const QString& systemVarDataDirectory );
/**
* @brief Получение пути к локальному каталогу с изменяемыми файлами
*/
const QDir& localVarDataDirectory() const;
/**
* @brief Установка пути к локальному каталогу с изменяемыми файлами
*/
void setLocalVarDataDirectory( const QString& localVarDataDirectory );
/**
* @brief Получение пути к пользовательскому каталогу с неизменяемыми файлами
*/
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_