支持显示本地apt源内容(但速度过慢)
This commit is contained in:
parent
1bd4bad1cd
commit
a3c5b9fc87
@ -2,6 +2,7 @@
|
|||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option)
|
AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option)
|
||||||
{
|
{
|
||||||
@ -12,7 +13,7 @@ AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option)
|
|||||||
|
|
||||||
void AptPkgInfo::ReadAptData()
|
void AptPkgInfo::ReadAptData()
|
||||||
{
|
{
|
||||||
this->aptData = "";
|
this->aptData = QJsonObject();
|
||||||
QDir dir("/var/lib/apt/lists/");
|
QDir dir("/var/lib/apt/lists/");
|
||||||
QStringList list = dir.entryList();
|
QStringList list = dir.entryList();
|
||||||
for(QString i: list) {
|
for(QString i: list) {
|
||||||
@ -26,17 +27,19 @@ void AptPkgInfo::ReadAptData()
|
|||||||
QFile file(dir.path() + "/" + i);
|
QFile file(dir.path() + "/" + i);
|
||||||
file.open(QFile::ReadOnly);
|
file.open(QFile::ReadOnly);
|
||||||
// 分析
|
// 分析
|
||||||
QString pkgData;
|
QJsonObject pkgData;
|
||||||
pkgDataStatus status = pkgDataStatus::None;
|
pkgDataStatus status = pkgDataStatus::None;
|
||||||
|
QString strTemp; // 因为直接 replace 会改变原来的值
|
||||||
while(!file.atEnd()) {
|
while(!file.atEnd()) {
|
||||||
QByteArray line = file.readLine();
|
QByteArray line = file.readLine();
|
||||||
if(line.replace(" ", "").replace("\n", "") == "") {
|
strTemp = line;
|
||||||
|
if(strTemp.replace(" ", "").replace("\n", "") == "") {
|
||||||
// 空行
|
// 空行
|
||||||
if(status == pkgDataStatus::IsContain) {
|
if(status == pkgDataStatus::IsContain) {
|
||||||
aptData += pkgData + "\n";
|
aptData.insert(pkgData.value("Package").toString(), pkgData);
|
||||||
}
|
}
|
||||||
status = pkgDataStatus::EmptyLine;
|
status = pkgDataStatus::EmptyLine;
|
||||||
pkgData = ""; // 清空
|
pkgData = QJsonObject(); // 清空
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 如果已经被检测为非要寻找的包名,则
|
// 如果已经被检测为非要寻找的包名,则
|
||||||
@ -47,7 +50,8 @@ void AptPkgInfo::ReadAptData()
|
|||||||
if(line.contains("Package: ")) {
|
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) {
|
switch(this->pkgSearchOption) {
|
||||||
case PkgSearchOption::Equal:
|
case PkgSearchOption::Equal:
|
||||||
if(pkgName == this->pkgName) {
|
if(pkgName == this->pkgName) {
|
||||||
@ -66,15 +70,18 @@ void AptPkgInfo::ReadAptData()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pkgData += line + "\n";
|
// 解析为 QJsonObject
|
||||||
|
pkgData.insert("Package", pkgName);
|
||||||
continue;
|
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();
|
file.close();
|
||||||
}
|
}
|
||||||
qDebug() << aptData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AptPkgInfo::SetPkgName(QString pkgName)
|
void AptPkgInfo::SetPkgName(QString pkgName)
|
||||||
@ -93,53 +100,34 @@ QString AptPkgInfo::GetPkgInfo(QString pkgName) const
|
|||||||
return this->GetCommandResult("apt", QStringList() << "list" << pkgName, env);
|
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");
|
return this->aptData.value(pkgName).toObject().value("Package").toString();
|
||||||
for(QString i: list) {
|
|
||||||
if(i.contains("Package: ")) {
|
|
||||||
return i.replace("Package: ", "").replace(" ", "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString AptPkgInfo::get_version() const
|
QString AptPkgInfo::get_version(QString pkgName) const
|
||||||
{
|
{
|
||||||
QStringList list = pkgInfo.split("\n");
|
return this->aptData.value(pkgName).toObject().value("Version").toString();
|
||||||
for(QString i: list) {
|
|
||||||
if(i.contains("Maintainer: ")) {
|
|
||||||
return i.replace("Maintainer: ", "").replace(" ", "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString AptPkgInfo::get_maintainer() const
|
QString AptPkgInfo::get_maintainer(QString pkgName) const
|
||||||
{
|
{
|
||||||
QStringList list = pkgInfo.split("\n");
|
return this->aptData.value(pkgName).toObject().value("Maintainer").toString();
|
||||||
for(QString i: list) {
|
|
||||||
if(i.contains("Version: ")) {
|
|
||||||
return i.replace("Version: ", "").replace(" ", "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList AptPkgInfo::GetAptPackageList(QString name) const
|
QString AptPkgInfo::get_description(QString pkgName) const
|
||||||
{
|
{
|
||||||
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
return this->aptData.value(pkgName).toObject().value("Description").toString();
|
||||||
env.insert("LANG", "en");
|
}
|
||||||
QString data = GetCommandResult("apt", QStringList() << "list" << name, env);
|
|
||||||
QStringList lineData = data.split("\n");
|
QString AptPkgInfo::get_architecture(QString pkgName) const
|
||||||
QStringList result = {};
|
{
|
||||||
for(QString i: lineData) {
|
return this->aptData.value(pkgName).toObject().value("Architecture").toString();
|
||||||
if(i.contains("Listing...")) {
|
}
|
||||||
continue;
|
|
||||||
}
|
QStringList AptPkgInfo::GetAptPackageList() const
|
||||||
result.append(i.split("/").at(0));
|
{
|
||||||
}
|
return this->aptData.keys();
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray AptPkgInfo::GetCommandResult(QString command, QStringList argv, QProcessEnvironment env) const
|
QByteArray AptPkgInfo::GetCommandResult(QString command, QStringList argv, QProcessEnvironment env) const
|
||||||
|
13
aptpkginfo.h
13
aptpkginfo.h
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
class AptPkgInfo: QObject
|
class AptPkgInfo: QObject
|
||||||
{
|
{
|
||||||
@ -16,21 +17,23 @@ public:
|
|||||||
AptPkgInfo(QString pkgName, PkgSearchOption option = PkgSearchOption::Equal);
|
AptPkgInfo(QString pkgName, PkgSearchOption option = PkgSearchOption::Equal);
|
||||||
|
|
||||||
void SetPkgName(QString pkgName);
|
void SetPkgName(QString pkgName);
|
||||||
QStringList GetAptPackageList(QString name) const;
|
QStringList GetAptPackageList() const;
|
||||||
QByteArray GetCommandResult(QString command, QStringList argv, QProcessEnvironment env = QProcessEnvironment::systemEnvironment()) const;
|
QByteArray GetCommandResult(QString command, QStringList argv, QProcessEnvironment env = QProcessEnvironment::systemEnvironment()) const;
|
||||||
|
|
||||||
QString GetPkgInfo(QString pkgName=NULL) const;
|
QString GetPkgInfo(QString pkgName=NULL) const;
|
||||||
|
|
||||||
QString get_package() const;
|
QString get_package(QString pkgName) const;
|
||||||
QString get_version() const;
|
QString get_version(QString pkgName) const;
|
||||||
QString get_maintainer() const;
|
QString get_maintainer(QString pkgName) const;
|
||||||
|
QString get_description(QString pkgName) const;
|
||||||
|
QString get_architecture(QString pkgName) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString pkgName;
|
QString pkgName;
|
||||||
QString pkgInfo;
|
QString pkgInfo;
|
||||||
QString aptData;
|
QJsonObject aptData;
|
||||||
PkgSearchOption pkgSearchOption = PkgSearchOption::Equal;
|
PkgSearchOption pkgSearchOption = PkgSearchOption::Equal;
|
||||||
|
|
||||||
enum pkgDataStatus {
|
enum pkgDataStatus {
|
||||||
|
@ -16,35 +16,21 @@ void KernelInformation::LoadInfo()
|
|||||||
|
|
||||||
}*/
|
}*/
|
||||||
AptPkgInfo info = AptPkgInfo("linux-", AptPkgInfo::PkgSearchOption::Include);
|
AptPkgInfo info = AptPkgInfo("linux-", AptPkgInfo::PkgSearchOption::Include);
|
||||||
|
QStringList list = info.GetAptPackageList();
|
||||||
QJsonArray array;
|
QJsonArray array;
|
||||||
QStringList list = info.GetAptPackageList("linux-base");
|
|
||||||
for(QString i: list) {
|
for(QString i: list) {
|
||||||
QJsonObject object;
|
QJsonObject object;
|
||||||
info.SetPkgName(i);
|
info.SetPkgName(i);
|
||||||
object.insert("Name", 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);
|
array.append(object);
|
||||||
|
qDebug() << object;
|
||||||
}
|
}
|
||||||
this->listData = array;
|
this->listData = array;
|
||||||
emit loadFinished(NULL);
|
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
|
QJsonArray KernelInformation::get_listData() const
|
||||||
|
@ -42,6 +42,9 @@ void MainWindow::RefreshKernelListView(KernelInformation *info, bool showLocalAr
|
|||||||
if(i == arch) {
|
if(i == arch) {
|
||||||
isLocalArch = true;
|
isLocalArch = true;
|
||||||
}
|
}
|
||||||
|
if(i == "all") {
|
||||||
|
isLocalArch = true;
|
||||||
|
}
|
||||||
kernelArch += i + " ";
|
kernelArch += i + " ";
|
||||||
}
|
}
|
||||||
if(showLocalArchOnly && !isLocalArch) {
|
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, 0, new QStandardItem(QString::number(i)));
|
||||||
model->setItem(line, 1, new QStandardItem(info->get_name(i)));
|
model->setItem(line, 1, new QStandardItem(info->get_name(i)));
|
||||||
model->setItem(line, 2, new QStandardItem(info->get_author(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))));
|
//model->setItem(line, 4, new QStandardItem((QStringList() << "" << "Y").at(info->get_installedAlready(i))));
|
||||||
line++;
|
line++;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user