GrabBag/AppUtils/AppCommon/Src/PathManager.cpp

112 lines
3.0 KiB
C++
Raw Normal View History

#include "PathManager.h"
#include <QtCore/QCoreApplication>
#include <QtCore/QFileInfo>
#include <QtCore/QDir>
#include <QtCore/QStandardPaths>
#include <QtCore/QFile>
#include <stdexcept>
#include "VrLog.h"
// 静态成员初始化
PathManager* PathManager::s_instance = nullptr;
std::mutex PathManager::s_mutex;
PathManager::PathManager(const QString& appName)
: m_appName(appName)
{
// 初始化时计算并缓存所有路径
m_configDirectory = GetConfigDirectory();
EnsureConfigDirectoryExists();
m_configFilePath = m_configDirectory + "/config.xml";
m_calibrationFilePath = m_configDirectory + "/EyeHandCalibMatrixInfo.ini";
LOG_INFO("PathManager initialized for app: %s\n", appName.toStdString().c_str());
LOG_INFO("Config directory: %s\n", m_configDirectory.toStdString().c_str());
}
PathManager& PathManager::Initialize(const QString& appName)
{
std::lock_guard<std::mutex> lock(s_mutex);
if (s_instance != nullptr) {
LOG_WARNING("PathManager already initialized, ignoring re-initialization\n");
return *s_instance;
}
s_instance = new PathManager(appName);
return *s_instance;
}
PathManager& PathManager::GetInstance()
{
if (s_instance == nullptr) {
LOG_ERROR("PathManager not initialized! Call Initialize() first.\n");
throw std::runtime_error("PathManager not initialized! Call PathManager::Initialize(appName) first.");
}
return *s_instance;
}
bool PathManager::IsInitialized()
{
std::lock_guard<std::mutex> lock(s_mutex);
return s_instance != nullptr;
}
QString PathManager::GetConfigFilePath() const
{
return m_configFilePath;
}
QString PathManager::GetCalibrationFilePath() const
{
return m_calibrationFilePath;
}
QString PathManager::GetAppConfigDirectory() const
{
return m_configDirectory;
}
QString PathManager::GetConfigDirectory() const
{
QString baseDir;
#ifdef _WIN32
// Windows系统使用程序目录
baseDir = GetProgramDirectory();
#else
// Linux系统使用用户配置目录
baseDir = GetUserConfigDirectory();
#endif
return baseDir + "/../" + m_appName + "/Config";
}
bool PathManager::EnsureConfigDirectoryExists()
{
if (QDir().exists(m_configDirectory)) {
return true;
}
LOG_INFO("Creating configuration directory: %s\n", m_configDirectory.toStdString().c_str());
bool success = QDir().mkpath(m_configDirectory);
if (success) {
LOG_INFO("Configuration directory created successfully\n");
} else {
LOG_ERROR("Failed to create configuration directory: %s\n", m_configDirectory.toStdString().c_str());
}
return success;
}
QString PathManager::GetProgramDirectory() const
{
QString exePath = QCoreApplication::applicationFilePath();
return QFileInfo(exePath).absoluteDir().path();
}
QString PathManager::GetUserConfigDirectory() const
{
return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
}