#include "UpdateLogic.h" #include "ConfigHelper.h" #include #include #include #include "PolicyHelper.h" #include "LocalStateHelper.h" UpdateLogic::UpdateLogic(QObject* parent) : QObject(parent) { ConfigHelper& cfg = ConfigHelper::instance(); m_serverAddr = cfg.getValue("Server", "api_base_url"); m_appId = cfg.getValue("App", "app_id"); m_curVer = cfg.getValue("App", "current_version"); m_channel = cfg.getValue("App", "channel"); // Debug print config qDebug() << "Read server addr:" << m_serverAddr; qDebug() << "Read app id:" << m_appId; } void UpdateLogic::checkUpdate() { if (m_serverAddr.isEmpty() || m_appId.isEmpty() || m_curVer.isEmpty() || m_channel.isEmpty()) { qDebug() << "Config incomplete, abort update check"; m_needUpdate = false; return; } QString url = m_serverAddr + "/api/v1/update/check"; QJsonObject body; body["app_id"] = m_appId; body["current_version"] = m_curVer; body["channel"] = m_channel; m_http.postRequest(url, body, [this](int code, const QJsonObject& resp) { qDebug() << "Check update HTTP code:" << code; m_lastStatusCode = code; m_checkResp = resp; m_networkOk = (code == 200); if (code == 200) { const QString appDir = QApplication::applicationDirPath(); PolicyHelper onlinePolicy(appDir); LocalStateHelper state(appDir); const bool stateLoaded = state.loadState(); const bool policyValid = onlinePolicy.loadPolicyObject( resp.value("policy").toObject(), resp.value("policy_text").toString()); if (!policyValid || !stateLoaded || state.isPolicySeqRolledBack(onlinePolicy.policySeq()) || !onlinePolicy.savePolicy()) { qDebug() << "Online policy rejected:" << onlinePolicy.errorString(); m_networkOk = false; m_needUpdate = false; return; } state.updateOnlineVerified(onlinePolicy.policySeq()); if (!state.saveState()) { qDebug() << "Cannot persist online policy state"; m_networkOk = false; m_needUpdate = false; return; } m_needUpdate = resp["need_update"].toBool(); m_latestVer = resp["latest_version"].toString(); qDebug() << "Need update:" << m_needUpdate; qDebug() << "Latest version:" << m_latestVer; qDebug() << "Policy seq:" << onlinePolicy.policySeq(); } else { m_needUpdate = false; qDebug() << "Check update api failed"; } }); } void UpdateLogic::getDownloadUrl(const QString& appId, const QString& channel, const QString& ver, int verId) { QString url = m_serverAddr + "/api/v1/update/download-url"; QJsonObject body; body["app_id"] = appId; body["channel"] = channel; body["version"] = ver; body["version_id"] = verId; QJsonArray files; body["files"] = files; m_http.postRequest(url, body, [](int code, const QJsonObject& resp) { qDebug() << "\n========== File Download Url =========="; qDebug() << resp["files"].toArray(); }); } void UpdateLogic::reportUpdateResult(const QString& deviceId, const QString& fromVer, const QString& toVer, bool success) { QString url = m_serverAddr + "/api/v1/update/report"; QJsonObject body; body["device_id"] = deviceId; body["from_version"] = fromVer; body["to_version"] = toVer; body["result"] = success ? "success" : "fail"; m_http.postRequest(url, body, [](int code, const QJsonObject& resp) { qDebug() << "\n========== Update Report Result =========="; qDebug() << resp; }); }