From 2cc1515229f4a887ce3b5994c7893d1badffefdd Mon Sep 17 00:00:00 2001 From: ck Date: Tue, 4 Jun 2024 15:53:48 +0800 Subject: [PATCH] fix: instance not add if service start after AM try add instance on JobNew signal Issue: https://github.com/linuxdeepin/developer-center/issues/8879 --- src/dbus/applicationmanager1service.cpp | 26 +++++++++++++++++++++++++ src/systemdsignaldispatcher.cpp | 15 ++++++++++++++ src/systemdsignaldispatcher.h | 2 ++ 3 files changed, 43 insertions(+) diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index 46f40ae..31737e1 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -69,6 +69,32 @@ void ApplicationManager1Service::initService(QDBusConnection &connection) noexce auto &dispatcher = SystemdSignalDispatcher::instance(); connect(&dispatcher, &SystemdSignalDispatcher::SystemdUnitNew, this, &ApplicationManager1Service::addInstanceToApplication); + connect(&dispatcher, &SystemdSignalDispatcher::SystemdJobNew, this, [this](QString unitName, QDBusObjectPath systemdUnitPath){ + auto info = processUnitName(unitName); + auto appId = std::move(info.applicationID); + + if (appId.isEmpty()) { + return; + } + + auto appIt = std::find_if(m_applicationList.cbegin(), + m_applicationList.cend(), + [&appId](const QSharedPointer &app) { return app->id() == appId; }); + + if (appIt == m_applicationList.cend()) { + return; + } + + // 服务在 AM 之后启动那么 instance size 是 0, newJob 时尝试添加一次 + // 比如 dde-file-manager.service 如果启动的比 AM 晚,那么在 scanInstances 时不会 addInstanceToApplication + if ((*appIt)->instances().size() > 0) { + return; + } + + qDebug() << "add Instance " << unitName << "on JobNew"; + + addInstanceToApplication(unitName, systemdUnitPath); + }); connect(&dispatcher, &SystemdSignalDispatcher::SystemdUnitRemoved, diff --git a/src/systemdsignaldispatcher.cpp b/src/systemdsignaldispatcher.cpp index d3c36d0..96be893 100644 --- a/src/systemdsignaldispatcher.cpp +++ b/src/systemdsignaldispatcher.cpp @@ -38,6 +38,16 @@ bool SystemdSignalDispatcher::connectToSignals() noexcept return false; } + if (!con.connect(SystemdService, + SystemdObjectPath, + SystemdInterfaceName, + "JobNew", + this, + SLOT(onJobNew(uint32_t, QDBusObjectPath, QString)))) { + qCritical() << "can't connect to UnitNew signal of systemd service."; + return false; + } + return true; } @@ -57,6 +67,11 @@ void SystemdSignalDispatcher::onUnitNew(QString unitName, QDBusObjectPath system emit SystemdUnitNew(unitName, systemdUnitPath); } +void SystemdSignalDispatcher::onJobNew(uint32_t, QDBusObjectPath systemdUnitPath, QString unitName) +{ + emit SystemdJobNew(unitName, systemdUnitPath); +} + void SystemdSignalDispatcher::onUnitRemoved(QString unitName, QDBusObjectPath systemdUnitPath) { emit SystemdUnitRemoved(unitName, systemdUnitPath); diff --git a/src/systemdsignaldispatcher.h b/src/systemdsignaldispatcher.h index 5bd3ada..1409e32 100644 --- a/src/systemdsignaldispatcher.h +++ b/src/systemdsignaldispatcher.h @@ -20,11 +20,13 @@ public: } Q_SIGNALS: void SystemdUnitNew(QString unitName, QDBusObjectPath systemdUnitPath); + void SystemdJobNew(QString unitName, QDBusObjectPath systemdUnitPath); void SystemdUnitRemoved(QString unitName, QDBusObjectPath systemdUnitPath); void SystemdEnvironmentChanged(QStringList envs); private Q_SLOTS: void onUnitNew(QString unitName, QDBusObjectPath systemdUnitPath); + void onJobNew(uint32_t id, QDBusObjectPath systemdUnitPath, QString unitName); void onUnitRemoved(QString unitName, QDBusObjectPath systemdUnitPath); void onPropertiesChanged(QString interface, QVariantMap props, QStringList invalid);