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