File indexing completed on 2024-12-22 05:13:39

0001 /*
0002     SPDX-FileCopyrightText: 2013-2016 Ivan Cukic <ivan.cukic(at)kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #ifndef ACTIVITIES_CACHE_P_H
0008 #define ACTIVITIES_CACHE_P_H
0009 
0010 #include <memory>
0011 
0012 #include <QObject>
0013 
0014 #include <common/dbus/org.kde.ActivityManager.Activities.h>
0015 #include <utils/ptr_to.h>
0016 
0017 #include "activities_interface.h"
0018 #include "consumer.h"
0019 
0020 namespace KActivities
0021 {
0022 class ActivitiesCache : public QObject
0023 {
0024     Q_OBJECT
0025 
0026 public:
0027     static std::shared_ptr<ActivitiesCache> self();
0028 
0029     ~ActivitiesCache() override;
0030 
0031 Q_SIGNALS:
0032     void activityAdded(const QString &id);
0033     void activityChanged(const QString &id);
0034     void activityRemoved(const QString &id);
0035 
0036     void activityStateChanged(const QString &id, int state);
0037     void activityNameChanged(const QString &id, const QString &name);
0038     void activityDescriptionChanged(const QString &id, const QString &description);
0039     void activityIconChanged(const QString &id, const QString &icon);
0040 
0041     void currentActivityChanged(const QString &id);
0042     void serviceStatusChanged(Consumer::ServiceStatus status);
0043     void activityListChanged();
0044     void runningActivityListChanged();
0045 
0046 private Q_SLOTS:
0047     void updateAllActivities();
0048     void loadOfflineDefaults();
0049 
0050     void updateActivity(const QString &id);
0051     void updateActivityState(const QString &id, int state);
0052     void removeActivity(const QString &id);
0053 
0054     void setActivityInfoFromReply(QDBusPendingCallWatcher *watcher);
0055     void setAllActivitiesFromReply(QDBusPendingCallWatcher *watcher);
0056     void setCurrentActivityFromReply(QDBusPendingCallWatcher *watcher);
0057 
0058     void setActivityName(const QString &id, const QString &name);
0059     void setActivityDescription(const QString &id, const QString &description);
0060     void setActivityIcon(const QString &id, const QString &icon);
0061 
0062     void setActivityInfo(const ActivityInfo &info);
0063     void setAllActivities(const ActivityInfoList &activities);
0064     void setCurrentActivity(const QString &activity);
0065 
0066     void setServiceStatus(bool status);
0067 
0068 public:
0069     template<typename _Result, typename _Functor>
0070     void passInfoFromReply(QDBusPendingCallWatcher *watcher, _Functor f);
0071 
0072     static bool infoLessThan(const ActivityInfo &info, const ActivityInfo &other)
0073     {
0074         const auto comp = QString::compare(info.name, other.name, Qt::CaseInsensitive);
0075         return comp < 0 || (comp == 0 && info.id < other.id);
0076     }
0077 
0078     ActivityInfoList::iterator find(const QString &id)
0079     {
0080         return std::find_if(m_activities.begin(), m_activities.end(), [&id](const ActivityInfo &info) {
0081             return info.id == id;
0082         });
0083     }
0084 
0085     ActivityInfoList::iterator lower_bound(const ActivityInfo &info)
0086     {
0087         return std::lower_bound(m_activities.begin(), m_activities.end(), info, &infoLessThan);
0088     }
0089 
0090     template<int Policy = kamd::utils::Const>
0091     inline typename kamd::utils::ptr_to<ActivityInfo, Policy>::type getInfo(const QString &id)
0092     {
0093         const auto where = find(id);
0094 
0095         if (where != m_activities.end()) {
0096             return &(*where);
0097         }
0098 
0099         return nullptr;
0100     }
0101 
0102     template<typename TargetSlot>
0103     void onCallFinished(QDBusPendingCall &call, TargetSlot slot)
0104     {
0105         auto watcher = new QDBusPendingCallWatcher(call, this);
0106 
0107         connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher *)), this, slot);
0108     }
0109 
0110     ActivitiesCache();
0111 
0112     QList<ActivityInfo> m_activities;
0113     QString m_currentActivity;
0114     Consumer::ServiceStatus m_status;
0115 };
0116 
0117 } // namespace KActivities
0118 
0119 #endif /* ACTIVITIES_CACHE_P_H */