// 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_device_mac.h" #include #import #import #import #include #include "base/basictypes.h" #include "base/hash.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "device/bluetooth/bluetooth_out_of_band_pairing_data.h" #include "device/bluetooth/bluetooth_profile_mac.h" #include "device/bluetooth/bluetooth_service_record_mac.h" #include "device/bluetooth/bluetooth_socket_mac.h" // Replicate specific 10.7 SDK declarations for building with prior SDKs. #if !defined(MAC_OS_X_VERSION_10_7) || \ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 @interface IOBluetoothDevice (LionSDKDeclarations) - (NSString*)addressString; - (NSString*)name; - (unsigned int)classOfDevice; - (NSArray*)services; @end #endif // MAC_OS_X_VERSION_10_7 namespace { // Converts |uuid| to a IOBluetoothSDPUUID instance. // // |uuid| must be in the format of XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. IOBluetoothSDPUUID* GetIOBluetoothSDPUUID(const std::string& uuid) { DCHECK(uuid.size() == 36); DCHECK(uuid[8] == '-'); DCHECK(uuid[13] == '-'); DCHECK(uuid[18] == '-'); DCHECK(uuid[23] == '-'); std::string numbers_only = uuid; numbers_only.erase(23, 1); numbers_only.erase(18, 1); numbers_only.erase(13, 1); numbers_only.erase(8, 1); std::vector uuid_bytes_vector; base::HexStringToBytes(numbers_only, &uuid_bytes_vector); DCHECK(uuid_bytes_vector.size() == 16); return [IOBluetoothSDPUUID uuidWithBytes:&uuid_bytes_vector[0] length:uuid_bytes_vector.size()]; } } // namespace namespace device { BluetoothDeviceMac::BluetoothDeviceMac(IOBluetoothDevice* device) : BluetoothDevice(), device_([device retain]) { } BluetoothDeviceMac::~BluetoothDeviceMac() { [device_ release]; } uint32 BluetoothDeviceMac::GetBluetoothClass() const { return [device_ classOfDevice]; } std::string BluetoothDeviceMac::GetDeviceName() const { return base::SysNSStringToUTF8([device_ name]); } std::string BluetoothDeviceMac::GetAddress() const { return base::SysNSStringToUTF8([device_ addressString]); } uint16 BluetoothDeviceMac::GetVendorID() const { return 0; } uint16 BluetoothDeviceMac::GetProductID() const { return 0; } uint16 BluetoothDeviceMac::GetDeviceID() const { return 0; } bool BluetoothDeviceMac::IsPaired() const { return [device_ isPaired]; } bool BluetoothDeviceMac::IsConnected() const { return [device_ isConnected]; } bool BluetoothDeviceMac::IsConnectable() const { return false; } bool BluetoothDeviceMac::IsConnecting() const { return false; } // TODO(youngki): BluetoothServiceRecord is deprecated; implement this method // without using BluetoothServiceRecord. BluetoothDevice::ServiceList BluetoothDeviceMac::GetServices() const { ServiceList service_uuids; for (IOBluetoothSDPServiceRecord* service in [device_ services]) { BluetoothServiceRecordMac service_record(service); service_uuids.push_back(service_record.uuid()); } return service_uuids; } // NOTE(youngki): This method is deprecated; it will be removed soon. void BluetoothDeviceMac::GetServiceRecords( const ServiceRecordsCallback& callback, const ErrorCallback& error_callback) { ServiceRecordList service_record_list; for (IOBluetoothSDPServiceRecord* service in [device_ services]) { BluetoothServiceRecord* service_record = new BluetoothServiceRecordMac(service); service_record_list.push_back(service_record); } callback.Run(service_record_list); } // NOTE(youngki): This method is deprecated; it will be removed soon. void BluetoothDeviceMac::ProvidesServiceWithName( const std::string& name, const ProvidesServiceCallback& callback) { NOTIMPLEMENTED(); callback.Run(false); } bool BluetoothDeviceMac::ExpectingPinCode() const { NOTIMPLEMENTED(); return false; } bool BluetoothDeviceMac::ExpectingPasskey() const { NOTIMPLEMENTED(); return false; } bool BluetoothDeviceMac::ExpectingConfirmation() const { NOTIMPLEMENTED(); return false; } void BluetoothDeviceMac::Connect( PairingDelegate* pairing_delegate, const base::Closure& callback, const ConnectErrorCallback& error_callback) { NOTIMPLEMENTED(); } void BluetoothDeviceMac::SetPinCode(const std::string& pincode) { NOTIMPLEMENTED(); } void BluetoothDeviceMac::SetPasskey(uint32 passkey) { NOTIMPLEMENTED(); } void BluetoothDeviceMac::ConfirmPairing() { NOTIMPLEMENTED(); } void BluetoothDeviceMac::RejectPairing() { NOTIMPLEMENTED(); } void BluetoothDeviceMac::CancelPairing() { NOTIMPLEMENTED(); } void BluetoothDeviceMac::Disconnect( const base::Closure& callback, const ErrorCallback& error_callback) { NOTIMPLEMENTED(); } void BluetoothDeviceMac::Forget(const ErrorCallback& error_callback) { NOTIMPLEMENTED(); } void BluetoothDeviceMac::ConnectToService( const std::string& service_uuid, const SocketCallback& callback) { IOBluetoothSDPServiceRecord* record = [device_ getServiceRecordForUUID:GetIOBluetoothSDPUUID(service_uuid)]; if (record != nil) { BluetoothServiceRecordMac service_record(record); scoped_refptr socket( BluetoothSocketMac::CreateBluetoothSocket(service_record)); if (socket.get() != NULL) callback.Run(socket); } } void BluetoothDeviceMac::ConnectToProfile( device::BluetoothProfile* profile, const base::Closure& callback, const ErrorCallback& error_callback) { if (static_cast(profile)->Connect(device_)) callback.Run(); else error_callback.Run(); } void BluetoothDeviceMac::SetOutOfBandPairingData( const BluetoothOutOfBandPairingData& data, const base::Closure& callback, const ErrorCallback& error_callback) { NOTIMPLEMENTED(); } void BluetoothDeviceMac::ClearOutOfBandPairingData( const base::Closure& callback, const ErrorCallback& error_callback) { NOTIMPLEMENTED(); } } // namespace device