112 lines
3.0 KiB
C++
112 lines
3.0 KiB
C++
#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);
|
||
}
|