From e14d7b954013eb29c1481f81fbc5a1827e10cfe2 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Thu, 6 Jun 2024 11:17:43 +0800 Subject: [PATCH] refactor: dumpDBusObject Signed-off-by: ComixHe --- src/dbus/applicationmanager1service.cpp | 42 +++++++++++++------------ src/dbus/applicationservice.h | 4 +-- src/global.h | 34 +++++++++----------- tests/ut_applicationmanager.cpp | 5 +-- 4 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index 484fdf4..c87f8c2 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -69,30 +69,31 @@ 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); + connect( + &dispatcher, &SystemdSignalDispatcher::SystemdJobNew, this, [this](QString unitName, QDBusObjectPath systemdUnitPath) { + auto info = processUnitName(unitName); + auto appId = std::move(info.applicationID); - if (appId.isEmpty()) { - return; - } + if (appId.isEmpty()) { + return; + } - auto app = m_applicationList.value(appId); + auto app = m_applicationList.value(appId); - if (!app) { - return; - } + if (!app) { + return; + } - // 服务在 AM 之后启动那么 instance size 是 0, newJob 时尝试添加一次 - // 比如 dde-file-manager.service 如果启动的比 AM 晚,那么在 scanInstances 时不会 addInstanceToApplication - if (app->instances().size() > 0) { - return; - } + // 服务在 AM 之后启动那么 instance size 是 0, newJob 时尝试添加一次 + // 比如 dde-file-manager.service 如果启动的比 AM 晚,那么在 scanInstances 时不会 addInstanceToApplication + if (app->instances().size() > 0) { + return; + } - qDebug() << "add Instance " << unitName << "on JobNew, " << app->instances().size(); + qDebug() << "add Instance " << unitName << "on JobNew, " << app->instances().size(); - addInstanceToApplication(unitName, systemdUnitPath); - }); + addInstanceToApplication(unitName, systemdUnitPath); + }); connect(&dispatcher, &SystemdSignalDispatcher::SystemdUnitRemoved, @@ -702,9 +703,10 @@ QHash> ApplicationManager1Service::findApplicationsByIds(const QStringList &appIds) const noexcept { QHash> ret; - for (const auto appId : appIds) { - if (auto app = m_applicationList.value(appId); app) + for (const auto &appId : appIds) { + if (auto app = m_applicationList.value(appId); app) { ret.insert(QDBusObjectPath{getObjectPathFromAppId(appId)}, app); + } } return ret; diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h index eae1c6e..f2acd30 100644 --- a/src/dbus/applicationservice.h +++ b/src/dbus/applicationservice.h @@ -120,7 +120,7 @@ public: void removeAllInstance() noexcept; [[nodiscard]] const QDBusObjectPath &applicationPath() const noexcept { return m_applicationPath; } [[nodiscard]] DesktopFile &desktopFileSource() noexcept { return m_desktopSource; } - [[nodiscard]] const QMap> &applicationInstances() const noexcept + [[nodiscard]] const QHash> &applicationInstances() const noexcept { return m_Instances; } @@ -181,7 +181,7 @@ private: QString m_launcher{getApplicationLauncherBinary()}; DesktopFile m_desktopSource; QSharedPointer m_entry{nullptr}; - QMap> m_Instances; + QHash> m_Instances; void updateAfterLaunch(bool isLaunch) noexcept; static bool shouldBeShown(const std::unique_ptr &entry) noexcept; [[nodiscard]] bool autostartCheck(const QString &filePath) const noexcept; diff --git a/src/global.h b/src/global.h index ac82456..1161602 100644 --- a/src/global.h +++ b/src/global.h @@ -540,29 +540,21 @@ inline unitInfo processUnitName(const QString &unitName) return {unescapeApplicationId(applicationId), std::move(launcher), std::move(instanceId)}; } -template class Container, typename QDBusObjectPath, typename T> -ObjectMap dumpDBusObject(const Container> &map) +template +ObjectMap dumpDBusObject(const QHash> &map) { + static_assert(std::is_base_of_v, "dumpDBusObject only support which derived by QObject class"); ObjectMap objs; - for (auto it = map.constKeyValueBegin(); it != map.constKeyValueEnd(); ++it) { - const auto &[key, value] = *it; + for (const auto &[key, value] : map.asKeyValueRange()) { auto interAndProps = getChildInterfacesAndPropertiesFromObject(value.data()); - objs.insert(key, interAndProps); - } - - return objs; -} - -template -ObjectMap dumpDBusObject(const QHash> &map) -{ - ObjectMap objs; - - for (auto it = map.constKeyValueBegin(); it != map.constKeyValueEnd(); ++it) { - const auto &[key, value] = *it; - auto interAndProps = getChildInterfacesAndPropertiesFromObject(value.data()); - objs.insert(QDBusObjectPath{getObjectPathFromAppId(key)}, interAndProps); + if constexpr (std::is_same_v) { + objs.insert(QDBusObjectPath{getObjectPathFromAppId(key)}, interAndProps); + } else if constexpr (std::is_same_v) { + objs.insert(key, interAndProps); + } else { + static_assert(false, "dumpDBusObject only support QString/QDBusObject as key type"); + } } return objs; @@ -665,6 +657,8 @@ inline int pidfd_open(pid_t pid, uint flags) return syscall(SYS_pidfd_open, pid, flags); } -#define safe_sendErrorReply if (calledFromDBus()) sendErrorReply +#define safe_sendErrorReply \ + if (calledFromDBus()) \ + sendErrorReply #endif diff --git a/tests/ut_applicationmanager.cpp b/tests/ut_applicationmanager.cpp index e2c69c4..5d88f82 100644 --- a/tests/ut_applicationmanager.cpp +++ b/tests/ut_applicationmanager.cpp @@ -31,12 +31,13 @@ public: std::shared_ptr tmp{nullptr}; m_am = new ApplicationManager1Service{std::make_unique(), tmp}; auto ptr = std::make_unique(QString{"/usr/share/applications/test-Application.desktop"}); - DesktopFile file{std::move(ptr), "test-Application", 0, 0}; + const auto *appID = "test-Application"; + DesktopFile file{std::move(ptr), appID, 0, 0}; QSharedPointer app = QSharedPointer::create(std::move(file), nullptr, tmp); QSharedPointer instance = QSharedPointer::create( InstancePath.path().split('/').last(), ApplicationPath.path(), QString{"/"}, QString{"DDE"}); app->m_Instances.insert(InstancePath, instance); - m_am->m_applicationList.insert(ApplicationPath, app); + m_am->m_applicationList.insert(appID, app); new InstanceAdaptor{instance.data()}; }