change_code/src/utils/uf2configreader.cpp

156 lines
4.1 KiB
C++

#include "uf2configreader.h"
#include "datacache.h"
#include "logmanager.h"
#include <QFile>
#include <QJsonDocument>
#include <QCoreApplication>
#include <QDir>
QSet<QString> UF2ConfigReader::m_cnameCache;
bool UF2ConfigReader::m_cnameCacheLoaded = false;
UF2ConfigReader::UF2ConfigReader(QObject *parent) : QObject(parent), m_loaded(false)
{
}
QString UF2ConfigReader::getBinPath()
{
QString appDir = QCoreApplication::applicationDirPath();
return appDir + "/uf2touft3";
}
bool UF2ConfigReader::loadAllUF20Config()
{
m_failedFiles.clear();
if (!DataCache::instance()->initDatabase()) {
LogManager::instance()->logError("UF20配置加载 - 数据库初始化失败");
m_failedFiles.append("uf2.json");
return false;
}
QString binPath = getBinPath();
QString filePath = binPath + "/uf2.json";
if (DataCache::instance()->hasUF20Config("uf2.json")) {
m_loaded = true;
DataCache::instance()->setDataLoaded(true);
return true;
}
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
LogManager::instance()->logError(QString("UF20配置加载失败 - 无法打开文件: %1").arg(filePath));
m_failedFiles.append("uf2.json");
return false;
}
QByteArray data = file.readAll();
QJsonDocument doc = QJsonDocument::fromJson(data);
file.close();
if (doc.isNull() || !doc.isObject()) {
LogManager::instance()->logError(QString("UF20配置加载失败 - JSON解析失败: %1").arg(filePath));
m_failedFiles.append("uf2.json");
return false;
}
QJsonObject config = doc.object();
if (!DataCache::instance()->saveUF20Config("uf2.json", config)) {
LogManager::instance()->logError("UF20配置加载失败 - 保存失败: uf2.json");
m_failedFiles.append("uf2.json");
return false;
}
m_loaded = true;
DataCache::instance()->setDataLoaded(true);
return true;
}
QStringList UF2ConfigReader::getFailedFiles() const
{
return m_failedFiles;
}
bool UF2ConfigReader::reloadUF20Config()
{
QString binPath = getBinPath();
QString filePath = binPath + "/uf2.json";
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
LogManager::instance()->logError(QString("UF20配置重新加载失败 - 无法打开文件: %1").arg(filePath));
return false;
}
QByteArray data = file.readAll();
QJsonDocument doc = QJsonDocument::fromJson(data);
file.close();
if (doc.isNull() || !doc.isObject()) {
LogManager::instance()->logError(QString("UF20配置重新加载失败 - JSON解析失败: %1").arg(filePath));
return false;
}
QJsonObject config = doc.object();
if (!DataCache::instance()->saveUF20Config("uf2.json", config)) {
LogManager::instance()->logError("UF20配置重新加载失败 - 保存失败: uf2.json");
return false;
}
clearCnameCache();
return true;
}
bool UF2ConfigReader::isUF20Loaded() const
{
return m_loaded;
}
bool UF2ConfigReader::loadCnameCache()
{
if (m_cnameCacheLoaded) {
return true;
}
m_cnameCache.clear();
if (!DataCache::instance()->initDatabase()) {
LogManager::instance()->logError("UF20 Cname缓存加载失败 - 数据库初始化失败");
return false;
}
m_cnameCache = DataCache::instance()->getAllUF20Cnames();
m_cnameCacheLoaded = true;
return true;
}
bool UF2ConfigReader::checkFuncExistsStatic(const QString& funcName)
{
if (!m_cnameCacheLoaded) {
loadCnameCache();
}
return m_cnameCache.contains(funcName);
}
bool UF2ConfigReader::checkFunctionExists(const QString& funcName)
{
return checkFuncExistsStatic(funcName);
}
void UF2ConfigReader::clearCnameCache()
{
m_cnameCache.clear();
m_cnameCacheLoaded = false;
LogManager::instance()->logInfo("Cname缓存已清空");
}
QSet<QString> UF2ConfigReader::getAllCnamesStatic()
{
if (!m_cnameCacheLoaded) {
loadCnameCache();
}
return m_cnameCache;
}