// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QBLUETOOTHUUID_H #define QBLUETOOTHUUID_H #include #include #include #include #include #if defined(Q_OS_DARWIN) || defined(Q_QDOC) Q_FORWARD_DECLARE_OBJC_CLASS(CBUUID); #endif QT_BEGIN_NAMESPACE #if !defined(QT_SUPPORTS_INT128) struct quint128 { quint8 data[16]; }; #endif class Q_BLUETOOTH_EXPORT QBluetoothUuid : public QUuid { public: enum class ProtocolUuid { Sdp = 0x0001, Udp = 0x0002, Rfcomm = 0x0003, Tcp = 0x0004, TcsBin = 0x0005, TcsAt = 0x0006, Att = 0x0007, Obex = 0x0008, Ip = 0x0009, Ftp = 0x000A, Http = 0x000C, Wsp = 0x000E, Bnep = 0x000F, Upnp = 0x0010, Hidp = 0x0011, HardcopyControlChannel = 0x0012, HardcopyDataChannel = 0x0014, HardcopyNotification = 0x0016, Avctp = 0x0017, Avdtp = 0x0019, Cmtp = 0x001B, UdiCPlain = 0x001D, McapControlChannel = 0x001E, McapDataChannel = 0x001F, L2cap = 0x0100 }; enum class ServiceClassUuid { ServiceDiscoveryServer = 0x1000, BrowseGroupDescriptor = 0x1001, PublicBrowseGroup = 0x1002, SerialPort = 0x1101, LANAccessUsingPPP = 0x1102, DialupNetworking = 0x1103, IrMCSync = 0x1104, ObexObjectPush = 0x1105, OBEXFileTransfer = 0x1106, IrMCSyncCommand = 0x1107, Headset = 0x1108, AudioSource = 0x110a, AudioSink = 0x110b, AV_RemoteControlTarget = 0x110c, AdvancedAudioDistribution = 0x110d, AV_RemoteControl = 0x110e, AV_RemoteControlController = 0x110f, HeadsetAG = 0x1112, PANU = 0x1115, NAP = 0x1116, GN = 0x1117, DirectPrinting = 0x1118, ReferencePrinting = 0x1119, BasicImage = 0x111a, ImagingResponder = 0x111b, ImagingAutomaticArchive = 0x111c, ImagingReferenceObjects = 0x111d, Handsfree = 0x111e, HandsfreeAudioGateway = 0x111f, DirectPrintingReferenceObjectsService = 0x1120, ReflectedUI = 0x1121, BasicPrinting = 0x1122, PrintingStatus = 0x1123, HumanInterfaceDeviceService = 0x1124, HardcopyCableReplacement = 0x1125, HCRPrint = 0x1126, HCRScan = 0x1127, SIMAccess = 0x112d, PhonebookAccessPCE = 0x112e, PhonebookAccessPSE = 0x112f, PhonebookAccess = 0x1130, HeadsetHS = 0x1131, MessageAccessServer = 0x1132, MessageNotificationServer = 0x1133, MessageAccessProfile = 0x1134, GNSS = 0x1135, GNSSServer = 0x1136, Display3D = 0x1137, Glasses3D = 0x1138, Synchronization3D = 0x1139, MPSProfile = 0x113a, MPSService = 0x113b, PnPInformation = 0x1200, GenericNetworking = 0x1201, GenericFileTransfer = 0x1202, GenericAudio = 0x1203, GenericTelephony = 0x1204, VideoSource = 0x1303, VideoSink = 0x1304, VideoDistribution = 0x1305, HDP = 0x1400, HDPSource = 0x1401, HDPSink = 0x1402, GenericAccess = 0x1800, GenericAttribute = 0x1801, ImmediateAlert = 0x1802, LinkLoss = 0x1803, TxPower = 0x1804, CurrentTimeService = 0x1805, ReferenceTimeUpdateService = 0x1806, NextDSTChangeService = 0x1807, Glucose = 0x1808, HealthThermometer = 0x1809, DeviceInformation = 0x180a, HeartRate = 0x180d, PhoneAlertStatusService = 0x180e, BatteryService = 0x180f, BloodPressure = 0x1810, AlertNotificationService = 0x1811, HumanInterfaceDevice = 0x1812, ScanParameters = 0x1813, RunningSpeedAndCadence = 0x1814, CyclingSpeedAndCadence = 0x1816, CyclingPower = 0x1818, LocationAndNavigation = 0x1819, EnvironmentalSensing = 0x181a, BodyComposition = 0x181b, UserData = 0x181c, WeightScale = 0x181d, BondManagement = 0x181e, ContinuousGlucoseMonitoring = 0x181f }; enum class CharacteristicType { DeviceName = 0x2a00, Appearance = 0x2a01, PeripheralPrivacyFlag = 0x2a02, ReconnectionAddress = 0x2a03, PeripheralPreferredConnectionParameters = 0x2a04, ServiceChanged = 0x2a05, AlertLevel = 0x2a06, TxPowerLevel = 0x2a07, DateTime = 0x2a08, DayOfWeek = 0x2a09, DayDateTime = 0x2a0a, /* 0x2a0b not defined */ ExactTime256 = 0x2a0c, DSTOffset = 0x2a0d, TimeZone = 0x2a0e, LocalTimeInformation = 0x2a0f, /* 0x2a10 not defined */ TimeWithDST = 0x2a11, TimeAccuracy = 0x2a12, TimeSource = 0x2a13, ReferenceTimeInformation = 0x2a14, /* 0x2a15 not defined */ TimeUpdateControlPoint = 0x2a16, TimeUpdateState = 0x2a17, GlucoseMeasurement = 0x2a18, BatteryLevel = 0x2a19, /* 0x2a1a not defined */ /* 0x2a1b not defined */ TemperatureMeasurement = 0x2a1c, TemperatureType = 0x2a1d, IntermediateTemperature = 0x2a1e, /* 0x2a1f not defined */ /* 0x2a20 not defined */ MeasurementInterval = 0x2a21, BootKeyboardInputReport = 0x2a22, SystemID = 0x2a23, ModelNumberString = 0x2a24, SerialNumberString = 0x2a25, FirmwareRevisionString = 0x2a26, HardwareRevisionString = 0x2a27, SoftwareRevisionString = 0x2a28, ManufacturerNameString = 0x2a29, IEEE1107320601RegulatoryCertificationDataList = 0x2a2a, CurrentTime = 0x2a2b, MagneticDeclination = 0x2a2c, /* 0x2a2d not defined */ /* 0x2a2e not defined */ /* 0x2a2f not defined */ /* 0x2a30 not defined */ ScanRefresh = 0x2a31, BootKeyboardOutputReport = 0x2a32, BootMouseInputReport = 0x2a33, GlucoseMeasurementContext = 0x2a34, BloodPressureMeasurement = 0x2a35, IntermediateCuffPressure = 0x2a36, HeartRateMeasurement = 0x2a37, BodySensorLocation = 0x2a38, HeartRateControlPoint = 0x2a39, /* 0x2a3a not defined */ /* 0x2a3b not defined */ /* 0x2a3c not defined */ /* 0x2a3d not defined */ /* 0x2a3e not defined */ AlertStatus = 0x2a3f, RingerControlPoint = 0x2a40, RingerSetting = 0x2a41, AlertCategoryIDBitMask = 0x2a42, AlertCategoryID = 0x2a43, AlertNotificationControlPoint = 0x2a44, UnreadAlertStatus = 0x2a45, NewAlert = 0x2a46, SupportedNewAlertCategory = 0x2a47, SupportedUnreadAlertCategory = 0x2a48, BloodPressureFeature = 0x2a49, HIDInformation = 0x2a4a, ReportMap = 0x2a4b, HIDControlPoint = 0x2a4c, Report = 0x2a4d, ProtocolMode = 0x2a4e, ScanIntervalWindow = 0x2a4f, PnPID = 0x2a50, GlucoseFeature = 0x2a51, RecordAccessControlPoint = 0x2a52, RSCMeasurement = 0x2a53, RSCFeature = 0x2a54, SCControlPoint = 0x2a55, /* 0x2a56 not defined */ /* 0x2a57 not defined */ /* 0x2a58 not defined */ /* 0x2a59 not defined */ /* 0x2a5a not defined */ CSCMeasurement = 0x2a5b, CSCFeature = 0x2a5c, SensorLocation = 0x2a5d, /* 0x2a5e not defined */ /* 0x2a5f not defined */ /* 0x2a60 not defined */ /* 0x2a61 not defined */ /* 0x2a62 not defined */ CyclingPowerMeasurement = 0x2a63, CyclingPowerVector = 0x2a64, CyclingPowerFeature = 0x2a65, CyclingPowerControlPoint = 0x2a66, LocationAndSpeed = 0x2a67, Navigation = 0x2a68, PositionQuality = 0x2a69, LNFeature = 0x2a6a, LNControlPoint = 0x2a6b, Elevation = 0x2a6c, Pressure = 0x2a6d, Temperature = 0x2a6e, Humidity = 0x2a6f, TrueWindSpeed = 0x2a70, TrueWindDirection = 0x2a71, ApparentWindSpeed = 0x2a72, ApparentWindDirection = 0x2a73, GustFactor = 0x2a74, PollenConcentration = 0x2a75, UVIndex = 0x2a76, Irradiance = 0x2a77, Rainfall = 0x2a78, WindChill = 0x2a79, HeatIndex = 0x2a7a, DewPoint = 0x2a7b, /* 0x2a7c not defined */ DescriptorValueChanged = 0x2a7d, AerobicHeartRateLowerLimit = 0x2a7e, AerobicThreshold = 0x2a7f, Age = 0x2a80, AnaerobicHeartRateLowerLimit = 0x2a81, AnaerobicHeartRateUpperLimit = 0x2a82, AnaerobicThreshold = 0x2a83, AerobicHeartRateUpperLimit = 0x2a84, DateOfBirth = 0x2a85, DateOfThresholdAssessment = 0x2a86, EmailAddress = 0x2a87, FatBurnHeartRateLowerLimit = 0x2a88, FatBurnHeartRateUpperLimit = 0x2a89, FirstName = 0x2a8a, FiveZoneHeartRateLimits = 0x2a8b, Gender = 0x2a8c, HeartRateMax = 0x2a8d, Height = 0x2a8e, HipCircumference = 0x2a8f, LastName = 0x2a90, MaximumRecommendedHeartRate = 0x2a91, RestingHeartRate = 0x2a92, SportTypeForAerobicAnaerobicThresholds = 0x2a93, ThreeZoneHeartRateLimits = 0x2a94, TwoZoneHeartRateLimits = 0x2a95, VO2Max = 0x2a96, WaistCircumference = 0x2a97, Weight = 0x2a98, DatabaseChangeIncrement = 0x2a99, UserIndex = 0x2a9a, BodyCompositionFeature = 0x2a9b, BodyCompositionMeasurement = 0x2a9c, WeightMeasurement = 0x2a9d, WeightScaleFeature = 0x2a9e, UserControlPoint = 0x2a9f, MagneticFluxDensity2D = 0x2aa0, MagneticFluxDensity3D = 0x2aa1, Language = 0x2aa2, BarometricPressureTrend = 0x2aa3 }; enum class DescriptorType { UnknownDescriptorType = 0x0, CharacteristicExtendedProperties = 0x2900, CharacteristicUserDescription = 0x2901, ClientCharacteristicConfiguration = 0x2902, ServerCharacteristicConfiguration = 0x2903, CharacteristicPresentationFormat = 0x2904, CharacteristicAggregateFormat = 0x2905, ValidRange = 0x2906, ExternalReportReference = 0x2907, ReportReference = 0x2908, /* 0x2909 not defined */ /* 0x290a not defined */ EnvironmentalSensingConfiguration = 0x290b, EnvironmentalSensingMeasurement = 0x290c, EnvironmentalSensingTriggerSetting = 0x290d }; constexpr QBluetoothUuid() noexcept {}; // values below are based on Bluetooth BASE_UUID constexpr QBluetoothUuid(ProtocolUuid uuid) noexcept : QBluetoothUuid(static_cast(uuid)) {}; constexpr QBluetoothUuid(ServiceClassUuid uuid) noexcept : QBluetoothUuid(static_cast(uuid)) {}; constexpr QBluetoothUuid(CharacteristicType uuid) noexcept : QBluetoothUuid(static_cast(uuid)) {}; constexpr QBluetoothUuid(DescriptorType uuid) noexcept : QBluetoothUuid(static_cast(uuid)) {}; explicit constexpr QBluetoothUuid(quint16 uuid) noexcept : QBluetoothUuid(quint32{uuid}) {}; explicit constexpr QBluetoothUuid(quint32 uuid) noexcept : QUuid(uuid, 0x0, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb) {}; // end of bluetooth-specific constructors; rest is essentially `using QUuid::QUuid;` using QUuid::QUuid; #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) explicit QBluetoothUuid(quint128 uuid); #endif QT6_ONLY(QT_POST_CXX17_API_IN_EXPORTED_CLASS) // quint128 changes based on QT_SUPPORTS_INT128! explicit QBluetoothUuid(quint128 uuid, QSysInfo::Endian order = QSysInfo::BigEndian) noexcept : QUuid{fromBytes(&uuid, order)} {} #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) // actually 6.3 (cf. QUuid) explicit QBluetoothUuid(const QString &uuid); #endif QBluetoothUuid(const QBluetoothUuid &uuid) = default; QT_BLUETOOTH_INLINE_SINCE(6, 6) QBluetoothUuid(QUuid QT6_ONLY(const &)uuid); ~QBluetoothUuid() = default; QBluetoothUuid &operator=(const QBluetoothUuid &other) = default; friend bool operator==(const QBluetoothUuid &a, const QBluetoothUuid &b) { return static_cast(a) == static_cast(b); } friend bool operator!=(const QBluetoothUuid &a, const QBluetoothUuid &b) { return !(a == b); } #ifndef QT_NO_DEBUG_STREAM friend Q_BLUETOOTH_EXPORT QDebug operator<<(QDebug debug, const QBluetoothUuid &uuid); #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) static QDebug streamingOperator(QDebug debug, const QBluetoothUuid &uuid); #endif #endif int minimumSize() const; quint16 toUInt16(bool *ok = nullptr) const; quint32 toUInt32(bool *ok = nullptr) const; #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) quint128 toUInt128() const; #endif #if defined(Q_QDOC) || !defined(QT_SUPPORTS_INT128) // otherwise falls back to QUuid::toUint128() quint128 toUInt128(QSysInfo::Endian order = QSysInfo::BigEndian) const noexcept; #endif #if defined(Q_OS_DARWIN) || defined(Q_QDOC) static QBluetoothUuid fromCBUUID(CBUUID *cbUuid); CBUUID *toCBUUID() const Q_DECL_NS_RETURNS_AUTORELEASED; #endif static QString serviceClassToString(ServiceClassUuid uuid); static QString protocolToString(ProtocolUuid uuid); static QString characteristicToString(CharacteristicType uuid); static QString descriptorToString(DescriptorType uuid); }; #if QT_BLUETOOTH_INLINE_IMPL_SINCE(6, 6) QBluetoothUuid::QBluetoothUuid(QUuid QT6_ONLY(const &)uuid) : QUuid(uuid) { } #endif #ifndef QT_NO_DATASTREAM inline QDataStream &operator<<(QDataStream &s, const QBluetoothUuid &uuid) { return s << static_cast(uuid); } inline QDataStream &operator>>(QDataStream &s, QBluetoothUuid &uuid) { return s >> static_cast(uuid); } #endif QT_END_NAMESPACE QT_DECL_METATYPE_EXTERN(QBluetoothUuid, Q_BLUETOOTH_EXPORT) #endif