diff options
author | Juha Vuolle <juha.vuolle@insta.fi> | 2022-02-04 18:11:47 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-02-08 13:53:20 +0000 |
commit | a9786aaba43dc4978a2bbdaf4e5e8be4ea9f85cb (patch) | |
tree | 87143980296c7d21d590592f0811972710696a8f | |
parent | 981bf3664c82444c71f787619f235247ae4e30f7 (diff) |
Improve macOS classic bluetooth (server) SDP record creation
This commit fixes four SDP record issues
1. The nested sequences were created too "shallow", missing one layer
of depth
2. The attribute keys are expected to be in hex format but were
given as decimals
3. The matching with variant.canConvert<QString> results in too
broad acceptance, and for example ushort was interpreted as a
string
4. With fix for "3" above in place, the UINT16 attributes were put in
as UINT32 because of how macOS by default interprets the NSNumbers
as part of SDP dictionary
Without these fixes Windows client does not find the service, and
Linux client misses some of the details.
Fixes: QTBUG-100445
Change-Id: I4f063e49bd8832d0e97bdf69acbd1ee7dacf0f87
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
(cherry picked from commit 119ef898806d8f67f13877a655b7e2c6b6eb168b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/bluetooth/darwin/btservicerecord.mm | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/src/bluetooth/darwin/btservicerecord.mm b/src/bluetooth/darwin/btservicerecord.mm index 3f4b92d4..3bd6979f 100644 --- a/src/bluetooth/darwin/btservicerecord.mm +++ b/src/bluetooth/darwin/btservicerecord.mm @@ -147,7 +147,7 @@ void add_attribute(const QVariant &var, AttributeId key, Dictionary dict) return; const Number num(variant_to_nsnumber<ValueType>(var)); - [dict setObject:num forKey:[NSString stringWithFormat:@"%d", int(key)]]; + [dict setObject:num forKey:[NSString stringWithFormat:@"%x", int(key)]]; } template<> @@ -161,7 +161,7 @@ void add_attribute<QString>(const QVariant &var, AttributeId key, Dictionary dic const QString string(var.value<QString>()); if (string.length()) { if (NSString *const nsString = string.toNSString()) - [dict setObject:nsString forKey:[NSString stringWithFormat:@"%d", int(key)]]; + [dict setObject:nsString forKey:[NSString stringWithFormat:@"%x", int(key)]]; } } @@ -174,7 +174,7 @@ void add_attribute<QBluetoothUuid>(const QVariant &var, AttributeId key, Diction return; SDPUUid ioUUID(iobluetooth_uuid(var.value<QBluetoothUuid>())); - [dict setObject:ioUUID forKey:[NSString stringWithFormat:@"%d", int(key)]]; + [dict setObject:ioUUID forKey:[NSString stringWithFormat:@"%x", int(key)]]; } template<> @@ -208,6 +208,25 @@ void add_attribute(const QVariant &var, NSMutableArray *list) } template<> +void add_attribute<unsigned short>(const QVariant &var, NSMutableArray *list) +{ + Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); + + if (!var.canConvert<unsigned short>()) + return; + + const Number num(variant_to_nsnumber<unsigned short>(var)); + + NSDictionary* dict = @{ + @"DataElementType" : [NSNumber numberWithInt:1], + @"DataElementSize" : [NSNumber numberWithInt:2], + @"DataElementValue" : num + }; + + [list addObject: dict]; +} + +template<> void add_attribute<QString>(const QVariant &var, NSMutableArray *list) { Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); @@ -274,7 +293,7 @@ void add_rfcomm_protocol_descriptor_list(uint16 channelID, Dictionary dict) [rfcommList addObject:rfcommDict]; [descriptorList addObject:rfcommList]; - [dict setObject:descriptorList forKey:[NSString stringWithFormat:@"%d", + [dict setObject:descriptorList forKey:[NSString stringWithFormat:@"%x", kBluetoothSDPAttributeIdentifierProtocolDescriptorList]]; } @@ -300,7 +319,7 @@ void add_l2cap_protocol_descriptor_list(uint16 psm, Dictionary dict) [l2capList addObject:l2capDict]; [descriptorList addObject:l2capList]; - [dict setObject:descriptorList forKey:[NSString stringWithFormat:@"%d", + [dict setObject:descriptorList forKey:[NSString stringWithFormat:@"%x", kBluetoothSDPAttributeIdentifierProtocolDescriptorList]]; } @@ -311,10 +330,10 @@ bool add_attribute(const QVariant &var, AttributeId key, NSMutableArray *list) if (var.canConvert<Sequence>()) return false; - if (var.canConvert<QString>()) { + if (var.typeId() == QMetaType::QString) { //ServiceName, ServiceDescription, ServiceProvider. add_attribute<QString>(var, list); - } else if (var.canConvert<QBluetoothUuid>()) { + } else if (var.userType() == qMetaTypeId<QBluetoothUuid>()) { add_attribute<QBluetoothUuid>(var, list); } else { // Here we need 'key' to understand the type. @@ -326,6 +345,9 @@ bool add_attribute(const QVariant &var, AttributeId key, NSMutableArray *list) case QSInfo::ServiceInfoTimeToLive: add_attribute<unsigned>(var, list); break; + case QSInfo::BluetoothProfileDescriptorList: + add_attribute<unsigned short>(var, list); + break; case QSInfo::ServiceAvailability: add_attribute<unsigned char>(var, list); break; @@ -349,10 +371,10 @@ bool add_attribute(const QBluetoothServiceInfo &serviceInfo, AttributeId key, Di if (var.canConvert<Sequence>()) return false; - if (var.canConvert<QString>()) { + if (var.typeId() == QMetaType::QString) { //ServiceName, ServiceDescription, ServiceProvider. add_attribute<QString>(var, key, dict); - } else if (var.canConvert<QBluetoothUuid>()) { + } else if (var.userType() == qMetaTypeId<QBluetoothUuid>()) { add_attribute<QBluetoothUuid>(serviceInfo.attribute(key), key, dict); } else { // We can have different integer types actually, so I have to check @@ -386,14 +408,15 @@ bool add_sequence_attribute(const QVariant &var, AttributeId key, NSMutableArray if (var.isNull() || !var.canConvert<Sequence>()) return false; + NSMutableArray *const nested = [NSMutableArray array]; + [list addObject:nested]; + const Sequence sequence(var.value<Sequence>()); for (const QVariant &var : sequence) { if (var.canConvert<Sequence>()) { - NSMutableArray *const nested = [NSMutableArray array]; add_sequence_attribute(var, key, nested); - [list addObject:nested]; } else { - add_attribute(var, key, list); + add_attribute(var, key, nested); } } @@ -416,8 +439,7 @@ bool add_sequence_attribute(const QBluetoothServiceInfo &serviceInfo, AttributeI if (!add_sequence_attribute(element, key, list)) add_attribute(element, key, list); } - [dict setObject:list forKey:[NSString stringWithFormat:@"%d", int(key)]]; - + [dict setObject:list forKey:[NSString stringWithFormat:@"%x", int(key)]]; return true; } |