diff --git a/aptpkginfo.cpp b/aptpkginfo.cpp index b841795..de1a7fb 100644 --- a/aptpkginfo.cpp +++ b/aptpkginfo.cpp @@ -2,6 +2,7 @@ #include <QFile> #include <QDir> #include <QDebug> +#include <QJsonObject> AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option) { @@ -12,7 +13,7 @@ AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option) void AptPkgInfo::ReadAptData() { - this->aptData = ""; + this->aptData = QJsonObject(); QDir dir("/var/lib/apt/lists/"); QStringList list = dir.entryList(); for(QString i: list) { @@ -26,17 +27,19 @@ void AptPkgInfo::ReadAptData() QFile file(dir.path() + "/" + i); file.open(QFile::ReadOnly); // 分析 - QString pkgData; + QJsonObject pkgData; pkgDataStatus status = pkgDataStatus::None; + QString strTemp; // 因为直接 replace 会改变原来的值 while(!file.atEnd()) { QByteArray line = file.readLine(); - if(line.replace(" ", "").replace("\n", "") == "") { + strTemp = line; + if(strTemp.replace(" ", "").replace("\n", "") == "") { // 空行 if(status == pkgDataStatus::IsContain) { - aptData += pkgData + "\n"; + aptData.insert(pkgData.value("Package").toString(), pkgData); } status = pkgDataStatus::EmptyLine; - pkgData = ""; // 清空 + pkgData = QJsonObject(); // 清空 continue; } // 如果已经被检测为非要寻找的包名,则 @@ -47,7 +50,8 @@ void AptPkgInfo::ReadAptData() if(line.contains("Package: ")) { // 如果为包名行,则进行分析 // 是否含有要求关键字 - QString pkgName = line.replace("Package: ", "").replace(" ", "").replace("\n", ""); + strTemp = line; + QString pkgName = strTemp.replace("Package: ", "").replace(" ", "").replace("\n", ""); switch(this->pkgSearchOption) { case PkgSearchOption::Equal: if(pkgName == this->pkgName) { @@ -66,15 +70,18 @@ void AptPkgInfo::ReadAptData() } break; } - pkgData += line + "\n"; + // 解析为 QJsonObject + pkgData.insert("Package", pkgName); continue; } // 处理 - pkgData += line + "\n"; + int index = line.indexOf(":"); + strTemp = line; + strTemp.replace("\n", ""); + pkgData.insert(QString(strTemp.mid(0, index)), QString(strTemp.mid(index + 2))); } file.close(); } - qDebug() << aptData; } void AptPkgInfo::SetPkgName(QString pkgName) @@ -93,53 +100,34 @@ QString AptPkgInfo::GetPkgInfo(QString pkgName) const return this->GetCommandResult("apt", QStringList() << "list" << pkgName, env); } -QString AptPkgInfo::get_package() const +QString AptPkgInfo::get_package(QString pkgName) const { - QStringList list = pkgInfo.split("\n"); - for(QString i: list) { - if(i.contains("Package: ")) { - return i.replace("Package: ", "").replace(" ", ""); - } - } - return NULL; + return this->aptData.value(pkgName).toObject().value("Package").toString(); } -QString AptPkgInfo::get_version() const +QString AptPkgInfo::get_version(QString pkgName) const { - QStringList list = pkgInfo.split("\n"); - for(QString i: list) { - if(i.contains("Maintainer: ")) { - return i.replace("Maintainer: ", "").replace(" ", ""); - } - } - return NULL; + return this->aptData.value(pkgName).toObject().value("Version").toString(); } -QString AptPkgInfo::get_maintainer() const +QString AptPkgInfo::get_maintainer(QString pkgName) const { - QStringList list = pkgInfo.split("\n"); - for(QString i: list) { - if(i.contains("Version: ")) { - return i.replace("Version: ", "").replace(" ", ""); - } - } - return NULL; + return this->aptData.value(pkgName).toObject().value("Maintainer").toString(); } -QStringList AptPkgInfo::GetAptPackageList(QString name) const +QString AptPkgInfo::get_description(QString pkgName) const { - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - env.insert("LANG", "en"); - QString data = GetCommandResult("apt", QStringList() << "list" << name, env); - QStringList lineData = data.split("\n"); - QStringList result = {}; - for(QString i: lineData) { - if(i.contains("Listing...")) { - continue; - } - result.append(i.split("/").at(0)); - } - return result; + 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 diff --git a/aptpkginfo.h b/aptpkginfo.h index cd85bd5..d75ddd4 100644 --- a/aptpkginfo.h +++ b/aptpkginfo.h @@ -3,6 +3,7 @@ #include <QObject> #include <QProcess> +#include <QJsonObject> class AptPkgInfo: QObject { @@ -16,21 +17,23 @@ public: AptPkgInfo(QString pkgName, PkgSearchOption option = PkgSearchOption::Equal); void SetPkgName(QString pkgName); - QStringList GetAptPackageList(QString name) const; + QStringList GetAptPackageList() const; QByteArray GetCommandResult(QString command, QStringList argv, QProcessEnvironment env = QProcessEnvironment::systemEnvironment()) const; QString GetPkgInfo(QString pkgName=NULL) const; - QString get_package() const; - QString get_version() const; - QString get_maintainer() const; + QString get_package(QString pkgName) const; + QString get_version(QString pkgName) const; + QString get_maintainer(QString pkgName) const; + QString get_description(QString pkgName) const; + QString get_architecture(QString pkgName) const; private: QString pkgName; QString pkgInfo; - QString aptData; + QJsonObject aptData; PkgSearchOption pkgSearchOption = PkgSearchOption::Equal; enum pkgDataStatus { diff --git a/kernelinformation.cpp b/kernelinformation.cpp index 5cba1e9..13d8470 100644 --- a/kernelinformation.cpp +++ b/kernelinformation.cpp @@ -16,35 +16,21 @@ void KernelInformation::LoadInfo() }*/ AptPkgInfo info = AptPkgInfo("linux-", AptPkgInfo::PkgSearchOption::Include); + QStringList list = info.GetAptPackageList(); QJsonArray array; - QStringList list = info.GetAptPackageList("linux-base"); for(QString i: list) { QJsonObject object; info.SetPkgName(i); object.insert("Name", i); - object.insert("Author", info.get_maintainer()); + object.insert("Author", info.get_maintainer(i)); + object.insert("Des", info.get_maintainer(i)); + object.insert("Arch", info.get_architecture(i)); array.append(object); + qDebug() << object; } this->listData = array; emit loadFinished(NULL); - return; - // 从 Github 拉取信息 - QUrl url(this->url); - QUrlQuery query; - query.addQueryItem("format", "j1"); - url.setQuery(query.toString(QUrl::FullyEncoded)); - qDebug() << url; - QNetworkRequest request(url); - QNetworkAccessManager *m_http = new QNetworkAccessManager(this); - QNetworkReply *reply = m_http->get(request); - connect(reply, &QNetworkReply::finished, this, [this, m_http](){ - QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); - QByteArray data = reply->readAll(); - qDebug() << data; - qDebug() << reply->error(); - this->listData = QJsonDocument::fromJson(data).array(); - emit loadFinished(reply); - }); + } QJsonArray KernelInformation::get_listData() const diff --git a/mainwindow.cpp b/mainwindow.cpp index d29e845..023543c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -42,6 +42,9 @@ void MainWindow::RefreshKernelListView(KernelInformation *info, bool showLocalAr if(i == arch) { isLocalArch = true; } + if(i == "all") { + isLocalArch = true; + } kernelArch += i + " "; } if(showLocalArchOnly && !isLocalArch) { @@ -50,7 +53,7 @@ void MainWindow::RefreshKernelListView(KernelInformation *info, bool showLocalAr model->setItem(line, 0, new QStandardItem(QString::number(i))); model->setItem(line, 1, new QStandardItem(info->get_name(i))); model->setItem(line, 2, new QStandardItem(info->get_author(i))); - //model->setItem(line, 3, new QStandardItem(kernelArch)); + model->setItem(line, 3, new QStandardItem(kernelArch)); //model->setItem(line, 4, new QStandardItem((QStringList() << "" << "Y").at(info->get_installedAlready(i)))); line++; }