File indexing completed on 2024-04-28 05:11:03
0001 /* 0002 SPDX-FileCopyrightText: 2018-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "unityservicemanager.h" 0008 0009 #include <QApplication> 0010 #include <QDBusConnection> 0011 #include <QDBusConnectionInterface> 0012 #include <QDBusMessage> 0013 #include <QDBusPendingCallWatcher> 0014 #include <QDBusPendingReply> 0015 #include <QDBusServiceWatcher> 0016 0017 UnityServiceManager *UnityServiceManager::mInstance = nullptr; 0018 0019 UnityServiceManager *UnityServiceManager::instance() 0020 { 0021 if (!mInstance) { 0022 mInstance = new UnityServiceManager; 0023 } 0024 return mInstance; 0025 } 0026 0027 UnityServiceManager::UnityServiceManager(QObject *parent) 0028 : QObject(parent) 0029 , mUnityServiceWatcher(new QDBusServiceWatcher(this)) 0030 { 0031 initUnity(); 0032 } 0033 0034 UnityServiceManager::~UnityServiceManager() = default; 0035 0036 void UnityServiceManager::slotSetUnread(int unread) 0037 { 0038 if (m_unread != unread) { 0039 m_unread = unread; 0040 updateCount(); 0041 } 0042 } 0043 0044 void UnityServiceManager::updateCount() 0045 { 0046 if (mUnityServiceAvailable) { 0047 const QString launcherId = qApp->desktopFileName() + QLatin1StringView(".desktop"); 0048 0049 const QVariantMap properties{{QStringLiteral("count-visible"), m_unread > 0}, {QStringLiteral("count"), m_unread}}; 0050 0051 QDBusMessage message = QDBusMessage::createSignal(QStringLiteral("/org/akregator/UnityLauncher"), 0052 QStringLiteral("com.canonical.Unity.LauncherEntry"), 0053 QStringLiteral("Update")); 0054 message.setArguments({launcherId, properties}); 0055 QDBusConnection::sessionBus().send(message); 0056 } 0057 } 0058 0059 void UnityServiceManager::initUnity() 0060 { 0061 mUnityServiceWatcher->setConnection(QDBusConnection::sessionBus()); 0062 mUnityServiceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration | QDBusServiceWatcher::WatchForRegistration); 0063 mUnityServiceWatcher->addWatchedService(QStringLiteral("com.canonical.Unity")); 0064 connect(mUnityServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, [this](const QString &service) { 0065 Q_UNUSED(service) 0066 mUnityServiceAvailable = true; 0067 updateCount(); 0068 }); 0069 0070 connect(mUnityServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this](const QString &service) { 0071 Q_UNUSED(service) 0072 mUnityServiceAvailable = false; 0073 }); 0074 0075 // QDBusConnectionInterface::isServiceRegistered blocks 0076 QDBusPendingCall listNamesCall = QDBusConnection::sessionBus().interface()->asyncCall(QStringLiteral("ListNames")); 0077 auto callWatcher = new QDBusPendingCallWatcher(listNamesCall, this); 0078 connect(callWatcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *watcher) { 0079 QDBusPendingReply<QStringList> reply = *watcher; 0080 watcher->deleteLater(); 0081 0082 if (reply.isError()) { 0083 return; 0084 } 0085 0086 const QStringList &services = reply.value(); 0087 0088 mUnityServiceAvailable = services.contains(QLatin1StringView("com.canonical.Unity")); 0089 if (mUnityServiceAvailable) { 0090 updateCount(); 0091 } 0092 }); 0093 } 0094 0095 #include "moc_unityservicemanager.cpp"