支持显示本地apt源内容(但速度过慢)

This commit is contained in:
gfdgd xi 2024-05-09 22:59:48 +08:00
parent 1bd4bad1cd
commit a3c5b9fc87
4 changed files with 52 additions and 72 deletions

@ -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

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

@ -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

@ -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++;
}