1 /**
2  * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
3  *
4  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5  */
6 
7 #ifndef KDECONNECT_DAEMON_H
8 #define KDECONNECT_DAEMON_H
9 
10 #include <QObject>
11 #include <QSet>
12 #include <QMap>
13 
14 #include "kdeconnectcore_export.h"
15 #include "device.h"
16 
17 class NetworkPacket;
18 class DeviceLink;
19 class Device;
20 class QNetworkAccessManager;
21 class KJobTrackerInterface;
22 
23 class KDECONNECTCORE_EXPORT Daemon
24     : public QObject
25 {
26     Q_OBJECT
27     Q_CLASSINFO("D-Bus Interface", "org.kde.kdeconnect.daemon")
28     Q_PROPERTY(bool isDiscoveringDevices READ isDiscoveringDevices)
29     Q_PROPERTY(QStringList pairingRequests READ pairingRequests NOTIFY pairingRequestsChanged)
30    Q_PROPERTY(QStringList customDevices
31               READ customDevices WRITE setCustomDevices NOTIFY customDevicesChanged)
32 
33 public:
34     explicit Daemon(QObject* parent, bool testMode = false);
35     ~Daemon() override;
36 
37     static Daemon* instance();
38 
39     QList<Device*> devicesList() const;
40 
41     virtual void askPairingConfirmation(Device* device) = 0;
42     virtual void reportError(const QString& title, const QString& description) = 0;
43     virtual void quit() = 0;
44     virtual QNetworkAccessManager* networkAccessManager();
45     virtual KJobTrackerInterface* jobTracker() = 0;
46 
47     Device* getDevice(const QString& deviceId);
48 
49     const QSet<LinkProvider*>& getLinkProviders() const;
50 
51     QStringList pairingRequests() const;
52 
53     // Custom devices
54     QStringList customDevices() const;
55     void setCustomDevices(const QStringList& addresses);
56 
57     Q_SCRIPTABLE QString selfId() const;
58 public Q_SLOTS:
59     Q_SCRIPTABLE void acquireDiscoveryMode(const QString& id);
60     Q_SCRIPTABLE void releaseDiscoveryMode(const QString& id);
61 
62     Q_SCRIPTABLE void forceOnNetworkChange();
63 
64     ///don't try to turn into Q_PROPERTY, it doesn't work
65     Q_SCRIPTABLE QString announcedName();
66     Q_SCRIPTABLE void setAnnouncedName(const QString& name);
67 
68     //Returns a list of ids. The respective devices can be manipulated using the dbus path: "/modules/kdeconnect/Devices/"+id
69     Q_SCRIPTABLE QStringList devices(bool onlyReachable = false, bool onlyPaired = false) const;
70 
71     Q_SCRIPTABLE QMap<QString,QString> deviceNames(bool onlyReachable = false, bool onlyPaired = false) const;
72 
73     Q_SCRIPTABLE QString deviceIdByName(const QString& name) const;
74 
75     Q_SCRIPTABLE virtual void sendSimpleNotification(const QString &eventId, const QString &title, const QString &text, const QString &iconName) = 0;
76 
77     Q_SCRIPTABLE void openConfiguration(const QString &deviceId = QString(), const QString &pluginId = QString());
78 
79 Q_SIGNALS:
80     Q_SCRIPTABLE void deviceAdded(const QString& id);
81     Q_SCRIPTABLE void deviceRemoved(const QString& id); //Note that paired devices will never be removed
82     Q_SCRIPTABLE void deviceVisibilityChanged(const QString& id, bool isVisible);
83     Q_SCRIPTABLE void deviceListChanged(); //Emitted when any of deviceAdded, deviceRemoved or deviceVisibilityChanged is emitted
84     Q_SCRIPTABLE void announcedNameChanged(const QString& announcedName);
85     Q_SCRIPTABLE void pairingRequestsChanged();
86     Q_SCRIPTABLE void customDevicesChanged(const QStringList& customDevices);
87 
88 private Q_SLOTS:
89     void onNewDeviceLink(const NetworkPacket& identityPacket, DeviceLink* dl);
90     void onDeviceStatusChanged();
91 
92 private:
93     void init();
94 
95 protected:
96     void addDevice(Device* device);
97     bool isDiscoveringDevices() const;
98     void removeDevice(Device* d);
99     void cleanDevices();
100 
101     QScopedPointer<struct DaemonPrivate> d;
102 };
103 
104 #endif
105