File indexing completed on 2024-04-28 04:57:02

0001 /**
0002  * SPDX-FileCopyrightText: 2023 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_INFO_H
0008 #define DEVICE_INFO_H
0009 
0010 #include "networkpacket.h"
0011 #include <QSet>
0012 #include <QSslCertificate>
0013 #include <QString>
0014 
0015 struct DeviceType {
0016     enum Value {
0017         Unknown,
0018         Desktop,
0019         Laptop,
0020         Phone,
0021         Tablet,
0022         Tv,
0023     };
0024 
0025     static DeviceType FromString(const QString &deviceType)
0026     {
0027         if (deviceType == QLatin1String("desktop"))
0028             return DeviceType::Desktop;
0029         if (deviceType == QLatin1String("laptop"))
0030             return DeviceType::Laptop;
0031         if (deviceType == QLatin1String("smartphone") || deviceType == QLatin1String("phone"))
0032             return DeviceType::Phone;
0033         if (deviceType == QLatin1String("tablet"))
0034             return DeviceType::Tablet;
0035         if (deviceType == QLatin1String("tv"))
0036             return DeviceType::Tv;
0037         return DeviceType::Unknown;
0038     }
0039 
0040     QString toString() const
0041     {
0042         if (value == DeviceType::Desktop)
0043             return QStringLiteral("desktop");
0044         if (value == DeviceType::Laptop)
0045             return QStringLiteral("laptop");
0046         if (value == DeviceType::Phone)
0047             return QStringLiteral("phone");
0048         if (value == DeviceType::Tablet)
0049             return QStringLiteral("tablet");
0050         if (value == DeviceType::Tv)
0051             return QStringLiteral("tv");
0052         return QStringLiteral("unknown");
0053     }
0054 
0055     QString icon() const
0056     {
0057         return iconForStatus(true, false);
0058     }
0059 
0060     QString iconForStatus(bool reachable, bool trusted) const
0061     {
0062         QString type;
0063         switch (value) {
0064         case DeviceType::Unknown:
0065         case DeviceType::Phone:
0066             type = QStringLiteral("smartphone");
0067             break;
0068         case DeviceType::Desktop: // We don't have desktop icon yet
0069         case DeviceType::Laptop:
0070             type = QStringLiteral("laptop");
0071             break;
0072         default:
0073             type = toString();
0074         }
0075         QString status = (reachable ? (trusted ? QStringLiteral("connected") : QStringLiteral("disconnected")) : QStringLiteral("trusted"));
0076         return type + status;
0077     }
0078 
0079     constexpr DeviceType(Value value)
0080         : value(value)
0081     {
0082     }
0083     constexpr bool operator==(DeviceType a) const
0084     {
0085         return value == a.value;
0086     }
0087     constexpr bool operator!=(DeviceType a) const
0088     {
0089         return value != a.value;
0090     }
0091 
0092 private:
0093     Value value;
0094 };
0095 
0096 struct DeviceInfo {
0097     QString id;
0098     QSslCertificate certificate;
0099     QString name;
0100     DeviceType type;
0101     int protocolVersion;
0102     QSet<QString> incomingCapabilities;
0103     QSet<QString> outgoingCapabilities;
0104 
0105     DeviceInfo(const QString &id,
0106                const QSslCertificate &certificate,
0107                const QString &name,
0108                DeviceType type,
0109                int protocolVersion = 0,
0110                const QSet<QString> &incomingCapabilities = QSet<QString>(),
0111                const QSet<QString> &outgoingCapabilities = QSet<QString>())
0112         : id(id)
0113         , certificate(certificate)
0114         , name(name)
0115         , type(type)
0116         , protocolVersion(protocolVersion)
0117         , incomingCapabilities(incomingCapabilities)
0118         , outgoingCapabilities(outgoingCapabilities)
0119     {
0120     }
0121 
0122     NetworkPacket toIdentityPacket()
0123     {
0124         NetworkPacket np(PACKET_TYPE_IDENTITY);
0125         np.set(QStringLiteral("deviceId"), id);
0126         np.set(QStringLiteral("deviceName"), name);
0127         np.set(QStringLiteral("deviceType"), type.toString());
0128         np.set(QStringLiteral("protocolVersion"), protocolVersion);
0129         np.set(QStringLiteral("incomingCapabilities"), incomingCapabilities.values());
0130         np.set(QStringLiteral("outgoingCapabilities"), outgoingCapabilities.values());
0131         return np;
0132     }
0133 
0134     static DeviceInfo FromIdentityPacketAndCert(const NetworkPacket &np, const QSslCertificate &certificate)
0135     {
0136         QStringList incomingCapabilities = np.get<QStringList>(QStringLiteral("incomingCapabilities"));
0137         QStringList outgoingCapabilities = np.get<QStringList>(QStringLiteral("outgoingCapabilities"));
0138 
0139         return DeviceInfo(np.get<QString>(QStringLiteral("deviceId")),
0140                           certificate,
0141                           np.get<QString>(QStringLiteral("deviceName")),
0142                           DeviceType::FromString(np.get<QString>(QStringLiteral("deviceType"))),
0143                           np.get<int>(QStringLiteral("protocolVersion"), -1),
0144                           QSet<QString>(incomingCapabilities.begin(), incomingCapabilities.end()),
0145                           QSet<QString>(outgoingCapabilities.begin(), outgoingCapabilities.end()));
0146     }
0147 };
0148 
0149 #endif