GrabBag/AppUtils/AppCommon/Src/PathManager.cpp

112 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 std::string& 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(QString::fromStdString(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);
}