1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_MAC_H_ 6 #define DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_MAC_H_ 7 8 #include <IOKit/IOReturn.h> 9 10 #include <string> 11 #include <vector> 12 13 #include "base/containers/hash_tables.h" 14 #include "base/memory/ref_counted.h" 15 #include "base/memory/weak_ptr.h" 16 #include "base/observer_list.h" 17 #include "device/bluetooth/bluetooth_adapter.h" 18 19 #ifdef __OBJC__ 20 @class BluetoothAdapterMacDelegate; 21 @class IOBluetoothDevice; 22 @class IOBluetoothDeviceInquiry; 23 @class NSArray; 24 @class NSDate; 25 #else 26 class BluetoothAdapterMacDelegate; 27 class IOBluetoothDevice; 28 class IOBluetoothDeviceInquiry; 29 class NSArray; 30 class NSDate; 31 #endif 32 33 namespace base { 34 35 class SequencedTaskRunner; 36 37 } // namespace base 38 39 namespace device { 40 41 class BluetoothAdapterMacTest; 42 43 class BluetoothAdapterMac : public BluetoothAdapter { 44 public: 45 // BluetoothAdapter override 46 virtual void AddObserver(BluetoothAdapter::Observer* observer) OVERRIDE; 47 virtual void RemoveObserver(BluetoothAdapter::Observer* observer) OVERRIDE; 48 virtual std::string GetAddress() const OVERRIDE; 49 virtual std::string GetName() const OVERRIDE; 50 virtual bool IsInitialized() const OVERRIDE; 51 virtual bool IsPresent() const OVERRIDE; 52 virtual bool IsPowered() const OVERRIDE; 53 virtual void SetPowered( 54 bool powered, 55 const base::Closure& callback, 56 const ErrorCallback& error_callback) OVERRIDE; 57 virtual bool IsDiscovering() const OVERRIDE; 58 59 virtual void StartDiscovering( 60 const base::Closure& callback, 61 const ErrorCallback& error_callback) OVERRIDE; 62 virtual void StopDiscovering( 63 const base::Closure& callback, 64 const ErrorCallback& error_callback) OVERRIDE; 65 virtual void ReadLocalOutOfBandPairingData( 66 const BluetoothOutOfBandPairingDataCallback& callback, 67 const ErrorCallback& error_callback) OVERRIDE; 68 69 // called by BluetoothAdapterMacDelegate. 70 void DeviceInquiryStarted(IOBluetoothDeviceInquiry* inquiry); 71 void DeviceFound(IOBluetoothDeviceInquiry* inquiry, 72 IOBluetoothDevice* device); 73 void DeviceInquiryComplete(IOBluetoothDeviceInquiry* inquiry, 74 IOReturn error, 75 bool aborted); 76 77 private: 78 friend class BluetoothAdapterFactory; 79 friend class BluetoothAdapterMacTest; 80 81 enum DiscoveryStatus { 82 NOT_DISCOVERING, 83 DISCOVERY_STARTING, 84 DISCOVERING, 85 DISCOVERY_STOPPING 86 }; 87 88 BluetoothAdapterMac(); 89 virtual ~BluetoothAdapterMac(); 90 91 void Init(); 92 void InitForTest(scoped_refptr<base::SequencedTaskRunner> ui_task_runner); 93 void PollAdapter(); 94 95 // Updates |devices_| to be consistent with |devices|. 96 void UpdateDevices(NSArray* devices); 97 98 void MaybeStartDeviceInquiry(); 99 void MaybeStopDeviceInquiry(); 100 101 typedef std::vector<std::pair<base::Closure, ErrorCallback> > 102 DiscoveryCallbackList; 103 void RunCallbacks(const DiscoveryCallbackList& callback_list, 104 bool success) const; 105 106 std::string address_; 107 std::string name_; 108 bool powered_; 109 DiscoveryStatus discovery_status_; 110 111 DiscoveryCallbackList on_start_discovery_callbacks_; 112 DiscoveryCallbackList on_stop_discovery_callbacks_; 113 size_t num_discovery_listeners_; 114 115 BluetoothAdapterMacDelegate* adapter_delegate_; 116 IOBluetoothDeviceInquiry* device_inquiry_; 117 118 // A list of discovered device addresses. 119 // This list is used to check if the same device is discovered twice during 120 // the discovery between consecutive inquiries. 121 base::hash_set<std::string> discovered_devices_; 122 123 // Timestamp for the recently accessed device. 124 // Used to determine if |devices_| needs an update. 125 NSDate* recently_accessed_device_timestamp_; 126 127 scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; 128 129 // List of observers interested in event notifications from us. 130 ObserverList<BluetoothAdapter::Observer> observers_; 131 132 base::WeakPtrFactory<BluetoothAdapterMac> weak_ptr_factory_; 133 134 DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterMac); 135 }; 136 137 } // namespace device 138 139 #endif // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_MAC_H_ 140