culturered_client/DisplayPoster/TokenRequest.cpp
2024-09-07 11:34:44 +08:00

154 lines
4.3 KiB
C++
Raw Permalink 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 "TokenRequest.h"
#include <QNetworkAccessManager>
#include <QUrlQuery>
#include <QNetworkRequest>
#include <QApplication>
#include <QFile>
#include <QJsonParseError>
#include <QJsonObject>
TokenRequest::TokenRequest(QObject* param) : QObject(param){
GetConfig();
m_networkAccessManager = new QNetworkAccessManager(this);
Request();
connect(&m_tokenTimer, &QTimer::timeout, [this]() {Request(); });
m_tokenTimer.start(m_interval * 1000);
}
void TokenRequest::GetConfig() {
const QString appName = qApp->applicationName();
const QString path = qApp->applicationDirPath();
const QString configPath = QString("%1/%2.data").arg(path, appName);
QFile dataFile(configPath);
if (!dataFile.open(QIODevice::ReadOnly)) {
qDebug() << __FUNCTION__ << "couldn't open" << configPath;
qApp->exit(1);
return;
}
QByteArray allData = dataFile.readAll();
dataFile.close();
QJsonParseError jsonError;
QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &jsonError));
if (jsonError.error != QJsonParseError::NoError) {
qDebug() << "json error!" << jsonError.errorString();
return;
}
QJsonObject rootObj = jsonDoc.object();
if (rootObj.contains("url")) {
m_url = rootObj.value("url").toString();
} else {
qDebug() << __FUNCTION__ << "not contains url" << allData;
}
if (rootObj.contains("room")) {
m_room = rootObj.value("room").toString();
} else {
qDebug() << __FUNCTION__ << "not contains room" << allData;
}
if (rootObj.contains("data")) {
m_data = rootObj.value("data").toString();
} else {
qDebug() << __FUNCTION__ << "not contains data" << allData;
}
if (rootObj.contains("interval")) {
m_interval = rootObj.value("interval").toInt();
} else {
qDebug() << __FUNCTION__ << "not contains data" << allData;
m_interval = 60;
}
}
void TokenRequest::SaveConfig() {
QJsonObject rootObj;
rootObj.insert("url", m_url);
rootObj.insert("room", m_room);
rootObj.insert("data", m_data);
rootObj.insert("interval", m_interval);
QJsonDocument jsonDoc;
jsonDoc.setObject(rootObj);
const QString appName = qApp->applicationName();
const QString path = qApp->applicationDirPath();
const QString configPath = QString("%1/%2.data").arg(path, appName);
QFile dataFile(configPath);
if (!dataFile.open(QIODevice::WriteOnly)) {
qDebug() << __FUNCTION__ << "couldn't open" << configPath;
return;
}
dataFile.write(jsonDoc.toJson());
dataFile.close();
}
void TokenRequest::ParseData(const QString& data, bool net) {
m_data = data;
QStringList params = data.split("_");
if (2 != params.count()) {
QTimer::singleShot(m_interval, []() { qApp->exit(1); });
return;
}
// Success代表正常、Failed代表失败要关闭。下划线NeedNet表示写入配置项需要有网络无网络访问则关闭。下划线NoNet表示写入配置项不需要网络无网络正常运行。
if (net) {
if ("Failed" == params[0]) {
qDebug() << __FUNCTION__ << "exit Failed" << data;
SaveConfig();
qApp->exit(1);
return;
}
} else {
if ("NeedNet" == params[1]) {
qDebug() << __FUNCTION__ << "exit NeedNet" << data;
SaveConfig();
qApp->exit(1);
return;
}
}
SaveConfig();
}
void TokenRequest::Request() {
QUrlQuery query;
query.addQueryItem("room", m_room);
QUrl url(m_url);
url.setQuery(query);
QNetworkRequest request(url);
auto reply = m_networkAccessManager->get(request);
connect(reply, &QNetworkReply::finished, this, &TokenRequest::RequestFinished);
connect(reply, &QNetworkReply::errorOccurred, this, &TokenRequest::ErrorOccurred);
}
void TokenRequest::RequestFinished() {
QNetworkReply* reply = (QNetworkReply*)sender();
QNetworkReply::NetworkError err = reply->error();
if (err != QNetworkReply::NoError) {
qDebug() << "Failed: " << reply->errorString();
} else {
// 获取返回内容
const QString data = reply->readAll();
ParseData(data, true);
}
reply->deleteLater();
}
void TokenRequest::ErrorOccurred(QNetworkReply::NetworkError) {
ParseData(m_data, false);
}