From c1c0325bce727730adfacf9c448d634cdcebcbbf Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Mon, 7 Jun 2021 16:49:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/myx/filesystem/paths.cpp | 217 ++++++++++++++++++++--------------- src/myx/filesystem/paths.hpp | 214 ++++++++++++++-------------------- 2 files changed, 208 insertions(+), 223 deletions(-) diff --git a/src/myx/filesystem/paths.cpp b/src/myx/filesystem/paths.cpp index 1fed4db..31f296e 100644 --- a/src/myx/filesystem/paths.cpp +++ b/src/myx/filesystem/paths.cpp @@ -8,13 +8,19 @@ #include #include + +#ifndef QT_NO_DEBUG #include +#endif namespace myx { namespace filesystem { -MYXLIB_INLINE Paths::Paths() +MYXLIB_INLINE Paths::Paths() : + m_configFileExtension( ".conf" ), + m_binDirRegex ( "/s*bin$" ), + m_unityBinDirRegex ( "/bin/unity$" ) { QFileInfo procSelfExe( QStringLiteral( "/proc/self/exe" ) ); QFileInfo currentExecutable = procSelfExe.canonicalFilePath(); @@ -24,6 +30,57 @@ MYXLIB_INLINE Paths::Paths() } +MYXLIB_INLINE bool Paths::init() +{ + m_configFileName = m_executableName + m_configFileExtension; + return( initCommon() ); +} + + +//MYXLIB_INLINE bool Paths::init( const QString& configFileName ) +//{ +// m_configFileName = configFileName; +// return( initCommon() ); +//} + + +//MYXLIB_INLINE bool Paths::init( const QString& projectName, const QString& configFileExtension ) +//{ +// m_projectName = projectName.isEmpty() ? m_executableName +// : projectName; +// auto ext = configFileExtension.isEmpty() ? QStringLiteral( "conf" ) +// : configFileExtension; +// m_configFileName = m_projectName + "." + ext; +// return( initCommon() ); +//} + + +MYXLIB_INLINE bool Paths::initCommon() +{ + m_homeDirectory = QDir::homePath(); + m_tempDirectory = QDir::tempPath(); + + m_configDirectory = QString::fromLocal8Bit( qgetenv( "XDG_CONFIG_HOME" ) ); + if ( m_configDirectory.isEmpty() ) + { + m_configDirectory = m_homeDirectory + "/.config"; + } + + m_dataDirectory = QString::fromLocal8Bit( qgetenv( "XDG_DATA_HOME" ) ); + if ( m_dataDirectory.isEmpty() ) + { + m_dataDirectory = m_homeDirectory + "/.local/share"; + } + + m_hierarchyType = getHierarchyType(); + calculatePaths( m_hierarchyType ); + + m_configFilePath = m_systemConfigDirectory + "/" + m_configFileName; + + return( true ); +} // Paths::initCommon + + MYXLIB_INLINE void Paths::setupSystemDirectories( const QString& defaultProjectDirectory, const QString& defaultEtcDirectory, const QString& defaultConstDataDirectory, @@ -82,43 +139,49 @@ MYXLIB_INLINE void Paths::setupSystemDirectories( const QString& defaultProjectD } // Paths::setupSystemDirectories +MYXLIB_INLINE void Paths::setupUserDirectories( const QString& prefix ) +{ + m_userConfigDirectory = m_configDirectory + "/" + prefix; + m_userConstDataDirectory = m_dataDirectory + "/" + prefix + "/share"; + m_userVarDataDirectory = m_dataDirectory + "/" + prefix + "/var"; + m_userLogDirectory = m_dataDirectory + "/" + prefix + "/log"; +} + + MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType() { - QRegExp binUnityRegexp( "/s*bin/unity$" ); - if ( binUnityRegexp.indexIn( m_executableDirectory ) >= 0 ) + if ( m_unityBinDirRegex.match( m_executableDirectory ).hasMatch() ) { return ( HierarchyType::kDevelopment ); } - QRegExp binRegexp( "/s*bin$" ); - if ( binRegexp.indexIn( m_executableDirectory ) == -1 ) + if ( !m_binDirRegex.match( m_executableDirectory ).hasMatch() ) { return ( HierarchyType::kFlat ); } - QRegExp optRegexp( "^/opt(/|/.+/)" ); - if ( optRegexp.indexIn( m_executableDirectory ) >= 0 ) + if ( m_executableDirectory.startsWith( QStringLiteral( "/opt/" ) ) ) { return ( HierarchyType::kOpt ); } - if ( m_executableDirectory.startsWith( QStringLiteral( "/usr/local/bin" ) ) ) + if ( m_executableDirectory.startsWith( QStringLiteral( "/usr/local/bin/" ) ) ) { return ( HierarchyType::kUsrLocal ); } - if ( m_executableDirectory.startsWith( QStringLiteral( "/usr/local" ) ) ) + if ( m_executableDirectory.startsWith( QStringLiteral( "/usr/local/" ) ) ) { return ( HierarchyType::kUsrLocalOrg ); } - if ( m_executableDirectory.startsWith( QStringLiteral( "/usr/bin" ) ) ) + if ( m_executableDirectory.startsWith( QStringLiteral( "/usr/bin/" ) ) ) { return ( HierarchyType::kUsr ); } - if ( m_executableDirectory.startsWith( m_homeDirectory + "/.local/bin" ) || - m_executableDirectory.startsWith( m_homeDirectory + "/bin" ) ) + if ( m_executableDirectory.startsWith( m_homeDirectory + "/.local/bin/" ) || + m_executableDirectory.startsWith( m_homeDirectory + "/bin/" ) ) { return( HierarchyType::kHome ); } @@ -129,150 +192,102 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType() MYXLIB_INLINE void Paths::calculatePaths( HierarchyType hType ) { - QRegExp binUnityRegexp( "/s*bin/unity$" ); - QRegExp binRegexp( "/s*bin$" ); auto directory = m_executableDirectory; switch ( hType ) { case HierarchyType::kFlat: - m_projectDirectory = m_executableDirectory; - m_systemConstDataDirectory = m_executableDirectory; - m_systemVarDataDirectory = m_executableDirectory; - m_systemConfigDirectory = m_executableDirectory; - m_systemLogDirectory = m_executableDirectory; - break; + setupSystemDirectories( directory, directory, directory, directory, directory ); + return; + case HierarchyType::kOpt: if ( m_organizationName.isEmpty() || m_themeName.isEmpty() ) { - QRegExp parse( "opt/(.+)-(.+)/" ); - parse.setMinimal( true ); - if ( parse.indexIn( m_executableDirectory ) ) + QRegularExpression regex( "^/opt/(.+?)-(.+?)/" ); + QRegularExpressionMatch match = regex.match( m_executableDirectory ); + if ( match.hasMatch() ) { - m_organizationName = parse.cap( 1 ); - m_themeName = parse.cap( 2 ); + m_organizationName = match.captured( 1 ); + m_themeName = match.captured( 2 ); + + QRegularExpression vr( "(.+?)\\.(.+)" ); + QRegularExpressionMatch vm = vr.match( m_themeName ); + if ( vm.hasMatch() ) + { + m_themeName = vm.captured( 1 ); + m_version = vm.captured( 2 ); + } } } if ( m_projectName.isEmpty() ) { - QRegExp parse( "opt/.+/(.+)/" ); - parse.setMinimal( true ); - if ( parse.indexIn( m_executableDirectory ) ) + QRegularExpression regex( "^/opt/.+/(.+?)/" ); + QRegularExpressionMatch match = regex.match( m_executableDirectory ); + if ( match.hasMatch() ) { - m_projectName = parse.cap( 1 ); + m_projectName = match.captured( 1 ); } } - qDebug() << m_organizationName; - qDebug() << m_themeName; - qDebug() << m_projectName; - directory.remove( binRegexp ); + directory.remove( m_binDirRegex ); setupSystemDirectories( directory, directory + "/etc", directory + "/share", directory + "/var", directory + "/log" ); + setupUserDirectories( m_organizationName + "-" + m_themeName + "/" + m_projectName ); + return; - break; case HierarchyType::kUsr: setupSystemDirectories( QStringLiteral( "/usr" ), "/etc/" + m_projectName, "/usr/share/" + m_projectName, "/var/lib/" + m_projectName, "/var/log/" + m_projectName ); - break; + return; + case HierarchyType::kUsrLocal: setupSystemDirectories( QStringLiteral( "/usr/local" ), "/usr/local/etc/" + m_projectName, "/usr/local/share/" + m_projectName, "/var/lib/" + m_projectName, "/var/log/" + m_projectName ); + return; - break; case HierarchyType::kUsrLocalOrg: - directory.remove( QRegExp( "/bin$" ) ); + directory.remove( m_binDirRegex ); setupSystemDirectories( directory, directory + "/etc", directory + "/share", directory + "/var", directory + "/log" ); + return; - break; case HierarchyType::kHome: m_projectDirectory = m_homeDirectory; m_systemConfigDirectory = m_userConfigDirectory; m_systemConstDataDirectory = m_userConstDataDirectory; m_systemVarDataDirectory = m_userVarDataDirectory; m_systemLogDirectory = m_userLogDirectory; - break; + return; + case HierarchyType::kDevelopment: - directory.remove( binUnityRegexp ); - directory.remove( binRegexp ); + directory.remove( m_unityBinDirRegex ); + directory.remove( m_binDirRegex ); setupSystemDirectories( directory, directory + "/etc", directory + "/share", directory + "/var", directory + "/log" ); + return; - break; case HierarchyType::kUndefined: ; } // switch } // Paths::calculatePaths -MYXLIB_INLINE bool Paths::initCommon() -{ - m_homeDirectory = QDir::homePath(); - m_tempDirectory = QDir::tempPath(); - - m_configDirectory = QString::fromLocal8Bit( qgetenv( "XDG_CONFIG_HOME" ) ); - if ( m_configDirectory.isEmpty() ) - { - m_configDirectory = m_homeDirectory + "/.config"; - } - - m_dataDirectory = QString::fromLocal8Bit( qgetenv( "XDG_DATA_HOME" ) ); - if ( m_dataDirectory.isEmpty() ) - { - m_dataDirectory = m_homeDirectory + "/.local/share"; - } - - m_hierarchyType = getHierarchyType(); - calculatePaths( m_hierarchyType ); - - m_configFilePath = m_systemConfigDirectory + "/" + m_configFileName; - - return( true ); -} // Paths::updatePaths - - -MYXLIB_INLINE bool Paths::init() -{ - m_configFileName = m_executableName + ".conf"; - return( initCommon() ); -} - - -MYXLIB_INLINE bool Paths::init( const QString& configFileName ) -{ - m_configFileName = configFileName; - return( initCommon() ); -} - - -MYXLIB_INLINE bool Paths::init( const QString& projectName, const QString& configFileExtension ) -{ - m_projectName = projectName.isEmpty() ? m_executableName - : projectName; - auto ext = configFileExtension.isEmpty() ? QStringLiteral( "conf" ) - : configFileExtension; - m_configFileName = m_projectName + "." + ext; - return( initCommon() ); -} - - MYXLIB_INLINE bool Paths::makeDefaultSystemDirectories() { bool status = true; @@ -356,6 +371,18 @@ MYXLIB_INLINE const QString& Paths::configFileName() const } +const QString& Paths::configFileExtension() const +{ + return( m_configFileExtension ); +} + + +void Paths::setConfigFileExtension( const QString& name ) +{ + m_configFileExtension = name; +} + + MYXLIB_INLINE const QString& Paths::userVarDataDirectory() const { return( m_userVarDataDirectory ); @@ -416,7 +443,7 @@ MYXLIB_INLINE const QString& Paths::organizationName() const } -MYXLIB_INLINE void Paths::setOrganizationName( QString name ) +MYXLIB_INLINE void Paths::setOrganizationName( const QString& name ) { m_organizationName = name; } @@ -428,7 +455,7 @@ MYXLIB_INLINE const QString& Paths::themeName() const } -MYXLIB_INLINE void Paths::setThemeName( QString name ) +MYXLIB_INLINE void Paths::setThemeName( const QString& name ) { m_themeName = name; } diff --git a/src/myx/filesystem/paths.hpp b/src/myx/filesystem/paths.hpp index a393508..eb2a23a 100644 --- a/src/myx/filesystem/paths.hpp +++ b/src/myx/filesystem/paths.hpp @@ -1,7 +1,6 @@ -/** - * @file paths.hpp - * @brief Стандартные пути к каталогам и файлам - */ +/** @file paths.hpp + * @brief Стандартные пути к каталогам и файлам + */ #ifndef MYX_FILESYSTEM_PATHS_HPP_ #define MYX_FILESYSTEM_PATHS_HPP_ @@ -12,35 +11,37 @@ #include #include +#include #include namespace myx { namespace filesystem { -/// @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам +/** @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам */ class Paths { enum class HierarchyType : intptr_t { - /// @brief Тип расположения файлов не определён + /** @brief Тип расположения файлов не определён */ kUndefined = 0x00, - /// @brief Не определено ни одно из типовых размещений файлов - /// @details Если исполняемый файл не находится в каталоге bin или не найдены - /// необходимые сопутствующие каталоги, то предполается, - /// что все файлы находятся в одном каталоге с исполняемым файлом + /** @brief Не определено ни одно из типовых размещений файлов + * @details Если исполняемый файл не находится в каталоге bin или не найдены + * необходимые сопутствующие каталоги, то предполается, + * что все файлы находятся в одном каталоге с исполняемым файлом + */ kFlat = 0x01, - /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /opt + /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /opt */ kOpt = 0x02, - /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr + /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии / usr */ kUsr = 0x03, - /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local + /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local */ kUsrLocal = 0x04, - /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local/ORG (используется для работ в проекте Сирена) + /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local/ORG (используется для работ в проекте Сирена) */ kUsrLocalOrg = 0x05, - /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /home + /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /home */ kHome = 0x06, - /// @brief Исполняемый файл и сопутствующие каталоги находятся в каталоге программного проекта + /** @brief Исполняемый файл и сопутствующие каталоги находятся в каталоге программного проекта */ kDevelopment = 0x07 }; @@ -60,214 +61,171 @@ public: return( sPaths ); } - /** - * @brief Обновление путей с учётом расположения исполняемого файла - */ + /** @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 Создание стандартных каталогов - */ + /** @brief Создание стандартных системных каталогов */ bool makeDefaultSystemDirectories(); + + /** @brief Создание стандартных пользовательских каталогов */ bool makeDefaultUserDirectories(); + + /** @brief Создание стандартных каталогов */ bool makeDefaultDirectories(); - /** - * @brief Поиск существующего файла настойки. - * Поиск выполняется до тех пор пока не будет найден файл в следующем порядке: - * 1. Имя файла, указанное в качестве параметра функции - * 2. Имя файла, заданное переменной окружения вида PROJECT_NAME_CONFIG - * 3. Имя файла, полученное из внутренней переменной класса - * Если файл настройки не будет найден, то будет возвращена пустая строка + /** @brief Поиск существующего файла настойки. + * Поиск выполняется до тех пор пока не будет найден файл в следующем порядке: + * 1. Имя файла, указанное в качестве параметра функции + * 2. Имя файла, заданное переменной окружения вида PROJECT_NAME_CONFIG + * 3. Имя файла, полученное из внутренней переменной класса + * Если файл настройки не будет найден, то будет возвращена пустая строка */ - QString findConfigFile( const QString& defaultConfigFile = QLatin1String("") ); + QString findConfigFile( const QString& defaultConfigFile = QLatin1String( "" ) ); - /** - * @brief Полный путь к базовому каталогу - */ + /** @brief Полный путь к базовому каталогу */ const QString& projectName() const; - /** - * @brief Имя исполняемого файла - */ + /** @brief Имя исполняемого файла */ const QString& executableName() const; - /** - * @brief Полный путь к исполняемому файлу - */ + /** @brief Полный путь к исполняемому файлу */ const QString& executableFilePath() const; - /** - * @brief Полный путь к каталогу с исполняемым файлом - */ + /** @brief Полный путь к каталогу с исполняемым файлом */ const QString& executableDirectory() const; - /** - * @brief Имя файла настройки - */ + /** @brief Имя файла настройки */ const QString& configFileName() const; - /** - * @brief Расширение у файла настройки - */ + /** @brief Расширение файла настройки */ const QString& configFileExtension() const; - /** - * @brief Полный путь к файлу настройки - */ + /** @brief Установка расширения файла настройки */ + void setConfigFileExtension( const QString& name ); + + /** @brief Полный путь к файлу настройки */ const QString& configFilePath() const; - /** - * @brief Полный путь к пользовательскому каталогу с файлами настройки - */ + /** @brief Полный путь к пользовательскому каталогу с файлами настройки */ const QString& userConfigDirectory() const; - /** - * @brief Полный путь к системному каталогу с файлами настройки - */ + /** @brief Полный путь к системному каталогу с файлами настройки */ const QString& systemConfigDirectory() const; - /** - * @brief Полный путь к пользовательскому каталогу с изменяемыми файлами - */ + /** @brief Полный путь к пользовательскому каталогу с изменяемыми файлами */ const QString& userVarDataDirectory() const; - /** - * @brief Полный путь к системному каталогу с изменяемыми файлами - */ + /** @brief Полный путь к системному каталогу с изменяемыми файлами */ const QString& systemVarDataDirectory() const; - /** - * @brief Полный путь к пользовательскому каталогу с неизменяемыми файлами - */ + /** @brief Полный путь к пользовательскому каталогу с неизменяемыми файлами */ const QString& userConstDataDirectory() const; - /** - * @brief Полный путь к системному каталогу с неизменяемыми файлами - */ + /** @brief Полный путь к системному каталогу с неизменяемыми файлами */ const QString& systemConstDataDirectory() const; - /** - * @brief Полный путь к пользовательскому каталогу с журналами работы - */ + /** @brief Полный путь к пользовательскому каталогу с журналами работы */ const QString& userLogDirectory() const; - /** - * @brief Полный путь к системному каталогу с журналами работы - */ + /** @brief Полный путь к системному каталогу с журналами работы */ const QString& systemLogDirectory() const; - /** - * @brief Полный путь к каталогу с временными файлами - */ + /** @brief Полный путь к каталогу с временными файлами */ const QString& tempDirectory() const; - /** - * @brief Полный путь к домашнему каталогу текущего пользователя - */ + /** @brief Полный путь к домашнему каталогу текущего пользователя */ const QString& homeDirectory() const; - /** - * @brief Имя каталога для работы (темы) - */ + /** @brief Имя каталога для работы (темы) */ const QString& themeDirectory() const; - /** - * @brief Имя каталога для проекта - */ + /** @brief Имя каталога для проекта */ const QString& projectDirectory() const; - /** - * @brief Название организации - */ + /** @brief Название организации */ const QString& organizationName() const; - void setOrganizationName( QString name ); + void setOrganizationName( const QString& name ); - /** - * @brief Название работы (темы) - */ + /** @brief Название работы (темы) */ const QString& themeName() const; - void setThemeName( QString name ); + void setThemeName( const QString& name ); protected: Paths(); ~Paths() = default; private: - /// @brief Тип расположения файлов по каталогам + /** @brief Тип расположения файлов по каталогам */ HierarchyType m_hierarchyType { HierarchyType::kFlat }; - /// @brief Название организации + /** @brief Название организации */ QString m_organizationName; - /// @brief Название работы (темы) + /** @brief Название работы (темы) */ QString m_themeName; - /// @brief Имя проекта, которое используется при формировании имён файлов и каталогов + /** @brief Номер версии установленного пакета */ + QString m_version; + + /** @brief Имя проекта, которое используется при формировании имён файлов и каталогов */ QString m_projectName; QString m_executableName; QString m_executableFilePath; QString m_executableDirectory; - /// @brief Общий каталог для файлов работы (темы) + /** @brief Общий каталог для файлов работы (темы) */ QString m_themeDirectory; - /// @brief Общий каталог для файлов проекта + /** @brief Общий каталог для файлов проекта */ QString m_projectDirectory; - /// @brief Путь к каталогу с временными файлами + /** @brief Путь к каталогу с временными файлами */ QString m_tempDirectory; - /// @brief Путь к домашнему каталогу текущего пользователя + /** @brief Путь к домашнему каталогу текущего пользователя */ QString m_homeDirectory; - /// @brief Путь к общему пользовательскому каталогу настроек + /** @brief Путь к общему пользовательскому каталогу настроек */ QString m_configDirectory; - /// @brief Путь к общему пользовательскому каталогу данных + /** @brief Путь к общему пользовательскому каталогу данных */ QString m_dataDirectory; - /// @brief Путь к пользовательскому каталогу с изменяемыми файлами + /** @brief Путь к пользовательскому каталогу с изменяемыми файлами */ QString m_userVarDataDirectory; - /// @brief Путь к системному каталогу с изменяемыми файлами + /** @brief Путь к системному каталогу с изменяемыми файлами */ QString m_systemVarDataDirectory; - /// @brief Путь к пользовательскому каталогу с неизменяемыми файлами + /** @brief Путь к пользовательскому каталогу с неизменяемыми файлами */ QString m_userConstDataDirectory; - /// @brief Путь к системному каталогу с неизменяемыми файлами + /** @brief Путь к системному каталогу с неизменяемыми файлами */ QString m_systemConstDataDirectory; - /// @brief Путь к пользовательскому каталогу с журналами работы + /** @brief Путь к пользовательскому каталогу с журналами работы */ QString m_userLogDirectory; - /// @brief Путь к системному каталогу с журналами работы + /** @brief Путь к системному каталогу с журналами работы */ QString m_systemLogDirectory; - /// @brief Путь к пользовательскому каталогу с файлами настройки + /** @brief Путь к пользовательскому каталогу с файлами настройки */ QString m_userConfigDirectory; - /// @brief Путь к системному каталогу с файлами настройки + /** @brief Путь к системному каталогу с файлами настройки */ QString m_systemConfigDirectory; - /// @brief Полный путь к файлу настройки + /** @brief Полный путь к файлу настройки */ QString m_configFilePath; - /// @brief Имя файла настройки + /** @brief Имя файла настройки */ QString m_configFileName; + /** @brief Расширение файла настройки */ + QString m_configFileExtension; + + QRegularExpression m_binDirRegex; + QRegularExpression m_unityBinDirRegex; void setupSystemDirectories( const QString& defaultProjectDirectory, const QString& defaultEtcDirectory, const QString& defaultConstDataDirectory, const QString& defaultVarDataDirectory, const QString& defaultLogDirectory ); + void setupUserDirectories( const QString& prefix ); + bool initCommon(); HierarchyType getHierarchyType(); void calculatePaths( HierarchyType hType );