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) {