diff --git a/src/deb-installer/uab/uab_dbus_package_manager.cpp b/src/deb-installer/uab/uab_dbus_package_manager.cpp index 098d6228..2394f745 100644 --- a/src/deb-installer/uab/uab_dbus_package_manager.cpp +++ b/src/deb-installer/uab/uab_dbus_package_manager.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include namespace Uab { @@ -153,6 +153,12 @@ bool UabDBusPackageManager::installFormFile(const UabPackage::Ptr &installPtr) return true; } +/** + @brief Uninstall \a uninstallPtr package. + This function will return immediately, and the uninstall process will run in the thread-pool, + avoid the dbus interface blocks threads. + @return True if uninstall start, false if \a uninstallPtr invalid or is running + */ bool UabDBusPackageManager::uninstall(const UabPackage::Ptr &uninstallPtr) { if (!uninstallPtr || !uninstallPtr->isValid() || isRunning()) { @@ -160,40 +166,57 @@ bool UabDBusPackageManager::uninstall(const UabPackage::Ptr &uninstallPtr) } ensureInterface(); - QVariantMap pkgParams; - pkgParams[kllParamId] = uninstallPtr->info()->id; - pkgParams[kllParamVersion] = uninstallPtr->info()->version; - pkgParams[kllParamChannel] = uninstallPtr->info()->channel; - pkgParams[kllParamModule] = uninstallPtr->info()->module; - QVariantMap params; - params[kllParamPackage] = pkgParams; - - QDBusReply reply = m_interface->call(kllDBusUninstall, params); - if (reply.error().isValid()) { - qWarning() << qPrintable("call LinglongPM dbus fails:") << reply.error().message(); - return false; - } - - const QVariantMap data = reply.value(); - const int code = data.value(kllRetCode).toInt(); - if (Uab::UabSuccess != code) { - qWarning() << QString("LinglingPM return error: [%1] %2").arg(code).arg(data.value(kllRetMessage).toString()); - return false; - } - - m_currentTask.taskId = data.value(kllRetTaskId).toString(); - m_currentTask.code = code; - m_currentTask.message = data.value(kllRetMessage).toString(); - - qInfo() << QString("Requset LinglingPM uninstall: %1/%2 [message]: %3") - .arg(uninstallPtr->info()->id) - .arg(uninstallPtr->info()->version) - .arg(m_currentTask.message); - - QTimer::singleShot(0, this, [this]() { - Q_EMIT progressChanged(100, m_currentTask.message); - Q_EMIT packageFinished(true); + m_currentTask.taskId = "mark uninstall"; + + QtConcurrent::run([this, uninstallPtr]() { + bool callRet{false}; + QString message; + + do { + QVariantMap pkgParams; + pkgParams[kllParamId] = uninstallPtr->info()->id; + pkgParams[kllParamVersion] = uninstallPtr->info()->version; + pkgParams[kllParamChannel] = uninstallPtr->info()->channel; + pkgParams[kllParamModule] = uninstallPtr->info()->module; + QVariantMap params; + params[kllParamPackage] = pkgParams; + + QDBusReply reply = m_interface->call(kllDBusUninstall, params); + if (reply.error().isValid()) { + qWarning() << qPrintable("call LinglongPM dbus fails:") << reply.error().message(); + break; + } + + const QVariantMap data = reply.value(); + const int code = data.value(kllRetCode).toInt(); + if (Uab::UabSuccess != code) { + message = data.value(kllRetMessage).toString(); + qWarning() << QString("LinglingPM return error: [%1] %2").arg(code).arg(message); + break; + } + + const QString taskId = data.value(kllRetTaskId).toString(); + message = data.value(kllRetMessage).toString(); + + qInfo() << QString("Requset LinglingPM uninstall: %1/%2 [message]: %3") + .arg(uninstallPtr->info()->id) + .arg(uninstallPtr->info()->version) + .arg(message); + + callRet = true; + } while (false); + + // notify on package manager thread + QMetaObject::invokeMethod( + this, + [this, message, callRet]() { + m_currentTask.taskId.clear(); + Q_EMIT progressChanged(callRet ? 100 : 0, message); + Q_EMIT packageFinished(callRet); + }, + Qt::QueuedConnection); }); + // uninstall not need receive task info, remove imdealtly and fast return true; } diff --git a/src/deb-installer/utils/utils.cpp b/src/deb-installer/utils/utils.cpp index 69d7e12f..7ba734e7 100644 --- a/src/deb-installer/utils/utils.cpp +++ b/src/deb-installer/utils/utils.cpp @@ -344,7 +344,7 @@ Pkg::PackageType Utils::detectPackage(const QString &filePath) if (info.suffix().toLower() == "deb" || mime.name().startsWith("application/vnd.debian.binary-package")) { return Pkg::Deb; } - if (info.suffix().toLower() == "uab") { + if (info.suffix().toLower() == "uab" || mime.name().startsWith("application/vnd.linyaps.uab")) { return Pkg::Uab; }