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"