blob: ee61b9749dfb807fb7c2acf31b061ab4692f0178 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/bluetooth/bluetooth_service_record_mac.h"
#include <IOBluetooth/Bluetooth.h>
#import <IOBluetooth/IOBluetoothUtilities.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>
#import <IOBluetooth/objc/IOBluetoothSDPDataElement.h>
#import <IOBluetooth/objc/IOBluetoothSDPServiceRecord.h>
#import <IOBluetooth/objc/IOBluetoothSDPUUID.h>
#include <string>
#include "base/basictypes.h"
#include "base/strings/stringprintf.h"
#include "base/strings/sys_string_conversions.h"
namespace {
void ExtractUuid(IOBluetoothSDPDataElement* service_class_data,
std::string* uuid) {
NSArray* inner_elements = [service_class_data getArrayValue];
IOBluetoothSDPUUID* sdp_uuid = nil;
for (IOBluetoothSDPDataElement* inner_element in inner_elements) {
if ([inner_element getTypeDescriptor] == kBluetoothSDPDataElementTypeUUID) {
sdp_uuid = [[inner_element getUUIDValue] getUUIDWithLength:16];
break;
}
}
if (sdp_uuid != nil) {
const uint8* uuid_bytes = reinterpret_cast<const uint8*>([sdp_uuid bytes]);
*uuid = base::StringPrintf(
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
uuid_bytes[0], uuid_bytes[1], uuid_bytes[2], uuid_bytes[3],
uuid_bytes[4], uuid_bytes[5], uuid_bytes[6], uuid_bytes[7],
uuid_bytes[8], uuid_bytes[9], uuid_bytes[10], uuid_bytes[11],
uuid_bytes[12], uuid_bytes[13], uuid_bytes[14], uuid_bytes[15]);
}
}
} // namespace
namespace device {
BluetoothServiceRecordMac::BluetoothServiceRecordMac(
IOBluetoothSDPServiceRecord* record)
: BluetoothServiceRecord() {
name_ = base::SysNSStringToUTF8([record getServiceName]);
device_ = [[record device] retain];
address_ = base::SysNSStringToUTF8(IOBluetoothNSStringFromDeviceAddress(
[device_ getAddress]));
// TODO(youngki): Extract these values from |record|.
supports_hid_ = false;
hid_reconnect_initiate_ = false;
hid_normally_connectable_ = false;
supports_rfcomm_ =
[record getRFCOMMChannelID:&rfcomm_channel_] == kIOReturnSuccess;
const BluetoothSDPServiceAttributeID service_class_id = 1;
IOBluetoothSDPDataElement* service_class_data =
[record getAttributeDataElement:service_class_id];
if ([service_class_data getTypeDescriptor] ==
kBluetoothSDPDataElementTypeDataElementSequence) {
std::string uuid_str;
ExtractUuid(service_class_data, &uuid_str);
uuid_ = BluetoothUUID(uuid_str);
}
}
BluetoothServiceRecordMac::~BluetoothServiceRecordMac() {
[device_ release];
}
} // namespace device