From 3857731d76d2ba263f5b6e7457fd6227ef835666 Mon Sep 17 00:00:00 2001 From: renbin Date: Thu, 19 Sep 2024 19:53:17 +0800 Subject: [PATCH] feat: commit changes to uab backend Commit changes to uab backend after install/uninstall. Fix some issue. Log: Commit changes to uab backend. Influence: uab-package --- .../model/proxy_package_list_model.cpp | 3 ++ .../model/proxy_package_list_model.h | 6 ++-- src/deb-installer/uab/uab_backend.cpp | 35 ++++++++++++++++--- src/deb-installer/uab/uab_backend.h | 4 +++ .../uab/uab_package_list_model.cpp | 14 ++++---- .../uab/uab_package_list_model.h | 2 +- .../uab/uab_process_controller.cpp | 35 ++++++++++++++++--- .../uab/uab_process_controller.h | 4 ++- 8 files changed, 84 insertions(+), 19 deletions(-) diff --git a/src/deb-installer/model/proxy_package_list_model.cpp b/src/deb-installer/model/proxy_package_list_model.cpp index 3409c3d1..f87f3a66 100644 --- a/src/deb-installer/model/proxy_package_list_model.cpp +++ b/src/deb-installer/model/proxy_package_list_model.cpp @@ -51,6 +51,7 @@ void ProxyPackageListModel::slotAppendPackage(const QStringList &packageList) for (auto itr = filterList.begin(); itr != filterList.end(); ++itr) { switch (itr.key()) { case Pkg::Uab: + Q_FALLTHROUGH(); case Pkg::Deb: { ModelPtr model = modelFromType(itr.key()); if (!model) { @@ -124,6 +125,7 @@ void ProxyPackageListModel::reset() info.count = 0; info.rightCount = 0; } + setWorkerStatus(WorkerPrepare); } void ProxyPackageListModel::resetInstallStatus() @@ -144,6 +146,7 @@ void ProxyPackageListModel::nextModelInstall() // check if all package finished if (m_procModelIndex >= m_packageModels.count()) { + setWorkerStatus(WorkerFinished); Q_EMIT signalWholeProgressChanged(100); setWorkerStatus(WorkerFinished); return; diff --git a/src/deb-installer/model/proxy_package_list_model.h b/src/deb-installer/model/proxy_package_list_model.h index 19818f84..c8f2a813 100644 --- a/src/deb-installer/model/proxy_package_list_model.h +++ b/src/deb-installer/model/proxy_package_list_model.h @@ -16,7 +16,7 @@ class ProxyPackageListModel : public AbstractPackageListModel explicit ProxyPackageListModel(QObject *parent = nullptr); - virtual QVariant data(const QModelIndex &index, int role) const override; + QVariant data(const QModelIndex &index, int role) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; Q_SLOT void slotAppendPackage(const QStringList &packageList) override; @@ -47,7 +47,7 @@ class ProxyPackageListModel : public AbstractPackageListModel Q_SLOT void onSourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles); private: - int m_procModelIndex; // current processing model index + int m_procModelIndex{-1}; // current processing model index struct ModelInfo { @@ -55,7 +55,7 @@ class ProxyPackageListModel : public AbstractPackageListModel int count{0}; // cached model item count int rightCount{0}; // index counts for current and previous models }; - QList m_packageModels; // all package list models (deb/uab) + QList m_packageModels; // all package list models (deb/uab) }; #endif // PROXY_PACKAGE_LIST_MODEL_H diff --git a/src/deb-installer/uab/uab_backend.cpp b/src/deb-installer/uab/uab_backend.cpp index ba029d76..ea38e4e4 100644 --- a/src/deb-installer/uab/uab_backend.cpp +++ b/src/deb-installer/uab/uab_backend.cpp @@ -62,8 +62,9 @@ UabPkgInfo::Ptr UabBackend::packageFromMetaData(const QString &uabPath, QString { const QFileInfo info(uabPath); if (!info.exists()) { - if (errorString) + if (errorString) { *errorString = QString("uab file not exists"); + } return {}; } @@ -225,20 +226,45 @@ void UabBackend::sortPackages(QList &packageList) }); } +void UabBackend::packageInstalled(const UabPkgInfo::Ptr &appendPtr) +{ + m_packageList.append(appendPtr); + sortPackages(m_packageList); + + qInfo() << QString("Uab package: %1/%2 installed.").arg(appendPtr->id).arg(appendPtr->version); +} + +void UabBackend::packageRemoved(const UabPkgInfo::Ptr &removePtr) +{ + auto findItr = std::find_if(m_packageList.begin(), m_packageList.end(), [&](const UabPkgInfo::Ptr &package) { + return (removePtr->id == package->id) && (removePtr->version == package->version) && + (removePtr->architecture == package->architecture); + }); + + if (findItr != m_packageList.end()) { + m_packageList.erase(findItr); + + qInfo() << QString("Uab package: %1/%2 removed.").arg(removePtr->id).arg(removePtr->version); + } + // remove package dose not require sort. +} + UabPkgInfo::Ptr UabBackend::packageFromMetaJson(const QByteArray &json, QString *errorString) { QJsonParseError error; const QJsonDocument doc = QJsonDocument::fromJson(json, &error); if (QJsonParseError::NoError != error.error) { - if (errorString) + if (errorString) { *errorString = QString("uab json parse erorr: %1, offset: %2").arg(error.errorString()).arg(error.offset); + } return {}; } const QJsonArray layers = doc.object().value(kUabLayers).toArray(); if (layers.isEmpty()) { - if (errorString) + if (errorString) { *errorString = QString("uab json not contains 'layers'"); + } return {}; } @@ -272,8 +298,9 @@ UabPkgInfo::Ptr UabBackend::packageFromMetaJson(const QByteArray &json, QString return uabPtr; } - if (errorString) + if (errorString) { *errorString = QString("uab json not contains app info node"); + } return {}; } diff --git a/src/deb-installer/uab/uab_backend.h b/src/deb-installer/uab/uab_backend.h index ad590565..6e598ec1 100644 --- a/src/deb-installer/uab/uab_backend.h +++ b/src/deb-installer/uab/uab_backend.h @@ -38,6 +38,10 @@ class UabBackend : public QObject static void backendProcess(const QPointer ¬ifyPtr); static void sortPackages(QList &packageList); + // update backend database after controller process finished. + void packageInstalled(const UabPkgInfo::Ptr &appendPtr); + void packageRemoved(const UabPkgInfo::Ptr &removePtr); + private: explicit UabBackend(QObject *parent = nullptr); ~UabBackend() override; diff --git a/src/deb-installer/uab/uab_package_list_model.cpp b/src/deb-installer/uab/uab_package_list_model.cpp index cc46e1f9..645456d1 100644 --- a/src/deb-installer/uab/uab_package_list_model.cpp +++ b/src/deb-installer/uab/uab_package_list_model.cpp @@ -141,13 +141,15 @@ QString UabPackageListModel::checkPackageValid(const QString &packagePath) void UabPackageListModel::slotInstallPackages() { if (!isWorkerPrepare() || rowCount() <= 0) { - setWorkerStatus(WorkerPrepare); - Q_EMIT signalWorkerFinished(); return; } - // reset + // reset, mark package waiting install resetInstallStatus(); + for (auto uabPtr : m_uabPkgList) { + uabPtr->m_operationStatus = Pkg::Waiting; + Q_EMIT dataChanged(index(0), index(m_uabPkgList.size() - 1), {PackageOperateStatusRole}); + } setWorkerStatus(WorkerProcessing); installNextUab(); @@ -239,7 +241,7 @@ void UabPackageListModel::installNextUab() return; } - setCurrentOperation(Pkg::Waiting); + setCurrentOperation(Pkg::Operating); m_processor->reset(); switch (uabPtr->installStatus()) { @@ -249,7 +251,7 @@ void UabPackageListModel::installNextUab() case Pkg::InstalledSameVersion: { auto oldInfoPtr = Uab::UabBackend::instance()->findPackage(uabPtr->info()->id); m_processor->markUninstall(oldInfoPtr); - m_processor->markInstall(oldInfoPtr); + m_processor->markInstall(uabPtr->info()); } break; default: { auto oldInfoPtr = Uab::UabBackend::instance()->findPackage(uabPtr->info()->id); @@ -306,7 +308,7 @@ void UabPackageListModel::setCurrentOperation(Pkg::PackageOperationStatus s) return; } - auto uabPtr = m_uabPkgList.value(m_operatingIndex); + auto &uabPtr = m_uabPkgList[m_operatingIndex]; uabPtr->m_operationStatus = s; Q_EMIT dataChanged(index(m_operatingIndex), index(m_operatingIndex), {PackageOperateStatusRole}); diff --git a/src/deb-installer/uab/uab_package_list_model.h b/src/deb-installer/uab/uab_package_list_model.h index efcafd76..ccdbac50 100644 --- a/src/deb-installer/uab/uab_package_list_model.h +++ b/src/deb-installer/uab/uab_package_list_model.h @@ -19,7 +19,7 @@ class UabPackageListModel : public AbstractPackageListModel public: explicit UabPackageListModel(QObject *parent = nullptr); - virtual QVariant data(const QModelIndex &index, int role) const override; + QVariant data(const QModelIndex &index, int role) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; Q_SLOT void slotAppendPackage(const QStringList &packageList) override; diff --git a/src/deb-installer/uab/uab_process_controller.cpp b/src/deb-installer/uab/uab_process_controller.cpp index 25be10df..0a2d39c4 100644 --- a/src/deb-installer/uab/uab_process_controller.cpp +++ b/src/deb-installer/uab/uab_process_controller.cpp @@ -8,6 +8,8 @@ #include #include +#include "uab_backend.h" + namespace Uab { const QString kLinglongBin = "ll-cli"; @@ -141,8 +143,14 @@ void UabProcessController::onFinished(int exitCode, int exitStatus) const bool exitSuccess = InstallSuccess == exitCode; // continue next process - if (exitSuccess && nextProcess()) { - return; + if (exitSuccess) { + // update uab backend + commitCurrentChangeToBackend(); + + // continue next process, if error occurred, terminate current install/uninstall. + if (nextProcess()) { + return; + } } m_procFlag = Error; @@ -156,7 +164,7 @@ bool UabProcessController::nextProcess() // check process finish m_currentIndex++; - if (m_currentIndex > m_process->size()) { + if (m_currentIndex >= m_procList.size()) { m_procFlag = Finish; Q_EMIT processFinished(true); return true; @@ -167,7 +175,7 @@ bool UabProcessController::nextProcess() return false; } - auto currentProc = m_procList.value(m_currentIndex); + const auto ¤tProc = m_procList.at(m_currentIndex); switch (currentProc.first) { case Installing: return installImpl(currentProc.second); @@ -232,4 +240,23 @@ bool UabProcessController::checkIndexValid() return 0 <= m_currentIndex && m_currentIndex < m_procList.size(); } +void UabProcessController::commitCurrentChangeToBackend() +{ + if (!checkIndexValid()) { + return; + } + + const auto ¤tProc = m_procList.at(m_currentIndex); + switch (currentProc.first) { + case Installing: + Uab::UabBackend::instance()->packageInstalled(currentProc.second); + break; + case Uninstalling: + Uab::UabBackend::instance()->packageRemoved(currentProc.second); + break; + default: + break; + } +} + } // namespace Uab diff --git a/src/deb-installer/uab/uab_process_controller.h b/src/deb-installer/uab/uab_process_controller.h index 4cc46d01..3168a8b6 100644 --- a/src/deb-installer/uab/uab_process_controller.h +++ b/src/deb-installer/uab/uab_process_controller.h @@ -58,9 +58,11 @@ class UabProcessController : public QObject bool checkIndexValid(); + void commitCurrentChangeToBackend(); + private: QProcess *m_process{nullptr}; - + ProcFlags m_procFlag{Prepare}; int m_currentIndex{-1}; QList> m_procList; // install/uninstall package list