107 Q_ASSERT_X(dict, Q_FUNC_INFO,
"invalid dictionary (nil)");
109 if (!var.canConvert<ValueType>())
112 const Number num(variant_to_nsnumber<ValueType>(var));
113 [dict setObject:num forKey:[NSString stringWithFormat:@
"%x",
int(key)]];
119 Q_ASSERT_X(dict, Q_FUNC_INFO,
"invalid dictionary (nil)");
121 if (!var.canConvert<QString>())
124 const QString string(var.value<QString>());
125 if (!string.isEmpty()) {
126 if (NSString *
const nsString = string.toNSString())
127 [dict setObject:nsString forKey:[NSString stringWithFormat:@
"%x",
int(key)]];
164 Q_ASSERT_X(list, Q_FUNC_INFO,
"invalid list (nil)");
166 if (!var.canConvert<ValueType>())
169 const Number num(variant_to_nsnumber<ValueType>(var));
170 [list addObject:num];
174void add_attribute<
unsigned short>(
const QVariant &var, NSMutableArray *list)
176 Q_ASSERT_X(list, Q_FUNC_INFO,
"invalid list (nil)");
178 if (!var.canConvert<
unsigned short>())
181 const Number num(variant_to_nsnumber<
unsigned short>(var));
183 NSDictionary* dict = @{
184 @
"DataElementType" : [NSNumber numberWithInt:1],
185 @
"DataElementSize" : [NSNumber numberWithInt:2],
186 @
"DataElementValue" : num
189 [list addObject: dict];
234 Q_ASSERT_X(dict, Q_FUNC_INFO,
"invalid dictionary (nil)");
241 NSMutableArray *
const descriptorList = [NSMutableArray array];
243 IOBluetoothSDPUUID *
const l2capUUID = [IOBluetoothSDPUUID uuid16:kBluetoothSDPUUID16L2CAP];
244 NSArray *
const l2capList = [NSArray arrayWithObject:l2capUUID];
246 [descriptorList addObject:l2capList];
248 IOBluetoothSDPUUID *
const rfcommUUID = [IOBluetoothSDPUUID uuid16:kBluetoothSDPUUID16RFCOMM];
249 NSMutableDictionary *
const rfcommDict = [NSMutableDictionary dictionary];
250 [rfcommDict setObject:[NSNumber numberWithInt:1] forKey:@
"DataElementType"];
251 [rfcommDict setObject:[NSNumber numberWithInt:1] forKey:@
"DataElementSize"];
252 [rfcommDict setObject:[NSNumber numberWithInt:channelID] forKey:@
"DataElementValue"];
254 NSMutableArray *
const rfcommList = [NSMutableArray array];
255 [rfcommList addObject:rfcommUUID];
256 [rfcommList addObject:rfcommDict];
258 [descriptorList addObject:rfcommList];
259 [dict setObject:descriptorList forKey:[NSString stringWithFormat:@
"%x",
260 kBluetoothSDPAttributeIdentifierProtocolDescriptorList]];
265 Q_ASSERT_X(dict, Q_FUNC_INFO,
"invalid dictionary (nil)");
272 NSMutableArray *
const descriptorList = [NSMutableArray array];
273 NSMutableArray *
const l2capList = [NSMutableArray array];
275 IOBluetoothSDPUUID *
const l2capUUID = [IOBluetoothSDPUUID uuid16:kBluetoothSDPUUID16L2CAP];
276 [l2capList addObject:l2capUUID];
278 NSMutableDictionary *
const l2capDict = [NSMutableDictionary dictionary];
279 [l2capDict setObject:[NSNumber numberWithInt:1] forKey:@
"DataElementType"];
280 [l2capDict setObject:[NSNumber numberWithInt:2] forKey:@
"DataElementSize"];
281 [l2capDict setObject:[NSNumber numberWithInt:psm] forKey:@
"DataElementValue"];
282 [l2capList addObject:l2capDict];
284 [descriptorList addObject:l2capList];
285 [dict setObject:descriptorList forKey:[NSString stringWithFormat:@
"%x",
286 kBluetoothSDPAttributeIdentifierProtocolDescriptorList]];
289bool add_attribute(
const QVariant &var, AttributeId key, NSMutableArray *list)
291 Q_ASSERT_X(list, Q_FUNC_INFO,
"invalid list (nil)");
293 if (var.canConvert<Sequence>())
296 if (var.typeId() == QMetaType::QString) {
298 add_attribute<QString>(var, list);
299 }
else if (var.userType() == qMetaTypeId<QBluetoothUuid>()) {
300 add_attribute<QBluetoothUuid>(var, list);
306 case QSInfo::ServiceRecordHandle:
307 case QSInfo::ServiceRecordState:
308 case QSInfo::ServiceInfoTimeToLive:
309 add_attribute<
unsigned>(var, list);
311 case QSInfo::BluetoothProfileDescriptorList:
312 add_attribute<
unsigned short>(var, list);
314 case QSInfo::ServiceAvailability:
315 add_attribute<
unsigned char>(var, list);
317 case QSInfo::IconUrl:
318 case QSInfo::DocumentationUrl:
319 case QSInfo::ClientExecutableUrl:
320 add_attribute<QUrl>(var, list);
329bool add_attribute(
const QBluetoothServiceInfo &serviceInfo, AttributeId key, Dictionary dict)
331 Q_ASSERT_X(dict, Q_FUNC_INFO,
"invalid dict (nil)");
333 const QVariant var(serviceInfo.attribute(key));
334 if (var.canConvert<Sequence>())
337 if (var.typeId() == QMetaType::QString) {
339 add_attribute<QString>(var, key, dict);
340 }
else if (var.userType() == qMetaTypeId<QBluetoothUuid>()) {
341 add_attribute<QBluetoothUuid>(serviceInfo.attribute(key), key, dict);
346 case QSInfo::ServiceRecordHandle:
347 case QSInfo::ServiceRecordState:
348 case QSInfo::ServiceInfoTimeToLive:
349 add_attribute<
unsigned>(serviceInfo.attribute(key), key, dict);
351 case QSInfo::ServiceAvailability:
352 add_attribute<
unsigned char>(serviceInfo.attribute(key), key, dict);
354 case QSInfo::IconUrl:
355 case QSInfo::DocumentationUrl:
356 case QSInfo::ClientExecutableUrl:
357 add_attribute<QUrl>(serviceInfo.attribute(key), key, dict);
369 Q_ASSERT_X(list, Q_FUNC_INFO,
"invalid list (nil)");
371 if (var.isNull() || !var.canConvert<Sequence>())
374 NSMutableArray *
const nested = [NSMutableArray array];
375 [list addObject:nested];
377 const Sequence sequence(var.value<Sequence>());
378 for (
const QVariant &var : sequence) {
379 if (var.canConvert<Sequence>()) {
380 add_sequence_attribute(var, key, nested);
382 add_attribute(var, key, nested);
391 Q_ASSERT_X(dict, Q_FUNC_INFO,
"invalid dictionary (nil)");
393 const QVariant &var(serviceInfo.attribute(key));
394 if (var.isNull() || !var.canConvert<Sequence>())
399 NSMutableArray *
const list = [NSMutableArray array];
400 const Sequence sequence(var.value<Sequence>());
401 for (
const QVariant &element : sequence) {
402 if (!add_sequence_attribute(element, key, list))
403 add_attribute(element, key, list);
405 [dict setObject:list forKey:[NSString stringWithFormat:@
"%x",
int(key)]];
413 if (serviceInfo.socketProtocol() == QBluetoothServiceInfo::UnknownProtocol)
416 const QList<quint16> attributeIds(serviceInfo.attributes());
417 if (!attributeIds.size())
420 dict.reset([[NSMutableDictionary alloc] init], RetainPolicy::noInitialRetain);
422 for (quint16 key : attributeIds) {
423 if (key == QSInfo::ProtocolDescriptorList)
427 if (!add_sequence_attribute(serviceInfo, AttributeId(key), dict))
428 add_attribute(serviceInfo, AttributeId(key), dict);
431 if (serviceInfo.socketProtocol() == QBluetoothServiceInfo::L2capProtocol) {
432 add_l2cap_protocol_descriptor_list(serviceInfo.protocolServiceMultiplexer(),
435 add_rfcomm_protocol_descriptor_list(serviceInfo.serverChannel(), dict);