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