Compare commits
No commits in common. "b86cf01973ffc8c764dc422b278956539bb581d4" and "d96ee1ee570282d2dabd71236fa69c777341518f" have entirely different histories.
b86cf01973
...
d96ee1ee57
198
.gitignore
vendored
198
.gitignore
vendored
@ -1,200 +1,8 @@
|
|||||||
# Каталог для результатов сборки проекта
|
CMakeLists.txt.user*
|
||||||
_build
|
_build
|
||||||
|
|
||||||
# Каталог для тестирования установки
|
|
||||||
_output
|
_output
|
||||||
|
.cmake/
|
||||||
# Файлы настроек, редактируемые во время отладки,
|
*.autosave
|
||||||
# за исключением шаблонных файлов
|
|
||||||
files/etc/*.conf
|
|
||||||
!files/etc/*.example.conf
|
|
||||||
|
|
||||||
# Каталоги, в которые разрешена запись данных во время работы программы
|
|
||||||
files/lib/*
|
files/lib/*
|
||||||
files/log/*
|
files/log/*
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Общие настройки для C, C++, Fortran, Qt, CMake, Ninja, LaTeX и редакторов
|
|
||||||
###
|
|
||||||
|
|
||||||
###
|
|
||||||
### Временные файлы текстовых редакторов
|
|
||||||
###
|
|
||||||
*.bak
|
|
||||||
*.gho
|
|
||||||
*.tmp
|
|
||||||
*.dotdropbak
|
|
||||||
|
|
||||||
###
|
|
||||||
### LyX
|
|
||||||
###
|
|
||||||
*.lyx~
|
|
||||||
*.lyx#
|
|
||||||
|
|
||||||
###
|
|
||||||
### Vim
|
|
||||||
###
|
|
||||||
# Swap
|
|
||||||
[._]*.s[a-v][a-z]
|
|
||||||
!*.svg # comment out if you don't need vector files
|
|
||||||
[._]*.sw[a-p]
|
|
||||||
[._]s[a-rt-v][a-z]
|
|
||||||
[._]ss[a-gi-z]
|
|
||||||
[._]sw[a-p]
|
|
||||||
|
|
||||||
# Temporary
|
|
||||||
.netrwhist
|
|
||||||
*~
|
|
||||||
# Auto-generated tag files
|
|
||||||
tags
|
|
||||||
# Persistent undo
|
|
||||||
[._]*.un~
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### C++
|
|
||||||
###
|
|
||||||
|
|
||||||
# Prerequisites
|
|
||||||
*.d
|
|
||||||
|
|
||||||
# Compiled Object files
|
|
||||||
*.slo
|
|
||||||
*.lo
|
|
||||||
*.o
|
|
||||||
*.obj
|
|
||||||
|
|
||||||
# Precompiled Headers
|
|
||||||
*.gch
|
|
||||||
*.pch
|
|
||||||
|
|
||||||
# Compiled Dynamic libraries
|
|
||||||
*.so
|
|
||||||
*.so.*
|
|
||||||
*.dylib
|
|
||||||
*.dll
|
|
||||||
|
|
||||||
# Fortran module files
|
|
||||||
*.mod
|
|
||||||
*.smod
|
|
||||||
|
|
||||||
# Compiled Static libraries
|
|
||||||
*.lai
|
|
||||||
*.la
|
|
||||||
*.a
|
|
||||||
*.lib
|
|
||||||
|
|
||||||
# Executables
|
|
||||||
*.exe
|
|
||||||
*.out
|
|
||||||
*.app
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### CMake
|
|
||||||
###
|
|
||||||
CMakeLists.txt.user*
|
|
||||||
CMakeCache.txt
|
|
||||||
CMakeFiles
|
|
||||||
CMakeScripts
|
|
||||||
Testing
|
|
||||||
Makefile
|
|
||||||
cmake_install.cmake
|
|
||||||
install_manifest.txt
|
|
||||||
compile_commands.json
|
|
||||||
CTestTestfile.cmake
|
|
||||||
_deps
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Ninja
|
|
||||||
###
|
|
||||||
.ninja_deps
|
|
||||||
.ninja_log
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### GCC coverage testing tool files
|
|
||||||
###
|
|
||||||
*.gcno
|
|
||||||
*.gcda
|
|
||||||
*.gcov
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Qt
|
|
||||||
###
|
|
||||||
object_script.*.Release
|
|
||||||
object_script.*.Debug
|
|
||||||
*_plugin_import.cpp
|
|
||||||
/.qmake.cache
|
|
||||||
/.qmake.stash
|
|
||||||
*.pro.user
|
|
||||||
*.pro.user.*
|
|
||||||
*.qbs.user
|
|
||||||
*.qbs.user.*
|
|
||||||
*.moc
|
|
||||||
moc_*.cpp
|
|
||||||
moc_*.h
|
|
||||||
qrc_*.cpp
|
|
||||||
ui_*.h
|
|
||||||
*.qmlc
|
|
||||||
*.jsc
|
|
||||||
Makefile*
|
|
||||||
*build-*
|
|
||||||
*.qm
|
|
||||||
*.prl
|
|
||||||
|
|
||||||
# Qt unit tests
|
|
||||||
target_wrapper.*
|
|
||||||
|
|
||||||
# QtCreator
|
|
||||||
*.autosave
|
|
||||||
|
|
||||||
# QtCreator Qml
|
|
||||||
*.qmlproject.user
|
|
||||||
*.qmlproject.user.*
|
|
||||||
|
|
||||||
# QtCreator local machine specific files for imported projects
|
|
||||||
*creator.user*
|
|
||||||
|
|
||||||
*_qmlcache.qrc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Latex
|
|
||||||
###
|
|
||||||
*.acn
|
|
||||||
*.acr
|
|
||||||
*.alg
|
|
||||||
*.aux
|
|
||||||
*.bbl
|
|
||||||
*.blg
|
|
||||||
*.dvi
|
|
||||||
*.fdb_latexmk
|
|
||||||
*.glg
|
|
||||||
*.glo
|
|
||||||
*.gls
|
|
||||||
*.idx
|
|
||||||
*.ilg
|
|
||||||
*.ind
|
|
||||||
*.ist
|
|
||||||
*.lof
|
|
||||||
*.log
|
|
||||||
*.lot
|
|
||||||
*.maf
|
|
||||||
*.mtc
|
|
||||||
*.mtc0
|
|
||||||
*.nav
|
|
||||||
*.nlo
|
|
||||||
*.out
|
|
||||||
*.pdfsync
|
|
||||||
*.ps
|
|
||||||
*.snm
|
|
||||||
*.synctex.gz
|
|
||||||
*.toc
|
|
||||||
*.vrb
|
|
||||||
*.xdy
|
|
||||||
*.tdo
|
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <myx/base/config.hpp>
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
#include <myx/filesystem/paths.hpp>
|
#include <myx/filesystem/paths.hpp>
|
||||||
|
#include <myx/filesystem/paths_mt.hpp>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
@ -9,18 +10,26 @@
|
|||||||
|
|
||||||
namespace MF = myx::filesystem;
|
namespace MF = myx::filesystem;
|
||||||
|
|
||||||
|
// Переменные для защиты экземпляра класса MF::PathsMT
|
||||||
|
std::atomic< MF::PathsMT* > MF::PathsMT::sInstance;
|
||||||
|
std::mutex MF::PathsMT::sMutex;
|
||||||
|
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
(void)argc;
|
(void)argc;
|
||||||
(void)argv;
|
(void)argv;
|
||||||
QCoreApplication::setApplicationName( QStringLiteral( CMLIB_PROJECT_NAME ) );
|
QCoreApplication::setApplicationName( QStringLiteral( CMLIB_PROJECT_NAME ) );
|
||||||
MF::Paths& paths = MF::Paths::instance();
|
MF::PathsMT& pathsMT = MF::PathsMT::instance();
|
||||||
|
MF::Paths& paths = MF::Paths::instance();
|
||||||
|
|
||||||
|
pathsMT.init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
|
||||||
|
pathsMT.findConfigFile( QStringLiteral( "test" ) );
|
||||||
|
qDebug() << pathsMT.systemLogDirectory();
|
||||||
|
qDebug() << pathsMT.systemConfigDirectory();
|
||||||
|
|
||||||
paths.init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
|
paths.init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
|
||||||
|
|
||||||
qDebug() << "prefixDirectory : " << paths.prefixDirectory();
|
|
||||||
|
|
||||||
qDebug() << "executableName : " << paths.executableName();
|
qDebug() << "executableName : " << paths.executableName();
|
||||||
qDebug() << "executableFilePath : " << paths.executableFilePath();
|
qDebug() << "executableFilePath : " << paths.executableFilePath();
|
||||||
qDebug() << "executableDirectory : " << paths.executableDirectory();
|
qDebug() << "executableDirectory : " << paths.executableDirectory();
|
||||||
|
@ -16,49 +16,14 @@ struct EnableBitMaskOperators
|
|||||||
};
|
};
|
||||||
|
|
||||||
template< typename Enum >
|
template< typename Enum >
|
||||||
typename std::enable_if< EnableBitMaskOperators< Enum >::kEnable, Enum >::type
|
typename std::enable_if< EnableBitMaskOperators< Enum >::k_Enable, Enum >::type
|
||||||
operator ~( Enum e )
|
|
||||||
{
|
|
||||||
using Underlying = typename std::underlying_type< Enum >::type;
|
|
||||||
return( static_cast< Enum >( ~static_cast< Underlying >( e ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template< typename Enum >
|
|
||||||
typename std::enable_if< EnableBitMaskOperators< Enum >::kEnable, Enum >::type
|
|
||||||
operator |( Enum lhs, Enum rhs )
|
operator |( Enum lhs, Enum rhs )
|
||||||
{
|
{
|
||||||
using Underlying = typename std::underlying_type< Enum >::type;
|
using Underlying = typename std::underlying_type< Enum >::type;
|
||||||
return( static_cast< Enum >( static_cast< Underlying >( lhs ) | static_cast< Underlying >( rhs ) ) );
|
return( static_cast< Enum >(
|
||||||
}
|
static_cast< Underlying >( lhs ) |
|
||||||
|
static_cast< Underlying >( rhs )
|
||||||
|
) );
|
||||||
template< typename Enum >
|
|
||||||
typename std::enable_if< EnableBitMaskOperators< Enum >::kEnable, typename std::add_lvalue_reference< Enum >::type >::type
|
|
||||||
operator |=( Enum& lhs, Enum rhs )
|
|
||||||
{
|
|
||||||
using Underlying = typename std::underlying_type< Enum >::type;
|
|
||||||
lhs = static_cast< Enum >( static_cast< Underlying >( lhs ) | static_cast< Underlying >( rhs ) );
|
|
||||||
return( lhs );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template< typename Enum >
|
|
||||||
typename std::enable_if< EnableBitMaskOperators< Enum >::kEnable, Enum >::type
|
|
||||||
operator &( Enum lhs, Enum rhs )
|
|
||||||
{
|
|
||||||
using Underlying = typename std::underlying_type< Enum >::type;
|
|
||||||
return( static_cast< Enum >( static_cast< Underlying >( lhs ) & static_cast< Underlying >( rhs ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template< typename Enum >
|
|
||||||
typename std::enable_if< EnableBitMaskOperators< Enum >::kEnable, typename std::add_lvalue_reference< Enum >::type >::type
|
|
||||||
operator &=( Enum& lhs, Enum rhs )
|
|
||||||
{
|
|
||||||
using Underlying = typename std::underlying_type< Enum >::type;
|
|
||||||
lhs = static_cast< Enum >( static_cast< Underlying >( lhs ) & static_cast< Underlying >( rhs ) );
|
|
||||||
return( lhs );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace base
|
} // namespace base
|
||||||
|
@ -3,10 +3,16 @@ set(TRGT filesystem)
|
|||||||
|
|
||||||
# cmake-format: off
|
# cmake-format: off
|
||||||
# Список файлов исходных текстов
|
# Список файлов исходных текстов
|
||||||
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp)
|
set(TRGT_cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.cpp)
|
||||||
|
|
||||||
# Список заголовочных файлов
|
# Список заголовочных файлов
|
||||||
set(TRGT_hpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp)
|
set(TRGT_hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.hpp)
|
||||||
|
|
||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
41
src/myx/filesystem/current_executable.cpp
Normal file
41
src/myx/filesystem/current_executable.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#ifndef MYX_BASE_CURRENT_EXECUTABLE_CPP_
|
||||||
|
#define MYX_BASE_CURRENT_EXECUTABLE_CPP_
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
#else
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
|
#include <paths.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace filesystem {
|
||||||
|
|
||||||
|
#if !defined ( __linux__ )
|
||||||
|
error "Class CurrentExecutable is supported only in Linux"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MYXLIB_INLINE CurrentExecutable::CurrentExecutable() :
|
||||||
|
m_procFilePath( QStringLiteral( "/proc/self/exe" ) )
|
||||||
|
{
|
||||||
|
m_canonicalFilePath = m_procFilePath.canonicalFilePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QFileInfo& CurrentExecutable::canonicalFilePath() const
|
||||||
|
{
|
||||||
|
return( m_canonicalFilePath );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace filesystem
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif // MYX_BASE_CURRENT_EXECUTABLE_CPP_
|
51
src/myx/filesystem/current_executable.hpp
Normal file
51
src/myx/filesystem/current_executable.hpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* @file current_executable.hpp
|
||||||
|
* @brief Параметры исполняемого файла
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MYX_FILESYSTEM_CURRENT_EXECUTABLE_HPP_
|
||||||
|
#define MYX_FILESYSTEM_CURRENT_EXECUTABLE_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace filesystem {
|
||||||
|
|
||||||
|
class CurrentExecutable
|
||||||
|
{
|
||||||
|
/// @brief Путь к символической ссылке, указывающей на текущий исполняемый файл
|
||||||
|
QFileInfo m_procFilePath;
|
||||||
|
|
||||||
|
/// @brief Канонический путь к текущему исполняемому файлу
|
||||||
|
QFileInfo m_canonicalFilePath;
|
||||||
|
|
||||||
|
friend class Paths;
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Конструктор, собирающий информацию о текущем исполняемом файле.
|
||||||
|
*/
|
||||||
|
CurrentExecutable();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Канонический путь к текущему исполняемому файлу
|
||||||
|
*/
|
||||||
|
const QFileInfo& canonicalFilePath() const;
|
||||||
|
}; // class CurrentExecutable
|
||||||
|
|
||||||
|
} // namespace filesystem
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "current_executable.cpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // MYX_FILESYSTEM_CURRENT_EXECUTABLE_HPP_
|
@ -8,6 +8,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
#include <myx/base/config.hpp>
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
|
||||||
#include <paths.h>
|
#include <paths.h>
|
||||||
|
|
||||||
@ -21,22 +22,11 @@ namespace filesystem {
|
|||||||
MYXLIB_INLINE Paths::Paths() = default;
|
MYXLIB_INLINE Paths::Paths() = default;
|
||||||
|
|
||||||
|
|
||||||
MYXLIB_INLINE void Paths::setupSystemDirectories( const QString& defaultPrefixDirectory,
|
MYXLIB_INLINE void Paths::setupSystemDirectories( const QString& defaultEtcDirectory,
|
||||||
const QString& defaultEtcDirectory,
|
|
||||||
const QString& defaultConstDataDirectory,
|
const QString& defaultConstDataDirectory,
|
||||||
const QString& defaultVarDataDirectory,
|
const QString& defaultVarDataDirectory,
|
||||||
const QString& defaultLogDirectory )
|
const QString& defaultLogDirectory )
|
||||||
{
|
{
|
||||||
QFileInfo prefixDirInfo { defaultPrefixDirectory };
|
|
||||||
if ( prefixDirInfo.isDir() && prefixDirInfo.isReadable() )
|
|
||||||
{
|
|
||||||
m_prefixDirectory = defaultPrefixDirectory;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_prefixDirectory = ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
QFileInfo etcDirInfo { defaultEtcDirectory };
|
QFileInfo etcDirInfo { defaultEtcDirectory };
|
||||||
if ( etcDirInfo.isDir() && etcDirInfo.isReadable() )
|
if ( etcDirInfo.isDir() && etcDirInfo.isReadable() )
|
||||||
{
|
{
|
||||||
@ -87,8 +77,7 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
if ( binUnityRegexp.indexIn( binaryDir ) >= 0 )
|
if ( binUnityRegexp.indexIn( binaryDir ) >= 0 )
|
||||||
{
|
{
|
||||||
binaryDir.remove( binUnityRegexp );
|
binaryDir.remove( binUnityRegexp );
|
||||||
setupSystemDirectories( binaryDir,
|
setupSystemDirectories( binaryDir + "/etc",
|
||||||
binaryDir + "/etc",
|
|
||||||
binaryDir + "/files/data",
|
binaryDir + "/files/data",
|
||||||
binaryDir + "/files/lib",
|
binaryDir + "/files/lib",
|
||||||
binaryDir + "/files/log" );
|
binaryDir + "/files/log" );
|
||||||
@ -99,7 +88,6 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
QRegExp binRegexp( "/s*bin$" );
|
QRegExp binRegexp( "/s*bin$" );
|
||||||
if ( binRegexp.indexIn( binaryDir ) == -1 )
|
if ( binRegexp.indexIn( binaryDir ) == -1 )
|
||||||
{
|
{
|
||||||
m_prefixDirectory = m_executableDirectory;
|
|
||||||
m_systemConstDataDirectory = m_executableDirectory;
|
m_systemConstDataDirectory = m_executableDirectory;
|
||||||
m_systemVarDataDirectory = m_executableDirectory;
|
m_systemVarDataDirectory = m_executableDirectory;
|
||||||
m_systemConfigDirectory = m_executableDirectory;
|
m_systemConfigDirectory = m_executableDirectory;
|
||||||
@ -112,8 +100,7 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
if ( optRegexp.indexIn( binaryDir ) >= 0 )
|
if ( optRegexp.indexIn( binaryDir ) >= 0 )
|
||||||
{
|
{
|
||||||
binaryDir.remove( binRegexp );
|
binaryDir.remove( binRegexp );
|
||||||
setupSystemDirectories( binaryDir,
|
setupSystemDirectories( binaryDir + "/etc",
|
||||||
binaryDir + "/etc",
|
|
||||||
binaryDir + "/files/data",
|
binaryDir + "/files/data",
|
||||||
binaryDir + "/files/lib",
|
binaryDir + "/files/lib",
|
||||||
binaryDir + "/files/log" );
|
binaryDir + "/files/log" );
|
||||||
@ -123,8 +110,7 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
|
|
||||||
if ( binaryDir.startsWith( QStringLiteral( "/usr/local" ) ) )
|
if ( binaryDir.startsWith( QStringLiteral( "/usr/local" ) ) )
|
||||||
{
|
{
|
||||||
setupSystemDirectories( "/usr/local",
|
setupSystemDirectories( "/usr/local/etc/" + m_projectName,
|
||||||
"/usr/local/etc/" + m_projectName,
|
|
||||||
"/usr/local/share/" + m_projectName,
|
"/usr/local/share/" + m_projectName,
|
||||||
"/var/lib/" + m_projectName,
|
"/var/lib/" + m_projectName,
|
||||||
"/var/log/" + m_projectName );
|
"/var/log/" + m_projectName );
|
||||||
@ -134,8 +120,7 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
|
|
||||||
if ( binaryDir.startsWith( QStringLiteral( "/usr" ) ) )
|
if ( binaryDir.startsWith( QStringLiteral( "/usr" ) ) )
|
||||||
{
|
{
|
||||||
setupSystemDirectories( "/usr",
|
setupSystemDirectories( "/etc/" + m_projectName,
|
||||||
"/etc/" + m_projectName,
|
|
||||||
"/usr/share/" + m_projectName,
|
"/usr/share/" + m_projectName,
|
||||||
"/var/lib/" + m_projectName,
|
"/var/lib/" + m_projectName,
|
||||||
"/var/log/" + m_projectName );
|
"/var/log/" + m_projectName );
|
||||||
@ -146,7 +131,6 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
if ( binaryDir.startsWith( m_homeDirectory + "/.local/bin" ) ||
|
if ( binaryDir.startsWith( m_homeDirectory + "/.local/bin" ) ||
|
||||||
binaryDir.startsWith( m_homeDirectory + "/bin" ) )
|
binaryDir.startsWith( m_homeDirectory + "/bin" ) )
|
||||||
{
|
{
|
||||||
m_prefixDirectory = m_homeDirectory;
|
|
||||||
m_systemConfigDirectory = m_userConfigDirectory;
|
m_systemConfigDirectory = m_userConfigDirectory;
|
||||||
m_systemConstDataDirectory = m_userConstDataDirectory;
|
m_systemConstDataDirectory = m_userConstDataDirectory;
|
||||||
m_systemVarDataDirectory = m_userVarDataDirectory;
|
m_systemVarDataDirectory = m_userVarDataDirectory;
|
||||||
@ -156,8 +140,7 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
}
|
}
|
||||||
|
|
||||||
binaryDir.remove( binRegexp );
|
binaryDir.remove( binRegexp );
|
||||||
setupSystemDirectories( binaryDir,
|
setupSystemDirectories( binaryDir + "/etc",
|
||||||
binaryDir + "/etc",
|
|
||||||
binaryDir + "/files/data",
|
binaryDir + "/files/data",
|
||||||
binaryDir + "/files/lib",
|
binaryDir + "/files/lib",
|
||||||
binaryDir + "/files/log" );
|
binaryDir + "/files/log" );
|
||||||
@ -168,11 +151,10 @@ MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
|||||||
|
|
||||||
MYXLIB_INLINE bool Paths::init( const QString& projectDir, const QString& configFileExtension )
|
MYXLIB_INLINE bool Paths::init( const QString& projectDir, const QString& configFileExtension )
|
||||||
{
|
{
|
||||||
QFileInfo procSelfExe( QStringLiteral( "/proc/self/exe" ) );
|
CurrentExecutable exe;
|
||||||
QFileInfo currentExecutable = procSelfExe.canonicalFilePath();
|
m_executableName = exe.m_canonicalFilePath.fileName();
|
||||||
m_executableName = currentExecutable.fileName();
|
m_executableFilePath = exe.m_canonicalFilePath.absoluteFilePath();
|
||||||
m_executableFilePath = currentExecutable.absoluteFilePath();
|
m_executableDirectory = exe.m_canonicalFilePath.absolutePath();
|
||||||
m_executableDirectory = currentExecutable.absolutePath();
|
|
||||||
|
|
||||||
m_projectName = projectDir.isEmpty() ? m_executableName
|
m_projectName = projectDir.isEmpty() ? m_executableName
|
||||||
: projectDir;
|
: projectDir;
|
||||||
@ -352,12 +334,6 @@ MYXLIB_INLINE const QString& Paths::executableDirectory() const
|
|||||||
return( m_executableDirectory );
|
return( m_executableDirectory );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MYXLIB_INLINE const QString& Paths::prefixDirectory() const
|
|
||||||
{
|
|
||||||
return( m_prefixDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace filesystem
|
} // namespace filesystem
|
||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
#include <myx/base/config.hpp>
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
@ -52,9 +53,6 @@ class Paths
|
|||||||
QString m_executableFilePath;
|
QString m_executableFilePath;
|
||||||
QString m_executableDirectory;
|
QString m_executableDirectory;
|
||||||
|
|
||||||
/// @brief Общий префикс для файлов проекта
|
|
||||||
QString m_prefixDirectory;
|
|
||||||
|
|
||||||
/// @brief Путь к каталогу с временными файлами
|
/// @brief Путь к каталогу с временными файлами
|
||||||
QString m_tempDirectory;
|
QString m_tempDirectory;
|
||||||
/// @brief Путь к домашнему каталогу текущего пользователя
|
/// @brief Путь к домашнему каталогу текущего пользователя
|
||||||
@ -87,8 +85,7 @@ class Paths
|
|||||||
/// @brief Расширение для файла настройки
|
/// @brief Расширение для файла настройки
|
||||||
QString m_configFileExtension;
|
QString m_configFileExtension;
|
||||||
|
|
||||||
void setupSystemDirectories( const QString& defaultPrefixDirectory,
|
void setupSystemDirectories( const QString& defaultEtcDirectory,
|
||||||
const QString& defaultEtcDirectory,
|
|
||||||
const QString& defaultConstDataDirectory,
|
const QString& defaultConstDataDirectory,
|
||||||
const QString& defaultVarDataDirectory,
|
const QString& defaultVarDataDirectory,
|
||||||
const QString& defaultLogDirectory );
|
const QString& defaultLogDirectory );
|
||||||
|
44
src/myx/filesystem/paths_mt.cpp
Normal file
44
src/myx/filesystem/paths_mt.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#ifndef MYX_BASE_PATHS_MT_CPP_
|
||||||
|
#define MYX_BASE_PATHS_MT_CPP_
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/filesystem/paths_mt.hpp>
|
||||||
|
#else
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
|
||||||
|
#include <paths.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace filesystem {
|
||||||
|
|
||||||
|
MYXLIB_INLINE PathsMT::PathsMT() = default;
|
||||||
|
|
||||||
|
MYXLIB_INLINE PathsMT& PathsMT::instance()
|
||||||
|
{
|
||||||
|
volatile PathsMT* localInstance = sInstance.load( std::memory_order_acquire );
|
||||||
|
if ( localInstance == nullptr )
|
||||||
|
{
|
||||||
|
std::lock_guard< std::mutex > myLock( sMutex );
|
||||||
|
localInstance = sInstance.load( std::memory_order_relaxed );
|
||||||
|
if ( localInstance == nullptr ) // -V1036
|
||||||
|
{
|
||||||
|
localInstance = new PathsMT();
|
||||||
|
sInstance.store( const_cast< PathsMT* >( localInstance ), std::memory_order_release ); // NOLINT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return( const_cast< PathsMT& >( *localInstance ) ); // NOLINT
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace filesystem
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif // MYX_BASE_PATHS_MT_CPP_
|
59
src/myx/filesystem/paths_mt.hpp
Normal file
59
src/myx/filesystem/paths_mt.hpp
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
* @file paths.hpp
|
||||||
|
* @brief Стандартные пути к каталогам и файлам
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MYX_FILESYSTEM_PATHS_MT_HPP_
|
||||||
|
#define MYX_FILESYSTEM_PATHS_MT_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
#include <myx/filesystem/paths.hpp>
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <future>
|
||||||
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace filesystem {
|
||||||
|
|
||||||
|
/// @brief Потокобезопасная версия класса myx::filesystem::Paths
|
||||||
|
class PathsMT : public Paths
|
||||||
|
{
|
||||||
|
PathsMT();
|
||||||
|
~PathsMT() = default;
|
||||||
|
|
||||||
|
static std::atomic< PathsMT* > sInstance;
|
||||||
|
static std::mutex sMutex;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
PathsMT( const PathsMT& ) = delete;
|
||||||
|
PathsMT& operator=( const PathsMT& ) = delete;
|
||||||
|
PathsMT( PathsMT&& ) = delete;
|
||||||
|
PathsMT& operator=( PathsMT&& ) = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief getInstance
|
||||||
|
* @return Уникальный экземпляр класса PathsMT
|
||||||
|
*/
|
||||||
|
static PathsMT& instance();
|
||||||
|
}; // class PathsMT
|
||||||
|
|
||||||
|
} // namespace filesystem
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "paths_mt.cpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // MYX_FILESYSTEM_PATHS_MT_HPP_
|
Loading…
Reference in New Issue
Block a user