code_app/app/scanner/dialog_upgrade.cpp

159 lines
4.9 KiB
C++

#include "dialog_upgrade.h"
#include "ui_dialog_upgrade.h"
#include "base/HGUtility.h"
#include <QCryptographicHash>
#include <QMessageBox>
#include <QDir>
#include <QFile>
Dialog_upgrade::Dialog_upgrade(class VersionDll *versionDll, QWidget *parent) :
QDialog(parent)
, ui(new Ui::Dialog_upgrade)
, m_versionDll(versionDll)
{
ui->setupUi(this);
setWindowTitle(tr("upgrade online"));
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
this->layout()->setSizeConstraint(QLayout::SetFixedSize);
ui->listWidget->setVisible(false);
ui->pbtn_upgrade->setVisible(false);
ui->pbtn_install->setVisible(false);
ui->pbtn_cancel->setVisible(false);
ui->label->setVisible(false);
HGVersionInfo *versionInfo = NULL;
HGUInt versionCount = 0;
m_versionDll->GetVersionList(HGVERSION_APPNAME_SCANNER, &versionInfo, &versionCount);
for(HGUInt i = 0; i < versionCount; ++i)
{
QListWidgetItem *listwidgetItem = new QListWidgetItem;
listwidgetItem->setText(QString(versionInfo[i].version));
listwidgetItem->setData(Qt::UserRole, versionInfo[i].url);
listwidgetItem->setData(Qt::UserRole+1, versionInfo[i].md5);
listwidgetItem->setToolTip(tr("upgrade contents: ") + versionInfo[i].desc + tr(" bug description: ") + versionInfo[i].bugInfo);
ui->listWidget->addItem(listwidgetItem);
}
if(ui->listWidget->count() > 0)
{
QListWidgetItem *item = ui->listWidget->item(0);
item->setSelected(true);
}
HGChar currVersion[64] = {0};
m_versionDll->GetCurrVersion(HGVERSION_APPNAME_SCANNER, currVersion, 64);
HGInt result = 0;
std::string newestVersionNum = ui->listWidget->item(0)->text().toStdString().c_str();
m_versionDll->CompareVersion(currVersion, newestVersionNum.c_str(), &result);
if(result == 0)
{
ui->label_detectResult->setText(tr("The current version is the latest! The current version number is : ") + currVersion);
ui->pbtn_upgrade->setVisible(false);
return;
}
else
{
ui->pbtn_upgrade->setVisible(true);
ui->label_detectResult->setText(tr("Discover the new version : ") +
ui->listWidget->item(0)->text().toStdString().c_str() +
tr(" ,the current version is : ") + currVersion);
}
connect(ui->listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_listWidget_itemDoubleClicked(QListWidgetItem*)), Qt::QueuedConnection);
m_versionDll->ReleaseVersionList(versionInfo, versionCount);
}
Dialog_upgrade::~Dialog_upgrade()
{
delete ui;
}
void Dialog_upgrade::on_pbtn_install_clicked()
{
QListWidgetItem *item = ui->listWidget->currentItem();
on_listWidget_itemDoubleClicked(item);
close();
}
void Dialog_upgrade::on_pbtn_cancel_clicked()
{
close();
}
void Dialog_upgrade::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
close();
HGChar currVersion[64] = {0};
m_versionDll->GetCurrVersion(HGVERSION_APPNAME_SCANNER, currVersion, 64);
std::string selectVersionNum = item->text().toStdString().c_str();
HGInt result = 0;
m_versionDll->CompareVersion(currVersion, selectVersionNum.c_str(), &result);
if(result == 0)
{
QMessageBox::information(this, tr("tip"), tr("Already in current version"));
return;
}
else
{
QString url = item->data(Qt::UserRole).toString();
QString versionNum = item->text();
QString md5 = item->data(Qt::UserRole+1).toString();
HGChar savePath[512];
HGBase_GetConfigPath(savePath, 512);
HGBase_CreateDir(savePath);
strcat(savePath, (versionNum + QString("%1").arg(".exe")).toLatin1().data());
QFile saveFile(savePath);
saveFile.open(QFile::ReadOnly);
QByteArray fileMsg = saveFile.readAll();
saveFile.close();
QString md5_2 = QCryptographicHash::hash(fileMsg , QCryptographicHash::Md5).toHex();
QFile f(savePath);
if(!f.exists() || md5 != md5_2)
{
Dialog_updateProgress *dlg = new Dialog_updateProgress(m_versionDll, url, savePath);
dlg->exec();
connect(dlg, SIGNAL(upgrade(QString)), this, SLOT(on_upgrade(QString)), Qt::QueuedConnection);
}
else
{
on_upgrade(savePath);
}
}
}
void Dialog_upgrade::on_upgrade(QString pkgPath)
{
emit upgradeApp(pkgPath);
}
void Dialog_upgrade::on_pbtn_selectVersion_clicked()
{
if(ui->listWidget->count() == 0)
{
ui->pbtn_install->setVisible(false);
}
else
{
ui->pbtn_install->setVisible(true);
}
ui->pbtn_selectVersion->setVisible(false);
ui->listWidget->setVisible(true);
ui->pbtn_cancel->setVisible(true);
ui->label->setVisible(true);
}
void Dialog_upgrade::on_pbtn_upgrade_clicked()
{
QListWidgetItem *item = ui->listWidget->item(0);
on_listWidget_itemDoubleClicked(item);
close();
}