Files
fmviewer3/project/fm_viewer/module/fm_version_checker.cpp
2026-02-21 17:11:31 +09:00

296 lines
11 KiB
C++

#include "fm_version_checker.h"
#if (USE_VERSION_CHECK)
#include "../rm_include.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonObject>
#if (RM_MODEL == RM_MODEL_TYPE_TB4000)
static QString VERSION_URL = "https://www.telebit.co.kr/html/download/pcviewer_version.json";
#if(SUB_MODEL_TB5000)
static QString VERSION_MODEL_NAME = "TB5000";
#else // SUB_MODEL_TB5000
static QString VERSION_MODEL_NAME = "TB4000";
#endif // SUB_MODEL_TB5000
#endif // TB4000 + TB5000
#if (RM_MODEL_EMT_KR)
#include "../cfg/rm_settings_cfg_emt_kr.h"
//static const char VERSION_URL[] = "http://fmproject2.iptime.org/emt/nexian/versions.php";
// static const char VERSION_MODEL_NAME[] = "viewer";
static const char VERSION_URL[] = "https://nexiandownload.kr/API/app_data.php";
//static const char VERSION_MODEL_NAME[] = "PCV";
// 모델별 확인되면 해당 URL 로 이동, 확인되지 않으면 NM5000_URL 로 이동
static const char NM5000_URL[] = "https://nexiandownload.kr/download_view.php?TYPE_CD=PCV&PRODUCT_SEQ=&&seq=PST_0011";
static const char MIRROR5_URL[] = "https://nexiandownload.kr/download_view.php?TYPE_CD=PCV&PRODUCT_SEQ=&seq=PST_0012";
static const char NP5000_URL[] = "https://nexiandownload.kr/download_view.php?TYPE_CD=PCV&PRODUCT_SEQ=&seq=PST_0013";
static const char PRO5_URL[] = "https://nexiandownload.kr/download_view.php?TYPE_CD=PCV&PRODUCT_SEQ=&seq=PST_0014";
#endif // @RM_MODEL_EMT_KR
FMVersionChecker* FMVersionChecker::_instance = NULL;
FMVersionChecker::FMVersionChecker(QObject *parent): QObject(parent)
{
_checkedViewer = false;
}
void FMVersionChecker::start()
{
//qInfo() << __FUNCTION__;
//_updates.clear();
// 이미 처리 완료
if(_checkedViewer) {
return;
}
QNetworkAccessManager* manager = new QNetworkAccessManager();
connect(manager,SIGNAL(finished(QNetworkReply*)),SLOT(onFinished(QNetworkReply*)));
QNetworkRequest request;
request.setUrl(QUrl(VERSION_URL));
manager->get(request);
}
// URL 정보 확인 결과
#if (RM_MODEL_EMT_KR)
void FMVersionChecker::onFinished(QNetworkReply* reply)
{
if(reply->error())
{
#if (USER_LOGER)
if(RMApp::instance()->userLog) {
RMApp::instance()->appendLog("ERROR","VERSION_CHECK:" + reply->errorString());
}
#endif
}
else // 정상 수신
{
QString nv = reply->readAll(); // 데이터 불러오기
if (nv.isEmpty()) {
return;
}
_checkedViewer = true;
#if (1) // 양산서버
// <pre>{</pre>
nv = nv.replace("<pre>","").replace("</pre>","");
QJsonDocument doc = QJsonDocument::fromJson(nv.toUtf8());
QJsonObject root = doc.object();
if(!root.contains("models")) {
return;
}
QString currentVersion = QString().sprintf("%d.%d.%d",RM_MODEL_VERSION_0,RM_MODEL_VERSION_1,RM_MODEL_VERSION_2); // ,RM_MODEL_SVN_VERSION
QJsonArray obj = root.value("models").toArray();
for(int i=0;i<obj.size();i++) {
QJsonObject item = obj.at(i).toObject();
if(!item.contains("model") || !item.contains("data")) {
continue;
}
// Pro 5 -> pro5, 실제 모델 확인은 필요 없음
// QString model = item.value("model").toString().replace(" ","").trimmed().toLower();
QJsonObject data = item.value("data").toObject();
if(!data.contains("PCV")) {
continue;
}
QJsonObject pcv = data.value("PCV").toObject();
if(!pcv.contains("version"))
{
continue;
}
QString version = pcv.value("version").toString().toLower().replace("v","").trimmed();
if(version != currentVersion) { //
QMap<QString,QString> info;
for(int j=0;j<pcv.keys().size();j++) {
QString key = pcv.keys().at(j);
info.insert(key,pcv.value(key).toString());
}
emit updateFound(info);
break;
}
} // for
#else // 개발서버
QJsonDocument doc = QJsonDocument::fromJson(nv.toUtf8());
QJsonArray obj = doc.array();
QString currentVersion = QString().sprintf("%d.%d.%d.%d",RM_MODEL_VERSION_0,RM_MODEL_VERSION_1,RM_MODEL_VERSION_2,RM_MODEL_SVN_VERSION);
for(int i=0;i<obj.size();i++) {
QJsonObject item = obj.at(i).toObject();
if(item.contains("model") &&
item.contains("fw") &&
item.value("model").toString().trimmed() == VERSION_MODEL_NAME) {
QJsonObject fwitem = item.value("fw").toObject();
if(fwitem.contains("version"))
{
QString version = fwitem.value("version").toString().trimmed();
//qInfo() << "VERSION CURRENT:" << currentVersion << "SERVER:" << version << __FUNCTION__;
if(version != currentVersion) { //
QMap<QString,QString> info;
for(int j=0;j<fwitem.keys().size();j++) {
QString key = fwitem.keys().at(j);
info.insert(key,fwitem.value(key).toString());
}
emit updateFound(info);
break;
}
} // @if(fwitem.contains("version"))
}
}
#endif // 개발서버
} // else
}
#else // Telebit?
void FMVersionChecker::onFinished(QNetworkReply* reply)
{
if(reply->error())
{
#if (USER_LOGER)
if(RMApp::instance()->userLog) {
RMApp::instance()->appendLog("ERROR","VERSION_CHECK:" + reply->errorString());
}
#endif
}
else // 정상 수신
{
QString nv = reply->readAll(); // 데이터 불러오기
if (nv.isEmpty()) {
return;
}
_checkedViewer = true;
// 에러 처리 -> 이후 제거예정
//nv = nv.replace("},\r\n]","}\r\n]");
QJsonDocument doc = QJsonDocument::fromJson(nv.toUtf8());
QJsonArray obj = doc.array();
QString currentVersion = QString().sprintf("%d.%d.%d",RM_MODEL_VERSION_0,RM_MODEL_VERSION_1,RM_MODEL_VERSION_2);
for(int i=0;i<obj.size();i++) {
QJsonObject item = obj.at(i).toObject();
if(item.contains("name") && item.value("name").toString().trimmed() == VERSION_MODEL_NAME) {
QString iv = item.value("version").toString().trimmed();
if(item.contains("version") && iv.compare(currentVersion) > 0)
{
QMap<QString,QString> info;
for(int j=0;j<item.keys().size();j++) {
QString key = item.keys().at(j);
info.insert(key,item.value(key).toString());
}
emit updateFound(info);
break;
}
}
}
}
}
#endif // EMT/TELEBIT
FMVersionDialog::FMVersionDialog(QMap<QString,QString> update, QWidget *parent) : QDialog(parent,Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint)
{
_info = update;
setWindowTitle(FM_WSTR(L"업데이트 알림"));
setFixedSize(420,220);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->setAlignment(Qt::AlignTop);
layout->setSpacing(15);
setLayout(layout);
// 새로운 버전의 소프트웨어를 사용할 수 있습니다.
QLabel* t1 = new QLabel(this);
t1->setText(FM_WSTR(L"새롭게 업데이트된 버전이 확인되었습니다."));
layout->addWidget(t1);
QFont font = t1->font();
font.setPixelSize(12);
font.setFamily("Arial");
font.setLetterSpacing(QFont::PercentageSpacing,108);
font.setStyleStrategy(QFont::PreferAntialias);
t1->setFont(font);
// 다운로드하려면 아래 URL을 클릭하십시오.
QLabel* t2 = new QLabel(this);
t2->setText(FM_WSTR(L"다운로드하려면 아래 URL을 클릭하십시오."));
t2->setFont(font);
layout->addWidget(t2);
QString currentVersionPrefix = FM_WSTR(L"현재 버전:");
QString nextVersionPrefix = FM_WSTR(L"업데이트된 버전:");
QString typeTitle = FM_WSTR(L"S/W");
QLabel* tt = new QLabel(this);
tt->setFont(font);
tt->setText("<b>" + typeTitle + "</b>");
tt->setFont(font);
layout->addWidget(tt);
QLabel* versions = new QLabel(this);
versions->setIndent(10);
versions->setFont(font);
#if (RM_MODEL_EMT_KR)
QString currentVersion = QString().sprintf("%d.%d.%d",RM_MODEL_VERSION_0,RM_MODEL_VERSION_1,RM_MODEL_VERSION_2);
// → \xe2\x86\x92
versions->setText(currentVersionPrefix + "\t<b>" + currentVersion + "</b>\t" + QString::fromUtf8("\xe2\x86\x92") + "\t" + nextVersionPrefix + "\t<b>" + _info.value("version") + "\t</b>");
#else // RM_MODEL_EMT_KR
QString currentVersion = QString().sprintf("%d.%d.%d",RM_MODEL_VERSION_0,RM_MODEL_VERSION_1,RM_MODEL_VERSION_2);
versions->setText(currentVersionPrefix + "\t<b>" + currentVersion + "</b>\t" + QString::fromUtf8("\xe2\x86\x92") + "\t" + nextVersionPrefix + "\t<b>" + _info.value("version") + "\t</b>");
#endif // RM_MODEL_EMT_KR
layout->addWidget(versions);
// LINK
QLabel* urlLink = new QLabel(this);
urlLink->setFont(font);
#if (RM_MODEL_EMT_KR)
// _info.value("url") 는 무시 각 모델별 다운로드 페이지로 이동
QString url = NM5000_URL;
if (CFG::info.model == NM5000) { // NM5000
// url = NM5000_URL;
} else if (CFG::info.model == NP5000) { // NP5000
url =NP5000_URL;
} else if (CFG::info.model == MIRROR5) { // MIRROR5
url =MIRROR5_URL;
} else if (CFG::info.model == PRO5) { // PRO5
url =PRO5_URL;
}
#else // EMT_KR
QString url = _info.value("url");
#endif // RM_MODEL_EMT_KR
urlLink->setIndent(10);
// _info.value("url")
urlLink->setText("<a href=\"" + url + "\">" + FM_WSTR(L"다운로드 페이지로 이동") + "</a>");
urlLink->setTextFormat(Qt::RichText);
urlLink->setTextInteractionFlags(Qt::TextBrowserInteraction);
urlLink->setOpenExternalLinks(true);
QFont font2 = urlLink->font();
font2.setFamily("Arial");
font2.setPixelSize(14);
urlLink->setFont(font2);
layout->addWidget(urlLink);
// Close
QWidget* buttonWidget = new QWidget(this);
buttonWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
layout->addWidget(buttonWidget);
QHBoxLayout* bl = new QHBoxLayout(buttonWidget);
bl->setAlignment(Qt::AlignBottom | Qt::AlignRight);
QPushButton* closeButton = new QPushButton(buttonWidget);
closeButton->setFixedWidth(100);
closeButton->setFont(font);
closeButton->setText(FM_WSTR(L"닫기"));
connect(closeButton,&QPushButton::clicked,[=]() {
reject();
});
bl->addWidget(closeButton);
}
#endif // #if (USE_VERSION_CHECK)