From 1bd4bad1cd4d3e5e2ecb6c0a96f4edb7d5f2316d Mon Sep 17 00:00:00 2001 From: gfdgd_xi <3025613752@qq.com> Date: Wed, 8 May 2024 23:03:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=B8=80=E7=82=B9=E4=BB=8Eap?= =?UTF-8?q?t=E6=BA=90=E6=96=87=E4=BB=B6=E8=8E=B7=E5=8F=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=BA=93=EF=BC=88=E6=9A=82=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aptpkginfo.cpp | 54 +++++++++++++++++++++++++++++++++++++++---- aptpkginfo.h | 20 +++++++++++++++- kernelinformation.cpp | 2 +- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/aptpkginfo.cpp b/aptpkginfo.cpp index 097d87e..b841795 100644 --- a/aptpkginfo.cpp +++ b/aptpkginfo.cpp @@ -3,8 +3,9 @@ #include <QDir> #include <QDebug> -AptPkgInfo::AptPkgInfo(QString pkgName) +AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option) { + this->pkgSearchOption = option; SetPkgName(pkgName); ReadAptData(); } @@ -19,13 +20,58 @@ void AptPkgInfo::ReadAptData() if(i == "." || i == "..") { continue; } - // TODO: bug - if(i.mid(-10, -1) != "_Packages") { + if(i.mid(i.indexOf("_Packages")) != "_Packages") { continue; } QFile file(dir.path() + "/" + i); file.open(QFile::ReadOnly); - aptData += file.readAll() + "\n"; + // 分析 + QString pkgData; + pkgDataStatus status = pkgDataStatus::None; + while(!file.atEnd()) { + QByteArray line = file.readLine(); + if(line.replace(" ", "").replace("\n", "") == "") { + // 空行 + if(status == pkgDataStatus::IsContain) { + aptData += pkgData + "\n"; + } + status = pkgDataStatus::EmptyLine; + pkgData = ""; // 清空 + continue; + } + // 如果已经被检测为非要寻找的包名,则 + if(status == pkgDataStatus::UnContain) { + continue; // 忽略该行 + } + // 分析行 + if(line.contains("Package: ")) { + // 如果为包名行,则进行分析 + // 是否含有要求关键字 + QString pkgName = line.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; + } + pkgData += line + "\n"; + continue; + } + // 处理 + pkgData += line + "\n"; + } file.close(); } qDebug() << aptData; diff --git a/aptpkginfo.h b/aptpkginfo.h index 7f71ca4..cd85bd5 100644 --- a/aptpkginfo.h +++ b/aptpkginfo.h @@ -8,7 +8,12 @@ class AptPkgInfo: QObject { Q_OBJECT public: - AptPkgInfo(QString pkgName); + enum PkgSearchOption { + Include = 0, + Equal = 1 + }; + + AptPkgInfo(QString pkgName, PkgSearchOption option = PkgSearchOption::Equal); void SetPkgName(QString pkgName); QStringList GetAptPackageList(QString name) const; @@ -20,10 +25,23 @@ public: QString get_version() const; QString get_maintainer() const; + + private: QString pkgName; QString pkgInfo; QString aptData; + PkgSearchOption pkgSearchOption = PkgSearchOption::Equal; + + enum pkgDataStatus { + EmptyLine = 0, + EmptyLineAgain = 1, + Reading = 2, + Readed = 3, + None = 4, + UnContain = 5, + IsContain = 6 + }; void ReadAptData(); }; diff --git a/kernelinformation.cpp b/kernelinformation.cpp index 696837f..5cba1e9 100644 --- a/kernelinformation.cpp +++ b/kernelinformation.cpp @@ -15,7 +15,7 @@ void KernelInformation::LoadInfo() /*for(QString i: data) { }*/ - AptPkgInfo info = AptPkgInfo(""); + AptPkgInfo info = AptPkgInfo("linux-", AptPkgInfo::PkgSearchOption::Include); QJsonArray array; QStringList list = info.GetAptPackageList("linux-base"); for(QString i: list) {