| 1 | // Copyright (C) 2016 The Qt Company Ltd. | 
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only | 
| 3 |  | 
| 4 | #ifndef QBLUETOOTHUUID_H | 
| 5 | #define QBLUETOOTHUUID_H | 
| 6 |  | 
| 7 | #include <QtBluetooth/qtbluetoothglobal.h> | 
| 8 |  | 
| 9 | #include <QtCore/QtGlobal> | 
| 10 | #include <QtCore/QMetaType> | 
| 11 | #include <QtCore/QUuid> | 
| 12 |  | 
| 13 | #include <QtCore/QDebug> | 
| 14 |  | 
| 15 | #if defined(Q_OS_DARWIN) || defined(Q_QDOC) | 
| 16 | Q_FORWARD_DECLARE_OBJC_CLASS(CBUUID); | 
| 17 | #endif | 
| 18 |  | 
| 19 | QT_BEGIN_NAMESPACE | 
| 20 |  | 
| 21 | #if !defined(QT_SUPPORTS_INT128) | 
| 22 | struct quint128 | 
| 23 | { | 
| 24 |     quint8 data[16]; | 
| 25 | }; | 
| 26 | #endif | 
| 27 |  | 
| 28 | class Q_BLUETOOTH_EXPORT QBluetoothUuid : public QUuid | 
| 29 | { | 
| 30 | public: | 
| 31 |     enum class ProtocolUuid { | 
| 32 |         Sdp = 0x0001, | 
| 33 |         Udp = 0x0002, | 
| 34 |         Rfcomm = 0x0003, | 
| 35 |         Tcp = 0x0004, | 
| 36 |         TcsBin = 0x0005, | 
| 37 |         TcsAt = 0x0006, | 
| 38 |         Att = 0x0007, | 
| 39 |         Obex = 0x0008, | 
| 40 |         Ip = 0x0009, | 
| 41 |         Ftp = 0x000A, | 
| 42 |         Http = 0x000C, | 
| 43 |         Wsp = 0x000E, | 
| 44 |         Bnep = 0x000F, | 
| 45 |         Upnp = 0x0010, | 
| 46 |         Hidp = 0x0011, | 
| 47 |         HardcopyControlChannel = 0x0012, | 
| 48 |         HardcopyDataChannel = 0x0014, | 
| 49 |         HardcopyNotification = 0x0016, | 
| 50 |         Avctp = 0x0017, | 
| 51 |         Avdtp = 0x0019, | 
| 52 |         Cmtp = 0x001B, | 
| 53 |         UdiCPlain = 0x001D, | 
| 54 |         McapControlChannel = 0x001E, | 
| 55 |         McapDataChannel = 0x001F, | 
| 56 |         L2cap = 0x0100 | 
| 57 |     }; | 
| 58 |  | 
| 59 |     enum class ServiceClassUuid { | 
| 60 |         ServiceDiscoveryServer = 0x1000, | 
| 61 |         BrowseGroupDescriptor = 0x1001, | 
| 62 |         PublicBrowseGroup = 0x1002, | 
| 63 |         SerialPort = 0x1101, | 
| 64 |         LANAccessUsingPPP = 0x1102, | 
| 65 |         DialupNetworking = 0x1103, | 
| 66 |         IrMCSync = 0x1104, | 
| 67 |         ObexObjectPush = 0x1105, | 
| 68 |         OBEXFileTransfer = 0x1106, | 
| 69 |         IrMCSyncCommand = 0x1107, | 
| 70 |         Headset = 0x1108, | 
| 71 |         AudioSource = 0x110a, | 
| 72 |         AudioSink = 0x110b, | 
| 73 |         AV_RemoteControlTarget = 0x110c, | 
| 74 |         AdvancedAudioDistribution = 0x110d, | 
| 75 |         AV_RemoteControl = 0x110e, | 
| 76 |         AV_RemoteControlController = 0x110f, | 
| 77 |         HeadsetAG = 0x1112, | 
| 78 |         PANU = 0x1115, | 
| 79 |         NAP = 0x1116, | 
| 80 |         GN = 0x1117, | 
| 81 |         DirectPrinting = 0x1118, | 
| 82 |         ReferencePrinting = 0x1119, | 
| 83 |         BasicImage = 0x111a, | 
| 84 |         ImagingResponder = 0x111b, | 
| 85 |         ImagingAutomaticArchive = 0x111c, | 
| 86 |         ImagingReferenceObjects = 0x111d, | 
| 87 |         Handsfree = 0x111e, | 
| 88 |         HandsfreeAudioGateway = 0x111f, | 
| 89 |         DirectPrintingReferenceObjectsService = 0x1120, | 
| 90 |         ReflectedUI = 0x1121, | 
| 91 |         BasicPrinting = 0x1122, | 
| 92 |         PrintingStatus = 0x1123, | 
| 93 |         HumanInterfaceDeviceService = 0x1124, | 
| 94 |         HardcopyCableReplacement = 0x1125, | 
| 95 |         HCRPrint = 0x1126, | 
| 96 |         HCRScan = 0x1127, | 
| 97 |         SIMAccess = 0x112d, | 
| 98 |         PhonebookAccessPCE = 0x112e, | 
| 99 |         PhonebookAccessPSE = 0x112f, | 
| 100 |         PhonebookAccess = 0x1130, | 
| 101 |         HeadsetHS = 0x1131, | 
| 102 |         MessageAccessServer = 0x1132, | 
| 103 |         MessageNotificationServer = 0x1133, | 
| 104 |         MessageAccessProfile = 0x1134, | 
| 105 |         GNSS = 0x1135, | 
| 106 |         GNSSServer = 0x1136, | 
| 107 |         Display3D = 0x1137, | 
| 108 |         Glasses3D = 0x1138, | 
| 109 |         Synchronization3D = 0x1139, | 
| 110 |         MPSProfile = 0x113a, | 
| 111 |         MPSService = 0x113b, | 
| 112 |         PnPInformation = 0x1200, | 
| 113 |         GenericNetworking = 0x1201, | 
| 114 |         GenericFileTransfer = 0x1202, | 
| 115 |         GenericAudio = 0x1203, | 
| 116 |         GenericTelephony = 0x1204, | 
| 117 |         VideoSource = 0x1303, | 
| 118 |         VideoSink = 0x1304, | 
| 119 |         VideoDistribution = 0x1305, | 
| 120 |         HDP = 0x1400, | 
| 121 |         HDPSource = 0x1401, | 
| 122 |         HDPSink = 0x1402, | 
| 123 |         GenericAccess = 0x1800, | 
| 124 |         GenericAttribute = 0x1801, | 
| 125 |         ImmediateAlert = 0x1802, | 
| 126 |         LinkLoss = 0x1803, | 
| 127 |         TxPower = 0x1804, | 
| 128 |         CurrentTimeService = 0x1805, | 
| 129 |         ReferenceTimeUpdateService = 0x1806, | 
| 130 |         NextDSTChangeService = 0x1807, | 
| 131 |         Glucose = 0x1808, | 
| 132 |         HealthThermometer = 0x1809, | 
| 133 |         DeviceInformation = 0x180a, | 
| 134 |         HeartRate = 0x180d, | 
| 135 |         PhoneAlertStatusService = 0x180e, | 
| 136 |         BatteryService = 0x180f, | 
| 137 |         BloodPressure = 0x1810, | 
| 138 |         AlertNotificationService = 0x1811, | 
| 139 |         HumanInterfaceDevice = 0x1812, | 
| 140 |         ScanParameters = 0x1813, | 
| 141 |         RunningSpeedAndCadence = 0x1814, | 
| 142 |         CyclingSpeedAndCadence = 0x1816, | 
| 143 |         CyclingPower = 0x1818, | 
| 144 |         LocationAndNavigation = 0x1819, | 
| 145 |         EnvironmentalSensing = 0x181a, | 
| 146 |         BodyComposition = 0x181b, | 
| 147 |         UserData = 0x181c, | 
| 148 |         WeightScale = 0x181d, | 
| 149 |         BondManagement = 0x181e, | 
| 150 |         ContinuousGlucoseMonitoring = 0x181f | 
| 151 |     }; | 
| 152 |  | 
| 153 |     enum class CharacteristicType { | 
| 154 |         DeviceName = 0x2a00, | 
| 155 |         Appearance = 0x2a01, | 
| 156 |         PeripheralPrivacyFlag = 0x2a02, | 
| 157 |         ReconnectionAddress = 0x2a03, | 
| 158 |         PeripheralPreferredConnectionParameters = 0x2a04, | 
| 159 |         ServiceChanged = 0x2a05, | 
| 160 |         AlertLevel = 0x2a06, | 
| 161 |         TxPowerLevel = 0x2a07, | 
| 162 |         DateTime = 0x2a08, | 
| 163 |         DayOfWeek = 0x2a09, | 
| 164 |         DayDateTime = 0x2a0a, | 
| 165 |         /* 0x2a0b not defined */ | 
| 166 |         ExactTime256 = 0x2a0c, | 
| 167 |         DSTOffset = 0x2a0d, | 
| 168 |         TimeZone = 0x2a0e, | 
| 169 |         LocalTimeInformation = 0x2a0f, | 
| 170 |         /* 0x2a10 not defined */ | 
| 171 |         TimeWithDST = 0x2a11, | 
| 172 |         TimeAccuracy = 0x2a12, | 
| 173 |         TimeSource = 0x2a13, | 
| 174 |         ReferenceTimeInformation = 0x2a14, | 
| 175 |         /* 0x2a15 not defined */ | 
| 176 |         TimeUpdateControlPoint = 0x2a16, | 
| 177 |         TimeUpdateState = 0x2a17, | 
| 178 |         GlucoseMeasurement = 0x2a18, | 
| 179 |         BatteryLevel = 0x2a19, | 
| 180 |         /* 0x2a1a not defined */ | 
| 181 |         /* 0x2a1b not defined */ | 
| 182 |         TemperatureMeasurement = 0x2a1c, | 
| 183 |         TemperatureType = 0x2a1d, | 
| 184 |         IntermediateTemperature = 0x2a1e, | 
| 185 |         /* 0x2a1f not defined */ | 
| 186 |         /* 0x2a20 not defined */ | 
| 187 |         MeasurementInterval = 0x2a21, | 
| 188 |         BootKeyboardInputReport = 0x2a22, | 
| 189 |         SystemID = 0x2a23, | 
| 190 |         ModelNumberString = 0x2a24, | 
| 191 |         SerialNumberString = 0x2a25, | 
| 192 |         FirmwareRevisionString = 0x2a26, | 
| 193 |         HardwareRevisionString = 0x2a27, | 
| 194 |         SoftwareRevisionString = 0x2a28, | 
| 195 |         ManufacturerNameString = 0x2a29, | 
| 196 |         IEEE1107320601RegulatoryCertificationDataList = 0x2a2a, | 
| 197 |         CurrentTime = 0x2a2b, | 
| 198 |         MagneticDeclination = 0x2a2c, | 
| 199 |         /* 0x2a2d not defined */ | 
| 200 |         /* 0x2a2e not defined */ | 
| 201 |         /* 0x2a2f not defined */ | 
| 202 |         /* 0x2a30 not defined */ | 
| 203 |         ScanRefresh = 0x2a31, | 
| 204 |         BootKeyboardOutputReport = 0x2a32, | 
| 205 |         BootMouseInputReport = 0x2a33, | 
| 206 |         GlucoseMeasurementContext = 0x2a34, | 
| 207 |         BloodPressureMeasurement = 0x2a35, | 
| 208 |         IntermediateCuffPressure = 0x2a36, | 
| 209 |         HeartRateMeasurement = 0x2a37, | 
| 210 |         BodySensorLocation = 0x2a38, | 
| 211 |         HeartRateControlPoint = 0x2a39, | 
| 212 |         /* 0x2a3a not defined */ | 
| 213 |         /* 0x2a3b not defined */ | 
| 214 |         /* 0x2a3c not defined */ | 
| 215 |         /* 0x2a3d not defined */ | 
| 216 |         /* 0x2a3e not defined */ | 
| 217 |         AlertStatus = 0x2a3f, | 
| 218 |         RingerControlPoint = 0x2a40, | 
| 219 |         RingerSetting = 0x2a41, | 
| 220 |         AlertCategoryIDBitMask = 0x2a42, | 
| 221 |         AlertCategoryID = 0x2a43, | 
| 222 |         AlertNotificationControlPoint = 0x2a44, | 
| 223 |         UnreadAlertStatus = 0x2a45, | 
| 224 |         NewAlert = 0x2a46, | 
| 225 |         SupportedNewAlertCategory = 0x2a47, | 
| 226 |         SupportedUnreadAlertCategory = 0x2a48, | 
| 227 |         BloodPressureFeature = 0x2a49, | 
| 228 |         HIDInformation = 0x2a4a, | 
| 229 |         ReportMap = 0x2a4b, | 
| 230 |         HIDControlPoint = 0x2a4c, | 
| 231 |         Report = 0x2a4d, | 
| 232 |         ProtocolMode = 0x2a4e, | 
| 233 |         ScanIntervalWindow = 0x2a4f, | 
| 234 |         PnPID = 0x2a50, | 
| 235 |         GlucoseFeature = 0x2a51, | 
| 236 |         RecordAccessControlPoint = 0x2a52, | 
| 237 |         RSCMeasurement = 0x2a53, | 
| 238 |         RSCFeature = 0x2a54, | 
| 239 |         SCControlPoint = 0x2a55, | 
| 240 |         /* 0x2a56 not defined */ | 
| 241 |         /* 0x2a57 not defined */ | 
| 242 |         /* 0x2a58 not defined */ | 
| 243 |         /* 0x2a59 not defined */ | 
| 244 |         /* 0x2a5a not defined */ | 
| 245 |         CSCMeasurement = 0x2a5b, | 
| 246 |         CSCFeature = 0x2a5c, | 
| 247 |         SensorLocation = 0x2a5d, | 
| 248 |         /* 0x2a5e not defined */ | 
| 249 |         /* 0x2a5f not defined */ | 
| 250 |         /* 0x2a60 not defined */ | 
| 251 |         /* 0x2a61 not defined */ | 
| 252 |         /* 0x2a62 not defined */ | 
| 253 |         CyclingPowerMeasurement = 0x2a63, | 
| 254 |         CyclingPowerVector = 0x2a64, | 
| 255 |         CyclingPowerFeature = 0x2a65, | 
| 256 |         CyclingPowerControlPoint = 0x2a66, | 
| 257 |         LocationAndSpeed = 0x2a67, | 
| 258 |         Navigation = 0x2a68, | 
| 259 |         PositionQuality = 0x2a69, | 
| 260 |         LNFeature = 0x2a6a, | 
| 261 |         LNControlPoint = 0x2a6b, | 
| 262 |         Elevation = 0x2a6c, | 
| 263 |         Pressure = 0x2a6d, | 
| 264 |         Temperature = 0x2a6e, | 
| 265 |         Humidity = 0x2a6f, | 
| 266 |         TrueWindSpeed = 0x2a70, | 
| 267 |         TrueWindDirection = 0x2a71, | 
| 268 |         ApparentWindSpeed = 0x2a72, | 
| 269 |         ApparentWindDirection = 0x2a73, | 
| 270 |         GustFactor = 0x2a74, | 
| 271 |         PollenConcentration = 0x2a75, | 
| 272 |         UVIndex = 0x2a76, | 
| 273 |         Irradiance = 0x2a77, | 
| 274 |         Rainfall = 0x2a78, | 
| 275 |         WindChill = 0x2a79, | 
| 276 |         HeatIndex = 0x2a7a, | 
| 277 |         DewPoint = 0x2a7b, | 
| 278 |         /* 0x2a7c not defined */ | 
| 279 |         DescriptorValueChanged = 0x2a7d, | 
| 280 |         AerobicHeartRateLowerLimit = 0x2a7e, | 
| 281 |         AerobicThreshold = 0x2a7f, | 
| 282 |         Age = 0x2a80, | 
| 283 |         AnaerobicHeartRateLowerLimit = 0x2a81, | 
| 284 |         AnaerobicHeartRateUpperLimit = 0x2a82, | 
| 285 |         AnaerobicThreshold = 0x2a83, | 
| 286 |         AerobicHeartRateUpperLimit = 0x2a84, | 
| 287 |         DateOfBirth = 0x2a85, | 
| 288 |         DateOfThresholdAssessment = 0x2a86, | 
| 289 |         EmailAddress = 0x2a87, | 
| 290 |         FatBurnHeartRateLowerLimit = 0x2a88, | 
| 291 |         FatBurnHeartRateUpperLimit = 0x2a89, | 
| 292 |         FirstName = 0x2a8a, | 
| 293 |         FiveZoneHeartRateLimits = 0x2a8b, | 
| 294 |         Gender = 0x2a8c, | 
| 295 |         HeartRateMax = 0x2a8d, | 
| 296 |         Height = 0x2a8e, | 
| 297 |         HipCircumference = 0x2a8f, | 
| 298 |         LastName = 0x2a90, | 
| 299 |         MaximumRecommendedHeartRate = 0x2a91, | 
| 300 |         RestingHeartRate = 0x2a92, | 
| 301 |         SportTypeForAerobicAnaerobicThresholds = 0x2a93, | 
| 302 |         ThreeZoneHeartRateLimits = 0x2a94, | 
| 303 |         TwoZoneHeartRateLimits = 0x2a95, | 
| 304 |         VO2Max = 0x2a96, | 
| 305 |         WaistCircumference = 0x2a97, | 
| 306 |         Weight = 0x2a98, | 
| 307 |         DatabaseChangeIncrement = 0x2a99, | 
| 308 |         UserIndex = 0x2a9a, | 
| 309 |         BodyCompositionFeature = 0x2a9b, | 
| 310 |         BodyCompositionMeasurement = 0x2a9c, | 
| 311 |         WeightMeasurement = 0x2a9d, | 
| 312 |         WeightScaleFeature = 0x2a9e, | 
| 313 |         UserControlPoint = 0x2a9f, | 
| 314 |         MagneticFluxDensity2D = 0x2aa0, | 
| 315 |         MagneticFluxDensity3D = 0x2aa1, | 
| 316 |         Language = 0x2aa2, | 
| 317 |         BarometricPressureTrend = 0x2aa3 | 
| 318 |     }; | 
| 319 |  | 
| 320 |     enum class DescriptorType { | 
| 321 |         UnknownDescriptorType = 0x0, | 
| 322 |         CharacteristicExtendedProperties = 0x2900, | 
| 323 |         CharacteristicUserDescription = 0x2901, | 
| 324 |         ClientCharacteristicConfiguration = 0x2902, | 
| 325 |         ServerCharacteristicConfiguration = 0x2903, | 
| 326 |         CharacteristicPresentationFormat = 0x2904, | 
| 327 |         CharacteristicAggregateFormat = 0x2905, | 
| 328 |         ValidRange = 0x2906, | 
| 329 |         ExternalReportReference = 0x2907, | 
| 330 |         ReportReference = 0x2908, | 
| 331 |         /* 0x2909 not defined */ | 
| 332 |         /* 0x290a not defined */ | 
| 333 |         EnvironmentalSensingConfiguration = 0x290b, | 
| 334 |         EnvironmentalSensingMeasurement = 0x290c, | 
| 335 |         EnvironmentalSensingTriggerSetting = 0x290d | 
| 336 |     }; | 
| 337 |  | 
| 338 |     constexpr QBluetoothUuid() noexcept {}; | 
| 339 |  | 
| 340 |     // values below are based on Bluetooth BASE_UUID | 
| 341 |     constexpr QBluetoothUuid(ProtocolUuid uuid) noexcept | 
| 342 |         : QBluetoothUuid(static_cast<quint32>(uuid)) {}; | 
| 343 |     constexpr QBluetoothUuid(ServiceClassUuid uuid) noexcept | 
| 344 |         : QBluetoothUuid(static_cast<quint32>(uuid)) {}; | 
| 345 |     constexpr QBluetoothUuid(CharacteristicType uuid) noexcept | 
| 346 |         : QBluetoothUuid(static_cast<quint32>(uuid)) {}; | 
| 347 |     constexpr QBluetoothUuid(DescriptorType uuid) noexcept | 
| 348 |         : QBluetoothUuid(static_cast<quint32>(uuid)) {}; | 
| 349 |     explicit constexpr QBluetoothUuid(quint16 uuid) noexcept | 
| 350 |         : QBluetoothUuid(quint32{uuid}) {}; | 
| 351 |     explicit constexpr QBluetoothUuid(quint32 uuid) noexcept | 
| 352 |         : QUuid(uuid, 0x0, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb) {}; | 
| 353 |     // end of bluetooth-specific constructors; rest is essentially `using QUuid::QUuid;` | 
| 354 |  | 
| 355 |     using QUuid::QUuid; | 
| 356 | #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) | 
| 357 |     explicit QBluetoothUuid(quint128 uuid); | 
| 358 | #endif | 
| 359 |     QT6_ONLY(QT_POST_CXX17_API_IN_EXPORTED_CLASS) // quint128 changes based on QT_SUPPORTS_INT128! | 
| 360 |     explicit QBluetoothUuid(quint128 uuid, QSysInfo::Endian order = QSysInfo::BigEndian) noexcept | 
| 361 |         : QUuid{fromBytes(bytes: &uuid, order)} {} | 
| 362 | #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) // actually 6.3 (cf. QUuid) | 
| 363 |     explicit QBluetoothUuid(const QString &uuid); | 
| 364 | #endif | 
| 365 |     QBluetoothUuid(const QBluetoothUuid &uuid) = default; | 
| 366 |     QT_BLUETOOTH_INLINE_SINCE(6, 6) | 
| 367 |     QBluetoothUuid(QUuid QT6_ONLY(const &)uuid); | 
| 368 |     ~QBluetoothUuid() = default; | 
| 369 |  | 
| 370 |     QBluetoothUuid &operator=(const QBluetoothUuid &other) = default; | 
| 371 |     friend bool operator==(const QBluetoothUuid &a, const QBluetoothUuid &b) | 
| 372 |     { | 
| 373 |         return static_cast<QUuid>(a) == static_cast<QUuid>(b); | 
| 374 |     } | 
| 375 |     friend bool operator!=(const QBluetoothUuid &a, const QBluetoothUuid &b) { return !(a == b); } | 
| 376 | #ifndef QT_NO_DEBUG_STREAM | 
| 377 |     friend Q_BLUETOOTH_EXPORT QDebug operator<<(QDebug debug, const QBluetoothUuid &uuid); | 
| 378 | #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) | 
| 379 |     static QDebug streamingOperator(QDebug debug, const QBluetoothUuid &uuid); | 
| 380 | #endif | 
| 381 | #endif | 
| 382 |  | 
| 383 |     int minimumSize() const; | 
| 384 |  | 
| 385 |     quint16 toUInt16(bool *ok = nullptr) const; | 
| 386 |     quint32 toUInt32(bool *ok = nullptr) const; | 
| 387 |  | 
| 388 | #if QT_BLUETOOTH_REMOVED_SINCE(6, 6) | 
| 389 |     quint128 toUInt128() const; | 
| 390 | #endif | 
| 391 | #if defined(Q_QDOC) || !defined(QT_SUPPORTS_INT128) // otherwise falls back to QUuid::toUint128() | 
| 392 |     quint128 toUInt128(QSysInfo::Endian order = QSysInfo::BigEndian) const noexcept; | 
| 393 | #endif | 
| 394 |  | 
| 395 | #if defined(Q_OS_DARWIN) || defined(Q_QDOC) | 
| 396 |     static QBluetoothUuid fromCBUUID(CBUUID *cbUuid); | 
| 397 |     CBUUID *toCBUUID() const Q_DECL_NS_RETURNS_AUTORELEASED; | 
| 398 | #endif | 
| 399 |  | 
| 400 |     static QString serviceClassToString(ServiceClassUuid uuid); | 
| 401 |     static QString protocolToString(ProtocolUuid uuid); | 
| 402 |     static QString characteristicToString(CharacteristicType uuid); | 
| 403 |     static QString descriptorToString(DescriptorType uuid); | 
| 404 | }; | 
| 405 |  | 
| 406 | #if QT_BLUETOOTH_INLINE_IMPL_SINCE(6, 6) | 
| 407 | QBluetoothUuid::QBluetoothUuid(QUuid QT6_ONLY(const &)uuid) | 
| 408 |     : QUuid(uuid) | 
| 409 | { | 
| 410 | } | 
| 411 | #endif | 
| 412 |  | 
| 413 |  | 
| 414 | #ifndef QT_NO_DATASTREAM | 
| 415 | inline QDataStream &operator<<(QDataStream &s, const QBluetoothUuid &uuid) | 
| 416 | { | 
| 417 |     return s << static_cast<const QUuid &>(uuid); | 
| 418 | } | 
| 419 |  | 
| 420 | inline QDataStream &operator>>(QDataStream &s, QBluetoothUuid &uuid) | 
| 421 | { | 
| 422 |     return s >> static_cast<QUuid &>(uuid); | 
| 423 | } | 
| 424 | #endif | 
| 425 |  | 
| 426 | QT_END_NAMESPACE | 
| 427 |  | 
| 428 | QT_DECL_METATYPE_EXTERN(QBluetoothUuid, Q_BLUETOOTH_EXPORT) | 
| 429 |  | 
| 430 | #endif | 
| 431 |  |