226 lines
7.0 KiB
C++
226 lines
7.0 KiB
C++
#include "aptpkginfo.h"
|
|
#include <QFile>
|
|
#include <QDir>
|
|
#include <QDebug>
|
|
#include <QJsonObject>
|
|
|
|
AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option)
|
|
{
|
|
this->pkgSearchOption = option;
|
|
SetPkgName(pkgName);
|
|
ReadAptData();
|
|
}
|
|
|
|
QStringList AptPkgInfo::SplitVersion(QString version) const
|
|
{
|
|
SplitVersionStatus status = SplitVersionStatus::Checking;
|
|
QStringList versionList;
|
|
QString versionNumberTemp = "";
|
|
QString versionLetterTemp = "";
|
|
for(QString i: version) {
|
|
if(symbolList.contains(i)) {
|
|
// 如果是特殊字符
|
|
|
|
switch(status) {
|
|
case SplitVersionStatus::Checking:
|
|
versionList.append(versionNumberTemp);
|
|
break;
|
|
case SplitVersionStatus::MeetedEnglishLetter:
|
|
versionList.append(versionLetterTemp);
|
|
break;
|
|
}
|
|
versionList.append(i);
|
|
versionNumberTemp = "";
|
|
versionLetterTemp = "";
|
|
status = SplitVersionStatus::MeetSymbol;
|
|
continue;
|
|
}
|
|
if(i[0].isLetter()) {
|
|
switch(status) {
|
|
case SplitVersionStatus::Checking:
|
|
versionList.append(versionNumberTemp);
|
|
break;
|
|
}
|
|
versionLetterTemp += i;
|
|
versionNumberTemp = "";
|
|
status = SplitVersionStatus::MeetedEnglishLetter;
|
|
continue;
|
|
}
|
|
switch(status) {
|
|
case SplitVersionStatus::MeetedEnglishLetter:
|
|
versionList.append(versionLetterTemp);
|
|
break;
|
|
}
|
|
versionNumberTemp += i;
|
|
status = SplitVersionStatus::Checking;
|
|
versionLetterTemp = "";
|
|
}
|
|
if(status == SplitVersionStatus::Checking) {
|
|
versionList.append(versionNumberTemp);
|
|
}
|
|
|
|
|
|
return versionList;
|
|
}
|
|
|
|
bool AptPkgInfo::CompareVersion(QString version1, QString version2) const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void AptPkgInfo::ReadAptData()
|
|
{
|
|
this->aptData = QJsonObject();
|
|
QDir dir("/var/lib/apt/lists/");
|
|
QStringList list = dir.entryList();
|
|
for(QString i: list) {
|
|
// 除去 . 和 ..
|
|
if(i == "." || i == "..") {
|
|
continue;
|
|
}
|
|
if(i.mid(i.indexOf("_Packages")) != "_Packages") {
|
|
continue;
|
|
}
|
|
QFile file(dir.path() + "/" + i);
|
|
file.open(QFile::ReadOnly);
|
|
// 分析
|
|
QJsonObject pkgData;
|
|
pkgDataStatus status = pkgDataStatus::None;
|
|
QString strTemp; // 因为直接 replace 会改变原来的值
|
|
while(!file.atEnd()) {
|
|
QByteArray line = file.readLine();
|
|
strTemp = line;
|
|
if(strTemp.replace(" ", "").replace("\n", "") == "") {
|
|
// 空行
|
|
if(status == pkgDataStatus::IsContain) {
|
|
QString addPkgName = pkgData.value("Package").toString();
|
|
// 如果已经存在表中
|
|
if(pkgData.contains(addPkgName)) {
|
|
// 新增数据
|
|
QJsonObject allDataObject = aptData.value(addPkgName).toObject();
|
|
// 判断版本大小,如果新于表内版本则更新
|
|
QString dataVersion = allDataObject.value("Version").toString();
|
|
|
|
}
|
|
else {
|
|
aptData.insert(addPkgName, pkgData);
|
|
}
|
|
|
|
}
|
|
status = pkgDataStatus::EmptyLine;
|
|
pkgData = QJsonObject(); // 清空
|
|
continue;
|
|
}
|
|
// 如果已经被检测为非要寻找的包名,则
|
|
if(status == pkgDataStatus::UnContain) {
|
|
continue; // 忽略该行
|
|
}
|
|
// 分析行
|
|
if(line.contains("Package: ")) {
|
|
// 如果为包名行,则进行分析
|
|
// 是否含有要求关键字
|
|
strTemp = line;
|
|
QString pkgName = strTemp.replace("Package: ", "").replace(" ", "").replace("\n", "");
|
|
switch(this->pkgSearchOption) {
|
|
case PkgSearchOption::Equal:
|
|
if(pkgName == this->pkgName) {
|
|
status = pkgDataStatus::IsContain;
|
|
}
|
|
else {
|
|
status = pkgDataStatus::UnContain;
|
|
}
|
|
break;
|
|
case PkgSearchOption::Include:
|
|
if(pkgName.contains(this->pkgName)) {
|
|
status = pkgDataStatus::IsContain;
|
|
}
|
|
else {
|
|
status = pkgDataStatus::UnContain;
|
|
}
|
|
break;
|
|
case PkgSearchOption::HeadInclude:
|
|
if(pkgName.mid(0, this->pkgName.length()) == this->pkgName) {
|
|
status = pkgDataStatus::IsContain;
|
|
}
|
|
else {
|
|
status = pkgDataStatus::UnContain;
|
|
}
|
|
break;
|
|
}
|
|
// 解析为 QJsonObject
|
|
pkgData.insert("Package", pkgName);
|
|
continue;
|
|
}
|
|
// 处理
|
|
int index = line.indexOf(":");
|
|
strTemp = line;
|
|
strTemp.replace("\n", "");
|
|
pkgData.insert(QString(strTemp.mid(0, index)), QString(strTemp.mid(index + 2)));
|
|
}
|
|
file.close();
|
|
}
|
|
}
|
|
|
|
void AptPkgInfo::SetPkgName(QString pkgName)
|
|
{
|
|
this->pkgName = pkgName;
|
|
//pkgInfo = GetPkgInfo(pkgName);
|
|
}
|
|
|
|
QString AptPkgInfo::GetPkgInfo(QString pkgName) const
|
|
{
|
|
if(pkgName == NULL) {
|
|
pkgName = this->pkgName;
|
|
}
|
|
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
|
env.insert("LANG", "en");
|
|
return this->GetCommandResult("apt", QStringList() << "list" << pkgName, env);
|
|
}
|
|
|
|
QString AptPkgInfo::get_package(QString pkgName) const
|
|
{
|
|
return this->aptData.value(pkgName).toObject().value("Package").toString();
|
|
}
|
|
|
|
QString AptPkgInfo::get_version(QString pkgName) const
|
|
{
|
|
return this->aptData.value(pkgName).toObject().value("Version").toString();
|
|
}
|
|
|
|
QString AptPkgInfo::get_maintainer(QString pkgName) const
|
|
{
|
|
return this->aptData.value(pkgName).toObject().value("Maintainer").toString();
|
|
}
|
|
|
|
QString AptPkgInfo::get_description(QString pkgName) const
|
|
{
|
|
return this->aptData.value(pkgName).toObject().value("Description").toString();
|
|
}
|
|
|
|
QString AptPkgInfo::get_architecture(QString pkgName) const
|
|
{
|
|
return this->aptData.value(pkgName).toObject().value("Architecture").toString();
|
|
}
|
|
|
|
QStringList AptPkgInfo::GetAptPackageList() const
|
|
{
|
|
return this->aptData.keys();
|
|
}
|
|
|
|
QByteArray AptPkgInfo::GetCommandResult(QString command, QStringList argv, QProcessEnvironment env) const
|
|
{
|
|
QProcess process;
|
|
process.setProcessEnvironment(env);
|
|
process.start(command, argv);
|
|
process.waitForStarted();
|
|
process.waitForFinished();
|
|
QByteArray result = process.readAllStandardOutput();
|
|
process.close();
|
|
return result;
|
|
}
|
|
|
|
QJsonObject AptPkgInfo::get_data() const
|
|
{
|
|
return aptData;
|
|
}
|