File indexing completed on 2024-04-21 04:56:45

0001 /**
0002  * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #ifndef DEVICE_H
0008 #define DEVICE_H
0009 
0010 #include <QHostAddress>
0011 #include <QObject>
0012 #include <QString>
0013 
0014 #include "backends/devicelink.h"
0015 #include "deviceinfo.h"
0016 #include "networkpacket.h"
0017 #include "pairstate.h"
0018 
0019 class DeviceLink;
0020 class KdeConnectPlugin;
0021 
0022 class KDECONNECTCORE_EXPORT Device : public QObject
0023 {
0024     Q_OBJECT
0025     Q_CLASSINFO("D-Bus Interface", "org.kde.kdeconnect.device")
0026     Q_PROPERTY(QString type READ typeAsString NOTIFY typeChanged)
0027     Q_PROPERTY(QString name READ name NOTIFY nameChanged)
0028     Q_PROPERTY(QString iconName READ iconName CONSTANT)
0029     Q_PROPERTY(QString statusIconName READ statusIconName NOTIFY statusIconNameChanged)
0030     Q_PROPERTY(bool isReachable READ isReachable NOTIFY reachableChanged)
0031     Q_PROPERTY(bool isPaired READ isPaired NOTIFY pairStateChanged)
0032     Q_PROPERTY(bool isPairRequested READ isPairRequested NOTIFY pairStateChanged)
0033     Q_PROPERTY(bool isPairRequestedByPeer READ isPairRequestedByPeer NOTIFY pairStateChanged)
0034     Q_PROPERTY(int pairState READ pairStateAsInt NOTIFY pairStateChanged)
0035     Q_PROPERTY(QStringList supportedPlugins READ supportedPlugins NOTIFY pluginsChanged)
0036 
0037 public:
0038     /**
0039      * Restores the @p device from the saved configuration
0040      *
0041      * We already know it but we need to wait for an incoming DeviceLink to communicate
0042      */
0043     Device(QObject *parent, const QString &id);
0044 
0045     /**
0046      * Device known via an incoming connection sent to us via a devicelink.
0047      *
0048      * We know everything but we don't trust it yet
0049      */
0050     Device(QObject *parent, DeviceLink *link);
0051 
0052     ~Device() override;
0053 
0054     QString id() const;
0055     QString name() const;
0056     QString dbusPath() const
0057     {
0058         return QStringLiteral("/modules/kdeconnect/devices/") + id();
0059     }
0060     DeviceType type() const;
0061     QString typeAsString() const
0062     {
0063         return type().toString();
0064     };
0065     QString iconName() const;
0066     QString statusIconName() const;
0067     Q_SCRIPTABLE QByteArray verificationKey() const;
0068     Q_SCRIPTABLE QString encryptionInfo() const;
0069 
0070     // Add and remove links
0071     void addLink(DeviceLink *link);
0072     void removeLink(DeviceLink *link);
0073 
0074     bool updateDeviceInfo(const DeviceInfo &deviceInfo);
0075 
0076     PairState pairState() const;
0077     Q_SCRIPTABLE int pairStateAsInt() const; // Hack because qdbus doesn't like enums
0078     Q_SCRIPTABLE bool isPaired() const;
0079     Q_SCRIPTABLE bool isPairRequested() const;
0080     Q_SCRIPTABLE bool isPairRequestedByPeer() const;
0081     virtual bool isReachable() const;
0082 
0083     Q_SCRIPTABLE QStringList loadedPlugins() const;
0084     Q_SCRIPTABLE bool hasPlugin(const QString &name) const;
0085 
0086     Q_SCRIPTABLE QString pluginsConfigFile() const;
0087 
0088     KdeConnectPlugin *plugin(const QString &pluginName) const;
0089     Q_SCRIPTABLE void setPluginEnabled(const QString &pluginName, bool enabled);
0090     Q_SCRIPTABLE bool isPluginEnabled(const QString &pluginName) const;
0091 
0092     int protocolVersion();
0093     QStringList supportedPlugins() const;
0094 
0095     QHostAddress getLocalIpAddress() const;
0096 
0097 public Q_SLOTS:
0098     /// sends a @p np packet to the device
0099     /// virtual for testing purposes.
0100     virtual bool sendPacket(NetworkPacket &np);
0101 
0102     // Dbus operations
0103 public Q_SLOTS:
0104     Q_SCRIPTABLE void requestPairing();
0105     Q_SCRIPTABLE void unpair();
0106     Q_SCRIPTABLE void reloadPlugins(); // from kconf
0107 
0108     Q_SCRIPTABLE void acceptPairing();
0109     Q_SCRIPTABLE void cancelPairing();
0110 
0111     Q_SCRIPTABLE QString pluginIconName(const QString &pluginName);
0112 private Q_SLOTS:
0113     void privateReceivedPacket(const NetworkPacket &np);
0114     void linkDestroyed(QObject *o);
0115 
0116     void pairingHandler_incomingPairRequest();
0117     void pairingHandler_pairingFailed(const QString &errorMessage);
0118     void pairingHandler_pairingSuccessful();
0119     void pairingHandler_unpaired();
0120 
0121 Q_SIGNALS:
0122     Q_SCRIPTABLE void pluginsChanged();
0123     Q_SCRIPTABLE void reachableChanged(bool reachable);
0124     Q_SCRIPTABLE void pairStateChanged(int pairState); // Hack because qdbus doesn't like enums
0125     Q_SCRIPTABLE void pairingFailed(const QString &error);
0126     Q_SCRIPTABLE void nameChanged(const QString &name);
0127     Q_SCRIPTABLE void typeChanged(const QString &type);
0128     Q_SCRIPTABLE void statusIconNameChanged();
0129 
0130 private: // Methods
0131     QSslCertificate certificate() const;
0132 
0133 private:
0134     class DevicePrivate;
0135     DevicePrivate *d;
0136 };
0137 
0138 Q_DECLARE_METATYPE(Device *)
0139 
0140 #endif // DEVICE_H