#include <vector>
#include "base/containers/hash_tables.h"
+#include "base/mac/scoped_nsobject.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "device/bluetooth/bluetooth_adapter.h"
+#include "device/bluetooth/bluetooth_discovery_manager_mac.h"
-#ifdef __OBJC__
-@class BluetoothAdapterMacDelegate;
@class IOBluetoothDevice;
-@class IOBluetoothDeviceInquiry;
@class NSArray;
@class NSDate;
-#else
-class BluetoothAdapterMacDelegate;
-class IOBluetoothDevice;
-class IOBluetoothDeviceInquiry;
-class NSArray;
-class NSDate;
-#endif
namespace base {
class BluetoothAdapterMacTest;
-class BluetoothAdapterMac : public BluetoothAdapter {
+class BluetoothAdapterMac : public BluetoothAdapter,
+ public BluetoothDiscoveryManagerMac::Observer {
public:
- // BluetoothAdapter override
- virtual void AddObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
- virtual void RemoveObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
- virtual std::string GetAddress() const OVERRIDE;
- virtual std::string GetName() const OVERRIDE;
- virtual void SetName(const std::string& name,
+ static base::WeakPtr<BluetoothAdapter> CreateAdapter();
+
+ // BluetoothAdapter:
+ void AddObserver(BluetoothAdapter::Observer* observer) override;
+ void RemoveObserver(BluetoothAdapter::Observer* observer) override;
+ std::string GetAddress() const override;
+ std::string GetName() const override;
+ void SetName(const std::string& name,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) override;
+ bool IsInitialized() const override;
+ bool IsPresent() const override;
+ bool IsPowered() const override;
+ void SetPowered(bool powered,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) override;
+ bool IsDiscoverable() const override;
+ void SetDiscoverable(bool discoverable,
const base::Closure& callback,
- const ErrorCallback& error_callback) OVERRIDE;
- virtual bool IsInitialized() const OVERRIDE;
- virtual bool IsPresent() const OVERRIDE;
- virtual bool IsPowered() const OVERRIDE;
- virtual void SetPowered(
- bool powered,
- const base::Closure& callback,
- const ErrorCallback& error_callback) OVERRIDE;
- virtual bool IsDiscoverable() const OVERRIDE;
- virtual void SetDiscoverable(
- bool discoverable,
- const base::Closure& callback,
- const ErrorCallback& error_callback) OVERRIDE;
- virtual bool IsDiscovering() const OVERRIDE;
-
- virtual void StartDiscovering(
- const base::Closure& callback,
- const ErrorCallback& error_callback) OVERRIDE;
- virtual void StopDiscovering(
- const base::Closure& callback,
- const ErrorCallback& error_callback) OVERRIDE;
- virtual void ReadLocalOutOfBandPairingData(
- const BluetoothOutOfBandPairingDataCallback& callback,
- const ErrorCallback& error_callback) OVERRIDE;
-
- // called by BluetoothAdapterMacDelegate.
- void DeviceInquiryStarted(IOBluetoothDeviceInquiry* inquiry);
- void DeviceFound(IOBluetoothDeviceInquiry* inquiry,
- IOBluetoothDevice* device);
- void DeviceInquiryComplete(IOBluetoothDeviceInquiry* inquiry,
- IOReturn error,
- bool aborted);
+ const ErrorCallback& error_callback) override;
+ bool IsDiscovering() const override;
+ void CreateRfcommService(
+ const BluetoothUUID& uuid,
+ const ServiceOptions& options,
+ const CreateServiceCallback& callback,
+ const CreateServiceErrorCallback& error_callback) override;
+ void CreateL2capService(
+ const BluetoothUUID& uuid,
+ const ServiceOptions& options,
+ const CreateServiceCallback& callback,
+ const CreateServiceErrorCallback& error_callback) override;
+
+ // BluetoothDiscoveryManagerMac::Observer overrides
+ void DeviceFound(IOBluetoothDevice* device) override;
+ void DiscoveryStopped(bool unexpected) override;
+
+ // Registers that a new |device| has connected to the local host.
+ void DeviceConnected(IOBluetoothDevice* device);
+
+ protected:
+ // BluetoothAdapter:
+ void RemovePairingDelegateInternal(
+ device::BluetoothDevice::PairingDelegate* pairing_delegate) override;
private:
- friend class BluetoothAdapterFactory;
friend class BluetoothAdapterMacTest;
- enum DiscoveryStatus {
- NOT_DISCOVERING,
- DISCOVERY_STARTING,
- DISCOVERING,
- DISCOVERY_STOPPING
- };
-
BluetoothAdapterMac();
- virtual ~BluetoothAdapterMac();
+ ~BluetoothAdapterMac() override;
+
+ // BluetoothAdapter:
+ void AddDiscoverySession(const base::Closure& callback,
+ const ErrorCallback& error_callback) override;
+ void RemoveDiscoverySession(const base::Closure& callback,
+ const ErrorCallback& error_callback) override;
void Init();
void InitForTest(scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
void PollAdapter();
- // Updates |devices_| to be consistent with |devices|.
- void UpdateDevices(NSArray* devices);
-
- void MaybeStartDeviceInquiry();
- void MaybeStopDeviceInquiry();
+ // Registers that a new |device| has replied to an Inquiry, is paired, or has
+ // connected to the local host.
+ void DeviceAdded(IOBluetoothDevice* device);
- typedef std::vector<std::pair<base::Closure, ErrorCallback> >
- DiscoveryCallbackList;
- void RunCallbacks(const DiscoveryCallbackList& callback_list,
- bool success) const;
+ // Updates |devices_| to include the currently paired devices, as well as any
+ // connected, but unpaired, devices. Notifies observers if any previously
+ // paired or connected devices are no longer present.
+ void UpdateDevices();
std::string address_;
std::string name_;
bool powered_;
- DiscoveryStatus discovery_status_;
-
- DiscoveryCallbackList on_start_discovery_callbacks_;
- DiscoveryCallbackList on_stop_discovery_callbacks_;
- size_t num_discovery_listeners_;
-
- BluetoothAdapterMacDelegate* adapter_delegate_;
- IOBluetoothDeviceInquiry* device_inquiry_;
- // A list of discovered device addresses.
- // This list is used to check if the same device is discovered twice during
- // the discovery between consecutive inquiries.
- base::hash_set<std::string> discovered_devices_;
+ int num_discovery_sessions_;
- // Timestamp for the recently accessed device.
- // Used to determine if |devices_| needs an update.
- NSDate* recently_accessed_device_timestamp_;
+ // Discovery manager for Bluetooth Classic.
+ scoped_ptr<BluetoothDiscoveryManagerMac> classic_discovery_manager_;
scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;