#include #include #include #include #include #include namespace myx { namespace filesystem { Paths::Paths() = default; Paths::HierarchyType Paths::getHierarchyType() { QRegExp binRegexp( "/s*bin$" ); auto binaryDir = m_currentExecutable.m_canonicalFilePath.canonicalPath(); if ( binRegexp.indexIn( binaryDir ) == -1 ) { return ( HierarchyType::kFlat ); } QRegExp optRegexp( "^/opt(/|/.+/)" + m_projectName + "/" ); if ( optRegexp.indexIn( binaryDir ) >= 0 ) { binaryDir.remove( binRegexp ); QFileInfo etcDirInfo { binaryDir + "/etc" }; if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo constDataDirInfo { binaryDir + "/files/data" }; if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo varDataDirInfo { binaryDir + "/files/lib" }; if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } QFileInfo logDirInfo { binaryDir + "/files/log" }; if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } m_systemConfigDirectory = etcDirInfo.canonicalFilePath(); m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath(); m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath(); m_systemLogDirectory = logDirInfo.canonicalFilePath(); return ( HierarchyType::kOpt ); } if ( binaryDir.startsWith( QStringLiteral( "/usr/local" ) ) ) { QFileInfo etcDirInfo { "/usr/local/etc/" + m_projectName }; if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo constDataDirInfo { "/usr/local/share/" + m_projectName }; if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo varDataDirInfo { "/var/lib/" + m_projectName }; if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } QFileInfo logDirInfo { "/var/log/" + m_projectName }; if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } m_systemConfigDirectory = etcDirInfo.canonicalFilePath(); m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath(); m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath(); m_systemLogDirectory = logDirInfo.canonicalFilePath(); return ( HierarchyType::kUsr ); } if ( binaryDir.startsWith( QStringLiteral( "/usr" ) ) ) { QFileInfo etcDirInfo { "/etc/" + m_projectName }; if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo constDataDirInfo { "/usr/share/" + m_projectName }; if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo varDataDirInfo { "/var/lib/" + m_projectName }; if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } QFileInfo logDirInfo { "/var/log/" + m_projectName }; if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } m_systemConfigDirectory = etcDirInfo.canonicalFilePath(); m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath(); m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath(); m_systemLogDirectory = logDirInfo.canonicalFilePath(); return ( HierarchyType::kUsr ); } if ( binaryDir.startsWith( m_homeDirectory.canonicalPath() + "/.local/bin" ) || binaryDir.startsWith( m_homeDirectory.canonicalPath() + "/bin" ) ) { QFileInfo etcDirInfo { m_userConfigDirectory.canonicalPath() }; if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo constDataDirInfo { m_userConstDataDirectory.canonicalPath() }; if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo varDataDirInfo { m_userVarDataDirectory.canonicalPath() }; if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } QFileInfo logDirInfo { m_userLogDirectory.canonicalPath() }; if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } m_systemConfigDirectory = etcDirInfo.canonicalFilePath(); m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath(); m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath(); m_systemLogDirectory = logDirInfo.canonicalFilePath(); return( HierarchyType::kHome ); } binaryDir.remove( binRegexp ); QFileInfo etcDirInfo { binaryDir + "/etc" }; if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo constDataDirInfo { binaryDir + "/files/data" }; if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); } QFileInfo varDataDirInfo { binaryDir + "/files/lib" }; if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } QFileInfo logDirInfo { binaryDir + "/files/log" }; if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); } m_systemConfigDirectory = etcDirInfo.canonicalFilePath(); m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath(); m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath(); m_systemLogDirectory = logDirInfo.canonicalFilePath(); return ( HierarchyType::kDevelopment ); } // Paths::getHierarchyType bool Paths::init( const QString& projectDir, const QString& configFileExtension ) { m_projectName = projectDir.isEmpty() ? m_currentExecutable.m_canonicalFilePath.fileName() : projectDir; m_configFileExtension = configFileExtension.isEmpty() ? QStringLiteral( "conf" ) : configFileExtension; m_configFileName = m_projectName + "." + m_configFileExtension; m_homeDirectory = QDir::homePath(); m_tempDirectory = QDir::tempPath(); auto configHome = QString::fromLocal8Bit( qgetenv( "XDG_CONFIG_HOME" ) ); if ( configHome.isEmpty() ) { configHome = m_homeDirectory.canonicalPath() + "/.config"; } m_userConfigDirectory = configHome + "/" + m_projectName; auto dataHome = QString::fromLocal8Bit( qgetenv( "XDG_DATA_HOME" ) ); if ( dataHome.isEmpty() ) { dataHome = m_homeDirectory.canonicalPath() + "/.local/share"; } dataHome += "/" + m_projectName; m_userConstDataDirectory = dataHome + "/data"; m_userVarDataDirectory = dataHome + "/lib"; m_userLogDirectory = dataHome + "/log"; m_hierarchyType = getHierarchyType(); if ( m_hierarchyType == HierarchyType::kFlat ) { m_systemConstDataDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath(); m_systemVarDataDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath(); m_systemConfigDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath(); m_systemLogDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath(); } m_configFilePath = m_systemConfigDirectory.canonicalPath() + "/" + m_configFileName; return( true ); } // Paths::updatePaths bool Paths::makeDefaultDirectories() { bool status = true; if ( !m_userConfigDirectory.mkpath( m_userConfigDirectory.absolutePath() ) ) { status = false; } if ( !m_userVarDataDirectory.mkpath( m_userVarDataDirectory.absolutePath() ) ) { status = false; } if ( !m_userConstDataDirectory.mkpath( m_userConstDataDirectory.absolutePath() ) ) { status = false; } if ( !m_userLogDirectory.mkpath( m_userLogDirectory.absolutePath() ) ) { status = false; } return( status ); } QString Paths::findConfigFile( const QString& defaultConfigFile ) { if ( !defaultConfigFile.isEmpty() && QFileInfo( defaultConfigFile ).isReadable() ) { m_configFilePath = defaultConfigFile; return( defaultConfigFile ); } auto fileName = QString::fromLocal8Bit( qgetenv( QCoreApplication::applicationName() .toUpper().toUtf8() + "_CONFIG" ) ); if ( QFileInfo( fileName ).isReadable() ) { m_configFilePath = fileName; return( fileName ); } if ( QFileInfo( m_configFilePath ).isReadable() ) { return( m_configFilePath.absoluteFilePath() ); } return( QString() ); } // Paths::findConfigFile QDir Paths::executableFileDirectory() const { return( m_currentExecutable.m_canonicalFilePath.dir() ); } const QDir& Paths::userConfigDirectory() const { return( m_userConfigDirectory ); } const QDir& Paths::systemConfigDirectory() const { return( m_systemConfigDirectory ); } const QFileInfo& Paths::configFilePath() const { return( m_configFilePath ); } const QString& Paths::configFileName() const { return( m_configFileName ); } const QString& Paths::configFileExtension() const { return( m_configFileExtension ); } const QDir& Paths::userVarDataDirectory() const { return( m_userVarDataDirectory ); } const QDir& Paths::systemVarDataDirectory() const { return( m_systemVarDataDirectory ); } const QDir& Paths::userConstDataDirectory() const { return( m_userConstDataDirectory ); } const QDir& Paths::systemConstDataDirectory() const { return( m_systemConstDataDirectory ); } const QDir& Paths::userLogDirectory() const { return( m_userLogDirectory ); } const QDir& Paths::systemLogDirectory() const { return( m_systemLogDirectory ); } const QDir& Paths::tempDirectory() const { return( m_tempDirectory ); } const QDir& Paths::homeDirectory() const { return( m_homeDirectory ); } const QString& Paths::projectName() const { return( m_projectName ); } QString Paths::executableFileName() const { return( m_currentExecutable.m_canonicalFilePath.fileName() ); } const QFileInfo& Paths::executableFilePath() const { return( m_currentExecutable.m_canonicalFilePath ); } } // namespace filesystem } // namespace myx