📄 updaterservermanager.cpp.svn-base
字号:
#include "updaterservermanager.h"
#include "pubfuncs.h"
#include "downloadprogress.h"
#include "../UpdateXmlPlist.h"
#include "IClientCenter.h"
#include <QtGui>
#include <QFileDialog>
#include "CommonFileOperFunction.h"
#include "FtpThread.h"
static QListWidget* pSoftList = 0;
static QListWidget* pPackList = 0;
static QListWidgetItem* lastEditSoftItem = 0;
static QListWidgetItem* lastPackItem = 0;
static CUpdatePack* lastPackData = 0;
static CUpdateXmlPlistTree::EachSoftUpdate* lastSoft = 0;
static QString currentSoftname;
const QString PATHSPILTER = "/";
//更新的队列
struct UpdateDeque
{
struct OneRecode
{
enum ORType
{
addsoft,
removesoft,
renamesoft,
removepack,
modifypack
};
QString name[2];
QString localefilepath;//本地的文件路径,如果type为add,将被上传
QString serverfilepath;//服务器上的文件路径,如果type为remove,服务器上的将被删除
ORType type;//更新的类型
};
static QStringList splitPath(const QString& obj)
{
return obj.split(PATHSPILTER, QString::SkipEmptyParts);
}
typedef std::list<OneRecode> TListRecodes;
typedef TListRecodes::iterator TIterRecode;
TListRecodes d;
TIterRecode begin() {return d.begin();}
TIterRecode end() {return d.end();}
int size() {return SIZE(d);}
void clear()
{
d.clear();
}
OneRecode* push_back(OneRecode::ORType type)
{
OneRecode xx;
xx.type = type;
d.push_back(xx);
return getLastRecode();
}
OneRecode* getLastRecode()
{
if (!SIZE(d)) return 0;
TIterRecode plast = end();
--plast;
return &*plast;
}
OneRecode* find(const QString& softname, const QString& packname)
{
TIterRecode iterrecode = begin();
while (iterrecode != end())
{
if (iterrecode->name[0] == softname && iterrecode->name[1] == packname)
{
return &*iterrecode;
}
}
return 0;
}
bool existType(OneRecode::ORType _type)
{
TIterRecode iterRecode = begin();
while (iterRecode != end())
{
if (iterRecode->type == _type)
{
return true;
}
++iterRecode;
}
return false;
}
};
static UpdateDeque gUpdateDeque;
UpdaterServerManager::UpdaterServerManager(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
downloadServerPlist();
//运行 客户端-服务器 更新
wFtpParam objParam;
objParam.address = getClientCenter()->ftpAddress;
objParam.port =getClientCenter()->ftpPort;
objParam.usr = "Manager";
objParam.pwd = "Manager";
pFtpOperator = new wFtpOperator(objParam);
connect(pFtpOperator, SIGNAL(transferProgress(qint64 , qint64 )),
this, SLOT(on_ftp_transfer_progress(qint64, qint64)));
connect(pFtpOperator, SIGNAL(filetransferFinished(bool)),
this, SLOT(on_ftp_transfer_finished(bool)));
connect(pFtpOperator, SIGNAL(allCommandsFinished()),
this, SLOT(on_ftp_cmds_finished()));
}
UpdaterServerManager::~UpdaterServerManager()
{
pubfunc::release(pFtpOperator);
}
void UpdaterServerManager::on_ftp_transfer_progress(qint64 size, qint64 total)
{
ui.progressEach->setRange(0, total);
ui.progressEach->setValue(size);
}
static int currentindex = 0;
static int totalsize = 0;
static bool needInfoMsg = false;
void UpdaterServerManager::on_ftp_transfer_finished(bool download)
{
if (download) return;
currentindex++;
ui.progressSubmit->setValue(currentindex);
if (currentindex == totalsize)
{
needInfoMsg = true;
}
}
void UpdaterServerManager::on_ftp_cmds_finished()
{
if (needInfoMsg)
{
ui.progressSubmit->setRange(0,100);
ui.progressSubmit->setValue(100);
ui.progressEach->setRange(0,100);
ui.progressEach->setValue(100);
QMessageBox::information(this, tr("info"), tr("commands acomplished"));
needInfoMsg = false;
}
}
//提交所有的更改
void UpdaterServerManager::on_submit_clicked()
{
//初始化主进度栏
currentindex = 0;
//遍历所有的记录数据,发现需要上传的补丁则上传
UpdateDeque::TIterRecode iterRecode = gUpdateDeque.begin();
while (iterRecode != gUpdateDeque.end())
{
pFtpOperator->intodirectory("~");//先返回至根目录
const UpdateDeque::OneRecode* pRecode = &*iterRecode;
//根据记录的类型进行同步
switch (pRecode->type)
{
case UpdateDeque::OneRecode::addsoft://新增一个软件
pFtpOperator->createdirectory(pRecode->name[0]);
break;
case UpdateDeque::OneRecode::removesoft://移除一个软件
pFtpOperator->removedirectory(pRecode->name[0]);
break;
case UpdateDeque::OneRecode::modifypack://新增一个补丁
totalsize++;
pFtpOperator->upload(pRecode->localefilepath, pRecode->serverfilepath);
break;
case UpdateDeque::OneRecode::renamesoft://修改软件名称
pFtpOperator->renamedirectory(pRecode->name[0], pRecode->name[1]);
break;
case UpdateDeque::OneRecode::removepack://移除补丁
pFtpOperator->intodirectory(pRecode->name[0]);
pFtpOperator->removefile(pRecode->name[1]);
break;
}
++iterRecode;
}
gUpdateDeque.clear();
//保存文件
getUpdateXmlPlistServerTree()->saveToPlistServer("./_recipes/server.plist");
//上传服务器端的文件
pFtpOperator->intodirectory("~");//根目录
pFtpOperator->upload("./_recipes/server.plist", "server.plist");
//运行更新
pFtpOperator->ProcOperations();
//设置
ui.progressSubmit->setRange(currentindex, totalsize ? totalsize : 100);
ui.progressSubmit->setValue(totalsize ? currentindex : 100);
//
needInfoMsg = true;
}
void UpdaterServerManager::downloadServerPlist()
{
DownloadProgress download;
download.exec();
if (!download.sucess)
{
QApplication::exit(0);
}
pSoftList = ui.SoftList;
pPackList = ui.PackList;
connect(pSoftList, SIGNAL(itemClicked(QListWidgetItem*)),
this, SLOT(on_list_soft_itemclick(QListWidgetItem*)));
connect(pSoftList, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
this, SLOT(on_list_soft_itemdoubleclick(QListWidgetItem*)));
connect(pSoftList, SIGNAL(itemChanged(QListWidgetItem*)),
this, SLOT(on_list_soft_itemchange(QListWidgetItem*)));
connect(pPackList, SIGNAL(itemSelectionChanged()),
this, SLOT(on_list_pack_itemselchanged()));
putPacksIntoList();
}
void UpdaterServerManager::putPacksIntoList()
{
pSoftList = ui.SoftList;
pPackList = ui.PackList;
pSoftList->clear();
pPackList->clear();
CUpdateXmlPlistTree* pServerPlist = (CUpdateXmlPlistTree*)getUpdateXmlPlistServerTree();
CUpdateXmlPlistTree::TIterEachSoftware iterSoft = pServerPlist->begin();
while (iterSoft != pServerPlist->end())
{
CUpdateXmlPlistTree::EachSoftUpdate* pSoft = &iterSoft->second;
pSoftList->addItem(pSoft->softName);
++iterSoft;
}
}
void UpdaterServerManager::softitemCloseEdit(bool autosel)
{
if (lastEditSoftItem)
{
pSoftList->closePersistentEditor(lastEditSoftItem);
if (autosel)
pSoftList->setCurrentItem(lastEditSoftItem);
softitemTextEdited(lastEditSoftItem);
lastEditSoftItem = 0;
}
QListWidgetItem* pitem = pSoftList->currentItem();
if (pitem)
{
currentSoftname = pitem->text();
}
}
//修改软件名称
void UpdaterServerManager::softitemTextEdited(QListWidgetItem* item)
{
QString editedname = item->text();
if (editedname == currentSoftname)
return;//没有修改
getUpdateXmlPlistServerTree()->renameSoft(currentSoftname, editedname);
//放入修改队列,由于是修改软件名称,所以name的0为软件原始名称,1为更新名称
UpdateDeque::OneRecode* precode = gUpdateDeque.push_back(UpdateDeque::OneRecode::renamesoft);
precode->name[0] = currentSoftname;
precode->name[1] = editedname;
}
void UpdaterServerManager::on_list_soft_itemclick(QListWidgetItem *item)
{
if (lastEditSoftItem && lastEditSoftItem != item)
{
softitemCloseEdit();
}
currentSoftname = item->text();
CUpdateXmlPlistTree* pServerTree = (CUpdateXmlPlistTree*)getUpdateXmlPlistServerTree();
//刷新packlist
pPackList->clear();
ui.comboBoxValidPacks->clear();
ui.comboBoxValidPacks->addItem("-----");
ui.listPackDependPacks->clear();
if (pServerTree->isSoftFound(currentSoftname))
{
CUpdateXmlPlistTree::TIterEachSoftware objsoft = pServerTree->findSoft(currentSoftname);
CUpdateXmlPlistTree::EachSoftUpdate* pObjSoft = &objsoft->second;
CUpdateXmlPlistTree::EachSoftUpdate::TIterEachPack iterPack = pObjSoft->begin();
while (iterPack != pObjSoft->end())
{
CUpdatePack* pPack = &*iterPack;
//放入补丁的信息
pPackList->addItem(new QListWidgetItem(pPack->name));
//初始化依赖pack可供选择的列表
ui.comboBoxValidPacks->addItem(pPack->name);
++iterPack;
}
ui.comboBoxValidPacks->setCurrentIndex(0);
}
//设置补丁的当前软件字段
ui.editPackSoft->setText(item->text());
}
//当pack表换选时,需要栓新项目数据显示
void UpdaterServerManager::on_list_pack_itemselchanged()
{
QListWidgetItem* ppackitem = pPackList->currentItem();
QListWidgetItem* psoftitem = pSoftList->currentItem();
if (!ppackitem || !psoftitem)
{
return;
}
QString softname = psoftitem->text();
QString packname = ppackitem->text();
//找到对应的软件
CUpdateXmlPlistTree* pServerTree = (CUpdateXmlPlistTree*)getUpdateXmlPlistServerTree();
CUpdateXmlPlistTree::EachSoftUpdate* pSoft = &pServerTree->findSoft(softname)->second;
CUpdatePack* pPack = pSoft->findPackPt(packname);
bool exist = pPack;//是否存在该补丁,不存在则清空所有的显示
//刷新数据
//刷新依赖项
ui.listPackDependPacks->clear();
if (exist)
{
CUpdatePack::TIterDependPack iterDependPack = pPack->dependPacksBegin();
while (iterDependPack != pPack->dependPacksEnd())
{
ui.listPackDependPacks->addItem(iterDependPack->first);
++iterDependPack;
}
}
//其他数据,均输出直接复制的
ui.editPackPublishTime->setText(QString::number(pPack ? pPack->publishTime : 0));
ui.editPackFileName->setText(pPack ? pPack->packName : "");
ui.editPackSize->setText(pPack ? pPack->packSize : "");
ui.editPackMd5->setText(pPack ? pPack->md5 : "");
ui.textPackInfo->setHtml(pPack ? pPack->info : "");
ui.editPackName->setText(pPack ? pPack->name : "");
ui.editPackSoft->setText(pPack ? pPack->softname : softname);
ui.editPackSoftMinTime->setText(QString::number(pPack ? pPack->minSoftTime : 0));
ui.checkPackSelfUpdater->setChecked(pPack ? pPack->isSelfUpdate : false);
ui.checkPackShowUi->setChecked(pPack ? pPack->needUiShow : false);
ui.checkDebug->setChecked(pPack ? pPack->debugmode : false);
ui.checkMustdownload->setChecked(pPack ? pPack->mustdownload : false);
ui.editPackPath->setText("");//清空路径
ui.editPackSoftKey->setText(QString::number(pPack ? pPack->appendKey : 1));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -