qt/LedOK/wDevicesManager/wupgradeapkitem.cpp
2022-10-27 15:07:45 +08:00

526 lines
19 KiB
C++
Raw 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 "wupgradeapkitem.h"
#include "tools.h"
#include "base/x_uimsgboxok.h"
#include "passwordindlg.h"
#include <QMessageBox>
#include <QJsonValue>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QProgressBar>
#include <globaldefine.h>
#include <QSizePolicy>
#include <QUuid>
#include <QMap>
#include <QMessageBox>
#include <QHostAddress>
#include <QInputDialog>
#include <QTextCodec>
wUpgradeApkItem::wUpgradeApkItem(LedCard *pLedCard, LoQTreeWidget *parent, QWidget *pWnd) :
QObject(parent),
QTreeWidgetItem(UserType),
m_parent(parent)
{
m_pWnd=pWnd;
m_pLedCard=pLedCard;
pHpptClient = new HpptClient(this);
connect(pHpptClient,SIGNAL(httpPostRspReady(QString , QString , QByteArray )),this,SLOT(OnProHttpResponse(QString , QString , QByteArray)));
init();
}
wUpgradeApkItem::~wUpgradeApkItem()
{
if(pHpptClient!=nullptr)
{
qDebug() <<"delete pHpptClient in ~wUpgradeApkItem";
delete pHpptClient;
pHpptClient=nullptr;
}
}
void wUpgradeApkItem::init()
{
setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
setCheckState(0, Qt::Unchecked);
m_parent->addTopLevelItem(this);
m_ImageOnline = new QLabel();
m_ImageOnline->setStyleSheet("margin-top:12px; margin-bottom:12px");
m_parent->setItemWidget(this, ENUM_DEVICE_PUBLISH_HEADE_ONLINE, m_ImageOnline);
m_ImageOnline->setAlignment(Qt::AlignCenter);
for(int i=1; i<ENUM_DEVICE_PUBLISH_HEADE_END; i++) {
setTextAlignment(i, Qt::AlignCenter);
}
//setTextAlignment(ENUM_DEVICE_PUBLISH_HEADE_REMARKS, Qt::AlignCenter);
SetItemParam(m_pLedCard);
m_pProgress = new QProgressBar();
// progress->setMaximumHeight(16);
m_pProgress->setStyleSheet("margin-top:12px; margin-bottom:12px");
//setData(ENUM_DEVICE_PUBLISH_HEADE_PROGRESS,)
m_parent->setItemWidget(this, ENUM_DEVICE_PUBLISH_HEADE_PROGRESS, m_pProgress);
m_pProgress->setAlignment(Qt::AlignCenter);
QSizePolicy policy = m_pProgress->sizePolicy();
policy.setHorizontalStretch(1);
policy.setVerticalStretch(1);
policy.setHorizontalPolicy(QSizePolicy::Expanding);
m_pProgress->setSizePolicy(policy);
m_pProgress->setValue(0);
m_pProgress->setFixedWidth(100);
//启动心跳监测设备在线和下线3次超时表示下线
OnCheckSoftVersions();
OnCheckFpgaVersions();
}
void wUpgradeApkItem::SetLockFlagFalse()
{
m_lockFlag=false;
}
void wUpgradeApkItem::refreshLable()
{
}
void wUpgradeApkItem::OnCheckFpgaVersions()
{
m_strUrl="http://"+m_pLedCard->m_strCardIp+":2016/settings";
QJsonObject json1;
json1.insert("_id", getRandomString(10));
json1.insert("_type", "CheckHardwareVersions");
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json1);
}
void wUpgradeApkItem::OnCheckSoftVersions()
{
m_strUrl="http://"+m_pLedCard->m_strCardIp+":2016/settings";
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "CheckSoftVersions");
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json);
}
extern QWidget *gMainWin;
void wUpgradeApkItem::onVerifyLockPassword() {
bool ok;
auto pwd = QInputDialog::getText(gMainWin, tr("Input password"), tr("Input password"), QLineEdit::Password, QString(), &ok);
if(! ok) return;
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "VerifyPassword");
json.insert("pwd", pwd);
m_strUrl = "http://"+m_pLedCard->m_strCardIp+":2016/settings";
HttpPostByTypeJsonObject(pHpptClient, m_strUrl, json);
}
void wUpgradeApkItem::SetPasswordItem(LedCard *p){
if(p->bPassword) {//加过密
if(m_bnLock==nullptr){
m_bnLock = new QPushButton(m_pWnd);
m_bnLock->setStyleSheet("background-color:transparent;");
m_bnLock->setStyleSheet("margin-left:12px; margin-right:12px;margin-top:12px; margin-bottom:12px;");
m_parent->setItemWidget(this, ENUM_DEVICE_PUBLISH_HEADE_ENCRYPT, m_bnLock);
connect(m_bnLock, SIGNAL(clicked()), this, SLOT(onVerifyLockPassword()));
}
if(p->m_bLockStatus) m_bnLock->setIcon(QIcon(":/res/DeviceManager/Lock.png")); //如果已经验证通过密码显示绿色图标
else m_bnLock->setIcon(QIcon(":/res/DeviceManager/UnLock.png")); //如果没有验证显示蓝色锁图标
m_parent->setItemWidget(this, ENUM_DEVICE_PUBLISH_HEADE_ENCRYPT, m_bnLock);
}
}
void wUpgradeApkItem::onUninstallApk(QString strApkName){
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "UninstallSoftware");
json.insert("packageName", strApkName);
m_strUrl="http://"+m_pLedCard->m_strCardIp+":2016/settings";
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json);
if(strApkName=="com.xixun.xixunplayer"){
QString strtemp=this->text(ENUM_DEVICE_PUBLISH_HEADE_XIXUNPLAYER_VERSION);
if(strtemp.isEmpty()) return;
}else if(strApkName=="com.xixun.joey.cardsystem"){
QString strtemp=this->text(ENUM_DEVICE_PUBLISH_HEADE_CARDSYSTEM_VERSION);
if(strtemp.isEmpty()) return;
}else if(strApkName=="net.sysolution.taxiapp"){
QString strtemp=this->text(ENUM_DEVICE_PUBLISH_HEADE_TAXIAPP_VERSION);
if(strtemp.isEmpty()) return;
}
else if(strApkName=="net.sysolution.starter")
{
QString strtemp=this->text(ENUM_DEVICE_PUBLISH_HEADE_STARTER_VERSION);
if(strtemp.isEmpty())
return;
}
else if(strApkName=="com.xixun.display")
{
QString strtemp=this->text(ENUM_DEVICE_PUBLISH_HEADE_DISPLAYER_VERSION);
if(strtemp.isEmpty())
return;
}
else if(strApkName=="com.xixun.xy.conn")
{
QString strtemp=this->text(ENUM_DEVICE_PUBLISH_HEADE_CONNECTION_VERSION);
if(strtemp.isEmpty())
return;
}
else if(strApkName=="com.xixun.xy.update")
{
QString strtemp=this->text(ENUM_DEVICE_PUBLISH_HEADE_UPDATE_VERSION);
if(strtemp.isEmpty())
return;
}
OnSendStatusTip(tr("uninstalling"),Qt::blue);
}
void wUpgradeApkItem::onCheckRuningState(QString strApkName)
{
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "IsSoftwareRunning");
json.insert("packageName", strApkName);
m_strUrl="http://"+m_pLedCard->m_strCardIp+":2016/settings";
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json);
OnSendStatusTip(tr("IsSoftwareRunning"),Qt::blue);
}
void wUpgradeApkItem::onUpgradeApk(QString strFileName)
{
if(m_pLedCard->bPassword)
{
if(m_pLedCard->m_bLockStatus&&m_lockFlag == true)
{
OnSendStatusTip(tr("This screen is encrypted"),Qt::red);
return;
}
}
if(m_iSendingFlag==1)
{
return;
}
m_strApkFilePathName=strFileName;
OnSendStatusTip(tr("Start upgrading"),Qt::blue);
/* 发送连接请求 */
ThreadUpgradeApk *m_pThreadSendPro=nullptr;
QString url="http://"+m_pLedCard->m_strCardIp+":2016/upload?type=software";
m_pThreadSendPro = new ThreadUpgradeApk(strFileName,url,0);
this->moveToThread(m_pThreadSendPro);
connect(m_pThreadSendPro,SIGNAL(sigSetLableText(QString)),this,SLOT(OnSendStatusTip(QString)));
connect(m_pThreadSendPro,SIGNAL(sigSetProgressValue(int)),m_pProgress,SLOT(setValue(int)));
connect(m_pThreadSendPro,SIGNAL(sigTimerOut()),m_pProgress,SLOT(slotTimeout()));
m_pProgress->setMaximum(100);
// connect(m_pThreadSendPro,SIGNAL(sigSetProgressMax(int)),m_pProgress,SLOT(setMaximum(int)));
connect(m_pThreadSendPro,SIGNAL(sigFinished()),this,SLOT(OnThreadFinished()));
connect(this,SIGNAL(sigUpgradeSuccess()),m_pThreadSendPro,SLOT(OnUpgradeSuccess()));
connect(this,SIGNAL(sigUpgradeFail()),m_pThreadSendPro,SLOT(OnUpgradeFail()));
m_iSendingFlag=1;
m_pProgress->setValue(0);
m_pThreadSendPro->start();
}
void wUpgradeApkItem::onUpgradeFpga(QString strFileName)
{
if(m_pLedCard->bPassword)
{
if(m_pLedCard->m_bLockStatus&&m_lockFlag == true)
{
OnSendStatusTip(tr("This screen is encrypted"),Qt::red);
return;
}
}
if(m_iSendingFlag==1)
{
return;
}
m_strFpgaFilePathName=strFileName;
OnSendStatusTip(tr("Start upgrading"),Qt::blue);
/* 发送连接请求 */
ThreadUpgradeApk *m_pThreadSendPro=nullptr;
QString url="http://"+m_pLedCard->m_strCardIp+":2016/upload?type=hardware";
m_pThreadSendPro = new ThreadUpgradeApk(strFileName,url,1);
this->moveToThread(m_pThreadSendPro);
connect(m_pThreadSendPro,SIGNAL(sigSetLableText(QString)),this,SLOT(OnSendStatusTip(QString)));
connect(m_pThreadSendPro,SIGNAL(sigSetProgressValue(int)),m_pProgress,SLOT(setValue(int)));
connect(m_pThreadSendPro,SIGNAL(sigTimerOut()),m_pProgress,SLOT(slotTimeout()));
m_pProgress->setMaximum(100);
// connect(m_pThreadSendPro,SIGNAL(sigSetProgressMax(int)),m_pProgress,SLOT(setMaximum(int)));
connect(m_pThreadSendPro,SIGNAL(sigFpgaFinished()),this,SLOT(OnThreadFpgaFinished()));
connect(this,SIGNAL(sigUpgradeSuccess()),m_pThreadSendPro,SLOT(OnUpgradeSuccess()));
connect(this,SIGNAL(sigUpgradeFail()),m_pThreadSendPro,SLOT(OnUpgradeFail()));
m_iSendingFlag=1;
m_pProgress->setValue(0);
m_pThreadSendPro->start();
}
void wUpgradeApkItem::slotTimeout()
{
OnSendStatusTip(tr("Timeout"));
m_iSendingFlag=0;
OnCheckSoftVersions();
OnCheckFpgaVersions();
}
void wUpgradeApkItem::OnSendStatusTip(QString strTip)
{
QCoreApplication::processEvents();
setData(ENUM_DEVICE_PUBLISH_HEADE_REMARKS, 0, strTip);
this->setTextColor(ENUM_DEVICE_PUBLISH_HEADE_REMARKS,Qt::blue);
if(strTip==tr("Timeout"))
{
}
}
void wUpgradeApkItem::OnSendStatusTip(QString strTip,QColor cr)
{
QCoreApplication::processEvents();
setData(ENUM_DEVICE_PUBLISH_HEADE_REMARKS, 0, strTip);
this->setTextColor(ENUM_DEVICE_PUBLISH_HEADE_REMARKS,cr);
}
void wUpgradeApkItem::OnThreadFinished()
{
m_iSendingFlag=0;
m_pProgress->setValue(100);
qDebug()<<"OnThreadFinished";
QFileInfo file(m_strApkFilePathName);
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "UpgradeSoftware");
json.insert("fileName", file.fileName());
json.insert("isCustom", true);
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json);
OnSendStatusTip(tr("install start..."),Qt::blue);
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json);
}
void wUpgradeApkItem::OnThreadFpgaFinished()
{
m_iSendingFlag=0;
m_pProgress->setValue(100);
qDebug()<<"OnThreadFinished";
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "SynchronousHardwareVersion");
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json);
OnSendStatusTip(tr("SynchronousHardwareVersion"),Qt::blue);
}
void wUpgradeApkItem::SetItemParam(LedCard *p)
{
setData(ENUM_DEVICE_PUBLISH_HEADE_SCREEN_ID, 0, p->m_strCardId);
setData(ENUM_DEVICE_PUBLISH_HEADE_SCREEN_IP, 0, p->m_strCardIp);
m_pLedCard->m_strCardId=p->m_strCardId;
m_pLedCard->m_strCardIp=p->m_strCardIp;
m_pLedCard->m_bOnLine=p->m_bOnLine;
// setData(ENUM_DEVICE_PUBLISH_HEADE_SCREEN_SIZE, 0, QString("%1 x %2").arg(p->m_iWidth).arg(p->m_iHeight));
if(m_pLedCard->m_bOnLine)
{
m_ImageOnline->setPixmap(QPixmap(":/res/DeviceManager/O_Online.png"));
}
else
{
m_ImageOnline->setPixmap(QPixmap(":/res/DeviceManager/O_Offline.png"));
}
SetPasswordItem(m_pLedCard);
setData(ENUM_DEVICE_PUBLISH_HEADE_REMARK_NAME, 0, p->m_strCardRemarkName);
OnCheckSoftVersions();
OnCheckFpgaVersions();
// //progresss.append(progress);
// QTableWidgetItem *topLevelItem = new QTableWidgetItem(); //创建一个 TreeItem 容器用于后来装载控件
// topLevelItem->setData(0,listProgramName->at(i));
// topLevelItem->setFlags(topLevelItem->flags() & ~Qt::ItemIsEnabled & ~Qt::ItemIsSelectable);
// /*上面用到的两个枚举中:~Qt::ItemIsEnabled可以保证单击该Item时不会被选中但是在启用Ctrl + A时全选操作会导致Item被选中。
// * ~Qt::ItemIsSelectable的使用可以保证全选状态下也不会被选中但是在单独使用时出现了虚线框没有真正实现“不存在”的效果。所以必须两个同用。*/
// ctrlProgramList->setItem(i,0,topLevelItem);
// ctrlProgramList->setCellWidget(i, 1, progress);
}
QString wUpgradeApkItem::getRandomString(int length)
{
qsrand(QDateTime::currentMSecsSinceEpoch());
const char ch[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int size = sizeof(ch);
char* str = new char[length + 1];
int num = 0;
for (int i = 0; i < length; ++i)
{
num = rand() % (size - 1);
str[i] = ch[num];
}
QString res(str);
return res;
}
/////////////////////////////////////////////////
void wUpgradeApkItem::OnProHttpResponse(QString url, QString postMD5, QByteArray data)
{
Q_UNUSED(postMD5)
//qDebug()<< url + "\r\n"+m_strUrl;
if(url == m_strUrl)
{
// qDebug()<<"POST";
//qDebug()<<postMD5;
//qDebug()<<data;
QJsonParseError parseJsonErr;
QJsonDocument document = QJsonDocument::fromJson(data,&parseJsonErr);
if(!(parseJsonErr.error == QJsonParseError::NoError))
{
if(data.size()==0)
qDebug()<<"json is empty";
else
qDebug()<<"DeviceItem OnProHttpResponse 解析json文件错误";
return;
}
QJsonObject jsonObject = document.object();
QString strType=jsonObject["_type"].toString();
if(jsonObject["success"].toBool()==true)
{
qDebug()<<m_pLedCard->m_strCardId +"---------"+ strType;
if(strType=="TaskCommand" )//发送节目命令应答
{
qDebug()<<"commandXixunPlayer response successed";
}
else if(strType == "HasControllerPassword")
{
//if(m_pLedCard->bPassword!=jsonObject["result"].toBool())
{
m_pLedCard->bPassword=jsonObject["result"].toBool();
SetPasswordItem(m_pLedCard);
}
}
else if(strType == "VerifyPassword")
{
bool bStatus=jsonObject["result"].toBool();
if(bStatus)//解密成功
{
qDebug()<<"解密成功";
m_pLedCard->m_bLockStatus=false;
}
else
{
qDebug()<<"解密失败";
m_pLedCard->m_bLockStatus=true;
X_UIMsgBoxOk *mb = new X_UIMsgBoxOk(tr("Tip Info"),tr("password is wrong"), m_pWnd,0);
mb->exec();
}
SetPasswordItem(m_pLedCard);
}
else if(strType == "UninstallSoftware")
{
OnSendStatusTip(tr("UninstallSoftware")+tr("Success")+"!",Qt::green);
}
else if(strType == "IsSoftwareRunning")
{
if(jsonObject["running"].toBool())
{
OnSendStatusTip(tr("Running")+"!",Qt::green);
}
else {
OnSendStatusTip(tr("NoRunning")+"!",Qt::red);
}
}
else if(strType =="UpgradeSoftware")
{
emit sigUpgradeSuccess();
OnSendStatusTip(tr("install success"),Qt::green);
OnCheckSoftVersions();
}
else if(strType == "SynchronousHardwareVersion"){
emit sigUpgradeSuccess();
OnSendStatusTip(tr("SynchronousHardwareVersion")+tr("Success"),Qt::green);
OnCheckFpgaVersions();
}
else if(strType =="CheckHardwareVersions")
{
QString strtempVer="";
int itempVerCount=0;
foreach(QJsonValue value, jsonObject["versions"].toArray()) {
QString strtempIcount=QString::number(itempVerCount);
if(itempVerCount==0)
strtempVer += "["+strtempIcount+"]:"+value.toString();
else
strtempVer +="\r\n["+strtempIcount+"]:"+value.toString();
itempVerCount++;
}
setData(ENUM_DEVICE_PUBLISH_HEADE_FPAG_VERSION, 0, strtempVer);
}
else if(strType == "CheckSoftVersions"){
QString strTip="";
QStringList strtempApkPackList;
foreach(QJsonValue value, jsonObject["apps"].toArray()) {
QJsonObject oApp = value.toObject();
QString strtempApkPackageName=oApp["packageName"].toString();
QString strtempVersion=oApp["versionName"].toString();
if(strtempApkPackageName=="com.xixun.xixunplayer")
setData(ENUM_DEVICE_PUBLISH_HEADE_XIXUNPLAYER_VERSION, 0, strtempVersion);
else if(strtempApkPackageName=="com.xixun.joey.cardsystem")
setData(ENUM_DEVICE_PUBLISH_HEADE_CARDSYSTEM_VERSION, 0, strtempVersion);
else if(strtempApkPackageName=="net.sysolution.starter")
setData(ENUM_DEVICE_PUBLISH_HEADE_STARTER_VERSION, 0, strtempVersion);
else if(strtempApkPackageName=="net.sysolution.taxiapp")
setData(ENUM_DEVICE_PUBLISH_HEADE_TAXIAPP_VERSION, 0, strtempVersion);
else if(strtempApkPackageName=="com.xixun.display")
setData(ENUM_DEVICE_PUBLISH_HEADE_DISPLAYER_VERSION, 0, strtempVersion);
else if(strtempApkPackageName=="com.xixun.xy.conn")
setData(ENUM_DEVICE_PUBLISH_HEADE_CONNECTION_VERSION, 0, strtempVersion);
else if(strtempApkPackageName=="com.xixun.xy.update")
setData(ENUM_DEVICE_PUBLISH_HEADE_UPDATE_VERSION, 0, strtempVersion);
// else if(strtempApkPackageName=="net.sysolution.basicapp")
// setData(ENUM_DEVICE_PUBLISH_HEADE_BASICAPP_VERSION, 0, strtempVersion);
strtempApkPackList.append(strtempApkPackageName);
}
}
}
else//失败应答,打印失败和错误信息
{
if(strType == "UninstallSoftware")
{
OnSendStatusTip(tr("UninstallSoftware")+tr("Fail")+"!",Qt::red);
}
else if(strType == "IsSoftwareRunning")
{
OnSendStatusTip(tr("IsSoftwareRunning")+tr("Fail")+"!",Qt::red);
}
else if(strType =="UpgradeSoftware")
{
emit sigUpgradeFail();
OnCheckSoftVersions();
}
else if(strType =="SynchronousHardwareVersion")
{
emit sigUpgradeFail();
OnCheckFpgaVersions();
}
}
}
}