1 /*
2     SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde@privat.broulik.de>
3 
4     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5 */
6 
7 #pragma once
8 
9 #include <QDBusContext>
10 #include <QDBusObjectPath>
11 #include <QObject>
12 #include <QSet>
13 #include <QVector>
14 
15 #include "notifications.h"
16 
17 class QDBusServiceWatcher;
18 class QTimer;
19 
20 namespace NotificationManager
21 {
22 class Job;
23 
24 class Q_DECL_HIDDEN JobsModelPrivate : public QObject, protected QDBusContext
25 {
26     Q_OBJECT
27 
28 public:
29     JobsModelPrivate(QObject *parent);
30     ~JobsModelPrivate() override;
31 
32     // DBus
33     // kuiserver
34     void registerService(const QString &service, const QString &objectPath);
35     void emitJobUrlsChanged();
36     bool requiresJobTracker() const;
37     QStringList registeredJobContacts() const;
38     // V1
39     QDBusObjectPath requestView(const QString &appName, const QString &appIconName, int capabilities);
40     // V2
41     QDBusObjectPath requestView(const QString &desktopEntry, int capabilities, const QVariantMap &hints);
42 
43 Q_SIGNALS:
44     void jobViewAboutToBeAdded(int row, Job *job);
45     void jobViewAdded(int row, Job *job);
46 
47     void jobViewAboutToBeRemoved(int row); //, Job *job);
48     void jobViewRemoved(int row);
49 
50     void jobViewChanged(int row, Job *job, const QVector<int> &roles);
51 
52     void serviceOwnershipLost();
53 
54     // DBus
55     // kuiserver
56     void jobUrlsChanged(const QStringList &urls);
57 
58 public: // stuff used by public class
59     bool init();
60 
61     void remove(Job *job);
62     void removeAt(int row);
63 
64     bool m_valid = false;
65     QVector<Job *> m_jobViews;
66 
67 private:
68     void unwatchJob(Job *job);
69     void onServiceUnregistered(const QString &serviceName);
70 
71     void updateApplicationPercentage(const QString &desktopEntry);
72 
73     QStringList jobUrls() const;
74     void scheduleUpdate(Job *job, Notifications::Roles role);
75 
76     QDBusServiceWatcher *m_serviceWatcher = nullptr;
77     // Job -> serviceName
78     QHash<Job *, QString> m_jobServices;
79     int m_highestJobId = 1;
80 
81     QTimer *m_compressUpdatesTimer = nullptr;
82     QHash<Job *, QVector<int>> m_pendingDirtyRoles;
83 
84     QVector<Job *> m_pendingJobViews;
85 };
86 
87 } // namespace NotificationManager
88