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 | |
51 | QT_BEGIN_NAMESPACE |
52 | |
53 | struct quint128 |
54 | { |
55 | quint8 data[16]; |
56 | }; |
57 | |
58 | class Q_BLUETOOTH_EXPORT QBluetoothUuid : public QUuid |
59 | { |
60 | public: |
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 |
400 | inline QDataStream &operator<<(QDataStream &s, const QBluetoothUuid &uuid) |
401 | { |
402 | return s << static_cast<const QUuid &>(uuid); |
403 | } |
404 | |
405 | inline 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 |
413 | inline QDebug operator<<(QDebug debug, const QBluetoothUuid &uuid) |
414 | { |
415 | debug << uuid.toString(); |
416 | return debug; |
417 | } |
418 | #endif |
419 | |
420 | QT_END_NAMESPACE |
421 | |
422 | Q_DECLARE_METATYPE(QBluetoothUuid) |
423 | |
424 | #endif |
425 | |