Skip to content

Commit

Permalink
feat: commit changes to uab backend
Browse files Browse the repository at this point in the history
Commit changes to uab backend after install/uninstall.
Fix some issue.

Log: Commit changes to uab backend.
Influence: uab-package
  • Loading branch information
rb-union committed Sep 23, 2024
1 parent a296422 commit 3857731
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 19 deletions.
3 changes: 3 additions & 0 deletions src/deb-installer/model/proxy_package_list_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -124,6 +125,7 @@ void ProxyPackageListModel::reset()
info.count = 0;
info.rightCount = 0;
}
setWorkerStatus(WorkerPrepare);
}

void ProxyPackageListModel::resetInstallStatus()
Expand All @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions src/deb-installer/model/proxy_package_list_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -47,15 +47,15 @@ class ProxyPackageListModel : public AbstractPackageListModel
Q_SLOT void onSourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles);

private:
int m_procModelIndex; // current processing model index
int m_procModelIndex{-1}; // current processing model index

struct ModelInfo
{
ModelPtr model{nullptr};
int count{0}; // cached model item count
int rightCount{0}; // index counts for current and previous models
};
QList<ModelInfo> m_packageModels; // all package list models (deb/uab)
QList<ModelInfo> m_packageModels; // all package list models (deb/uab)
};

#endif // PROXY_PACKAGE_LIST_MODEL_H
35 changes: 31 additions & 4 deletions src/deb-installer/uab/uab_backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {};
}

Expand Down Expand Up @@ -225,20 +226,45 @@ void UabBackend::sortPackages(QList<UabPkgInfo::Ptr> &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 {};
}

Expand Down Expand Up @@ -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 {};
}

Expand Down
4 changes: 4 additions & 0 deletions src/deb-installer/uab/uab_backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ class UabBackend : public QObject
static void backendProcess(const QPointer<Uab::UabBackend> &notifyPtr);
static void sortPackages(QList<UabPkgInfo::Ptr> &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;
Expand Down
14 changes: 8 additions & 6 deletions src/deb-installer/uab/uab_package_list_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -239,7 +241,7 @@ void UabPackageListModel::installNextUab()
return;
}

setCurrentOperation(Pkg::Waiting);
setCurrentOperation(Pkg::Operating);

m_processor->reset();
switch (uabPtr->installStatus()) {
Expand All @@ -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);
Expand Down Expand Up @@ -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});
Expand Down
2 changes: 1 addition & 1 deletion src/deb-installer/uab/uab_package_list_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
35 changes: 31 additions & 4 deletions src/deb-installer/uab/uab_process_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include <QProcess>
#include <QDebug>

#include "uab_backend.h"

namespace Uab {

const QString kLinglongBin = "ll-cli";
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -167,7 +175,7 @@ bool UabProcessController::nextProcess()
return false;
}

auto currentProc = m_procList.value(m_currentIndex);
const auto &currentProc = m_procList.at(m_currentIndex);
switch (currentProc.first) {
case Installing:
return installImpl(currentProc.second);
Expand Down Expand Up @@ -232,4 +240,23 @@ bool UabProcessController::checkIndexValid()
return 0 <= m_currentIndex && m_currentIndex < m_procList.size();
}

void UabProcessController::commitCurrentChangeToBackend()
{
if (!checkIndexValid()) {
return;
}

const auto &currentProc = 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
4 changes: 3 additions & 1 deletion src/deb-installer/uab/uab_process_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<QPair<ProcFlag, UabPkgInfo::Ptr>> m_procList; // install/uninstall package list
Expand Down

0 comments on commit 3857731

Please sign in to comment.