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

📄 updaterservermanager.cpp.svn-base

📁 QT写的自动更新程序 自认为不错 请大家参考
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
}

//双击,进入修改模式
void UpdaterServerManager::on_list_soft_itemdoubleclick(QListWidgetItem* item)
{
	if (!lastEditSoftItem)
	{
		lastEditSoftItem = item;
	}

	pSoftList->openPersistentEditor(item);
	lastEditSoftItem = item;
}

//增加软件
void UpdaterServerManager::on_addsoft_clicked()
{
	//关闭修改
	softitemCloseEdit();

	const QString oritext(tr("newsoft"));

	//遍历所有的text,不能存在和newsoft 相通的项
	for (int rowi = 0; rowi < pSoftList->count(); rowi++)
	{
		QString itemtext = pSoftList->item(rowi)->text();
		if (itemtext == oritext)
		{
			QMessageBox::information(0, tr("info"), tr("soft exist"));
			return;
		}
	}

	QListWidgetItem* pItem = new QListWidgetItem(pSoftList);
	pItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable);
	pItem->setText(oritext);

	getUpdateXmlPlistServerTree()->addSoft(oritext);

	//放入修改队列
	UpdateDeque::OneRecode* precode = gUpdateDeque.push_back(UpdateDeque::OneRecode::addsoft);
	precode->name[0] = oritext;
}

//移除软件
void UpdaterServerManager::on_removeSoft_clicked()
{
	//关闭soft的修改
	softitemCloseEdit(true);

	//先确定是否可以移除(updatequeue中不存在addsoft项目
	if (gUpdateDeque.existType(UpdateDeque::OneRecode::addsoft))
	{
		QMessageBox::information(this, tr("info"), tr("please submit first"));
		return;
	}

	QListWidgetItem* psoftitem = pSoftList->currentItem();
	if (!psoftitem)
	{
		QMessageBox::information(this, tr("info"), tr("please select a soft"));
		return;
	}

	QString softname = psoftitem->text();
	getUpdateXmlPlistServerTree()->removeSoft(softname);

	//
	UpdateDeque::OneRecode* precode = gUpdateDeque.push_back(UpdateDeque::OneRecode::removesoft);
	precode->name[0] = softname;

	//
	putPacksIntoList();//重新写入列表,qlistwidget的removeitem功能无用
}

//添加补丁
void UpdaterServerManager::on_addPack_clicked()
{
	//关闭soft的修改
	softitemCloseEdit(true);

	const QListWidgetItem* psoftitem = pSoftList->currentItem();
	if (!psoftitem)
	{
		QMessageBox::information(0, tr("info"), tr("please select a soft"));
		return;
	}

	const QString oritext(tr("newpack"));
	//遍历所有的text,不能存在和newsoft 相通的项
	for (int rowi = 0; rowi < pPackList->count(); rowi++)
	{
		QString itemtext = pPackList->item(rowi)->text();
		if (itemtext == oritext)
		{
			QMessageBox::information(0, tr("info"), tr("pack exist"));
			return;
		}
	}

	pPackList->addItem(oritext);
	//由于默认生成的补丁包为所有数值都是空的,所以只有当用户点击 更新补丁信息 按钮后,才真正把补丁放入上传序列
}

//移除补丁
void UpdaterServerManager::on_removePack_clicked()
{
	//关闭soft的修改
	softitemCloseEdit(true);

	QListWidgetItem* ppackitem = pPackList->currentItem();
	QListWidgetItem* psoftitem = pSoftList->currentItem();
	if (!ppackitem || !psoftitem)
	{
		QMessageBox::information(0, tr("info"), tr("please select a pack"));
		return;
	}

	QString softname = psoftitem->text();
	QString packname = ppackitem->text();
	QString packfilename = ui.editPackFileName->text();

	CUpdateXmlPlistTree* pServerTree = (CUpdateXmlPlistTree*)getUpdateXmlPlistServerTree();
	pServerTree->removePack(softname, packname);

	//
	UpdateDeque::OneRecode* precode = gUpdateDeque.push_back(UpdateDeque::OneRecode::removepack);
	precode->name[0] = softname;
	precode->name[1] = packfilename;

	//刷新packlist
	pPackList->clear();
	ui.comboBoxValidPacks->clear();
	ui.comboBoxValidPacks->addItem("-----");
	ui.listPackDependPacks->clear();

	if (pServerTree->isSoftFound(softname))
	{
		CUpdateXmlPlistTree::TIterEachSoftware objsoft = pServerTree->findSoft(softname);
		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);
	}
}

//浏览补丁文件
void UpdaterServerManager::on_browserPack_clicked()
{
	QString filepath = QFileDialog::getOpenFileName(this, tr("locate a pack file"), QString(), "packfile (*.exe)");
	if (filepath.isEmpty())
		return;

	ui.editPackPath->setText(filepath);

	//找到补丁文件,则计算文件大小以及md5
	QFile packfile(filepath);
	packfile.open(QIODevice::ReadOnly);
	qint64 packfilesize = packfile.size();
	packfile.close();
	ui.statusBar->showMessage(tr("calc md5"));
	QString md5 = wFileFunc::calcFileMd5(filepath);
	ui.statusBar->clearMessage();
	ui.editPackMd5->setText( md5 );
	//需要将byte换算成K,M或者G
	int k = int(packfilesize / 1024);
	int m = int(packfilesize / 1024 / 1024);
	int g = int(packfilesize /1024 / 1024 / 1024);
	int t = int(packfilesize / 1024 / 1024 / 1024 / 1024);
	QString filesize;
	if (k == 0)
	{
		filesize = QString::number(packfilesize) + "B";
	}
	else if ( m == 0)
	{
		filesize = QString::number(k) + "KB";
	}
	else if ( g == 0)
	{
		filesize = QString::number(m) + "MB";
	}
	else
		filesize = QString::number(g) + "GB";
	ui.editPackSize->setText( filesize );

	QStringList filelist = filepath.split("/",QString::SkipEmptyParts);
	ui.editPackFileName->setText(filelist.at(filelist.size() -1));

	//将exe换成txt,自动从nsis打包程序获取补丁的信息
	QString infofile = filepath.replace(".exe", ".txt", Qt::CaseInsensitive);
	if (QFile::exists(infofile))
	{
		QFile xfile(infofile);
		if (xfile.open(QIODevice::ReadOnly | QIODevice::Text))
		{
			QByteArray linedata = xfile.readLine();
			linedata = linedata.left(linedata.count() -1);//去除掉/0
			QString linestr(linedata);
			ui.editPackName->setText(linestr);//显示名称
			linestr = QString(xfile.readLine());
			ui.editPackPublishTime->setText(linestr);//发布时间
			linestr = QString(xfile.readLine());
			ui.checkPackShowUi->setChecked(linestr.toInt() == 0 ? false : true);//安装过程中显示界面
			linestr = QString(xfile.readLine());
			ui.checkPackSelfUpdater->setChecked(linestr.toInt() == 0 ? false : true);//自升级包
			linestr = QString(xfile.readLine());
			ui.editPackSoftKey->setText(linestr);//软件锁类型

			linestr = QString(xfile.readAll());
			ui.textPackInfo->setHtml(linestr);

			xfile.close();
		}
		else
			QMessageBox::information(this, tr("info"), tr("failed to open info file"));
	}
	else
	{
		QMessageBox::information(this, tr("info"), tr("info file lost"));
	}
}

void UpdaterServerManager::on_refreshPackInfo_clicked()
{
	QListWidgetItem* ppackitem = pPackList->currentItem();
	QListWidgetItem* psoftitem = pSoftList->currentItem();
	if (!ppackitem || !psoftitem)
	{
		QMessageBox::information(0, tr("info"), tr("please select a pack"));
		return;
	}

	QString softname = psoftitem->text();
	QString packname = ppackitem->text();
	
	//更新界面数据到树之上
	CUpdateXmlPlistTree* pServerTree = (CUpdateXmlPlistTree*)getUpdateXmlPlistServerTree();
	CUpdateXmlPlistTree::EachSoftUpdate* pSoft = &pServerTree->findSoft(softname)->second;
	CUpdatePack* pPack;bool needrelease = false;
	if (!pSoft->isPackFound(packname))
	{
		pPack = new CUpdatePack();
		needrelease = true;

		pPack->softname = softname;
	}
	else
	{
		CUpdateXmlPlistTree::EachSoftUpdate::TIterEachPack iterpack = pSoft->findPack(packname);
		pPack = &*iterpack;
	}

	//对pack进行修改
	if (pPack->md5 != ui.editPackMd5->text())
	{
		UpdateDeque::OneRecode* pRecode = gUpdateDeque.push_back(UpdateDeque::OneRecode::modifypack);

		pPack->md5 = ui.editPackMd5->text();
		pPack->packName = ui.editPackFileName->text();
		pPack->packSize = ui.editPackSize->text();

		pRecode->localefilepath = ui.editPackPath->text();
		pRecode->serverfilepath = pPack->getServerPath();
	}

	//其余的直接改变信息
	pPack->name = ui.editPackName->text();
	ppackitem->setText(pPack->name);
	pPack->info = ui.textPackInfo->toHtml();
	pPack->softname = softname;
	pPack->isSelfUpdate = ui.checkPackSelfUpdater->isChecked();
	pPack->minSoftTime = ui.editPackSoftMinTime->text().toLongLong();
	pPack->needUiShow = ui.checkPackShowUi->isChecked();
	pPack->publishTime = ui.editPackPublishTime->text().toLongLong();
	pPack->debugmode = ui.checkDebug->isChecked();
	pPack->mustdownload = ui.checkMustdownload->isChecked();
	pPack->dependPacks.clear();
	pPack->appendKey = ui.editPackSoftKey->text().toInt();
	for (int dlistrowi = 0; dlistrowi < ui.listPackDependPacks->count(); dlistrowi++)
	{
		QString dstr = ui.listPackDependPacks->item(dlistrowi)->text();
		pPack->dependPacks.insert(std::make_pair(dstr, true));
	}

	if (needrelease)
	{
		pServerTree->addPack(pPack);
		pubfunc::release(pPack);
	}

	//刷新combo
	ui.comboBoxValidPacks->clear();
	ui.comboBoxValidPacks->addItem("-----");
	CUpdateXmlPlistTree::TIterEachSoftware objsoft = pServerTree->findSoft(currentSoftname);
	CUpdateXmlPlistTree::EachSoftUpdate* pObjSoft = &objsoft->second;
	CUpdateXmlPlistTree::EachSoftUpdate::TIterEachPack iterPack = pObjSoft->begin();
	while (iterPack != pObjSoft->end())
	{
		CUpdatePack* pPack = &*iterPack;
		//初始化依赖pack可供选择的列表
		ui.comboBoxValidPacks->addItem(pPack->name);
		++iterPack;
	}
	ui.comboBoxValidPacks->setCurrentIndex(0);
}


void UpdaterServerManager::on_addPackDepend_clicked()
{
	QListWidgetItem* ppackitem = pPackList->currentItem();
	QListWidgetItem* psoftitem = pSoftList->currentItem();
	if (!ppackitem || !psoftitem)
	{
		QMessageBox::information(0, tr("info"), tr("please select a pack"));
		return;
	}

	QString packname = ui.comboBoxValidPacks->currentText();
	if (packname == QString("-----"))
	{
		return;
	}

	if (packname != ppackitem->text())//如果选中的是自己,则不能用来依赖
		ui.listPackDependPacks->addItem(new QListWidgetItem(packname));
	else
		QMessageBox::information(this, tr("info"), tr("can`t use self as a depended pack "));
}

void UpdaterServerManager::on_removeDepend_clicked()
{
	if (!ui.listPackDependPacks->count())
		return;

	QListWidgetItem* pitem = ui.listPackDependPacks->currentItem();
	if (!pitem)
	{
		QMessageBox::information(this, tr("info"), tr("select a pack"));
		return;
	}

	ui.listPackDependPacks->removeItemWidget(pitem);
}

//启动打包程序
void UpdaterServerManager::on_runPackApp_clicked()
{
	QString packapp = "./UpdaterMaker.exe";
	if (!QFile::exists(packapp))
	{
		QMessageBox::information(this, tr("info"), tr("packmaker lost"));
		return;
	}

	QProcess::execute(packapp);
}

void UpdaterServerManager::on_pushButtonImportInfo_clicked()
{
	QString filepath = QFileDialog::getOpenFileName(this, tr("locate a info file"), QString(), "infofile (*.html | *.txt)");
	if (filepath.isEmpty())
		return;

	ui.textPackInfo->clear();

	QFile xfile(filepath);
	if (xfile.open(QIODevice::ReadOnly | QIODevice::Text))
	{
		QByteArray xdate = xfile.readAll();
		ui.textPackInfo->setHtml(QString(xdate));
		xfile.close();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -