/** * @file paths.hpp * @brief Стандартные пути к каталогам и файлам */ #ifndef MYX_FILESYSTEM_PATHS_HPP_ #define MYX_FILESYSTEM_PATHS_HPP_ #pragma once #include #include #include #include #include #include #include #include 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_