⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 updaterservermanager.cpp.svn-base

📁 QT写的自动更新程序 自认为不错 请大家参考
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
#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 + -