19b6ec9471cebdbd68639492825956b96f807e382Ben Gruver// Copyright 2013 The Chromium Authors. All rights reserved.
29b6ec9471cebdbd68639492825956b96f807e382Ben Gruver// Use of this source code is governed by a BSD-style license that can be
39b6ec9471cebdbd68639492825956b96f807e382Ben Gruver// found in the LICENSE file.
49b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
59b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#ifndef DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_MAC_H_
69b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#define DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_MAC_H_
79b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
89b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include <IOKit/IOReturn.h>
99b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
109b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include <string>
119b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include <vector>
129b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
139b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include "base/containers/hash_tables.h"
149b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include "base/mac/scoped_nsobject.h"
159b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include "base/memory/ref_counted.h"
169b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include "base/memory/weak_ptr.h"
179b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include "base/observer_list.h"
189b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include "device/bluetooth/bluetooth_adapter.h"
199b6ec9471cebdbd68639492825956b96f807e382Ben Gruver#include "device/bluetooth/bluetooth_discovery_manager_mac.h"
209b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
219b6ec9471cebdbd68639492825956b96f807e382Ben Gruver@class IOBluetoothDevice;
22f3d921d1f8eb52f20440a0e43f604a7aae972e94Ben Gruver@class NSArray;
239b6ec9471cebdbd68639492825956b96f807e382Ben Gruver@class NSDate;
249b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
259b6ec9471cebdbd68639492825956b96f807e382Ben Gruvernamespace base {
269b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
279b6ec9471cebdbd68639492825956b96f807e382Ben Gruverclass SequencedTaskRunner;
289b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
299b6ec9471cebdbd68639492825956b96f807e382Ben Gruver}  // namespace base
309b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
319b6ec9471cebdbd68639492825956b96f807e382Ben Gruvernamespace device {
329b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
339b6ec9471cebdbd68639492825956b96f807e382Ben Gruverclass BluetoothAdapterMacTest;
349b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
359b6ec9471cebdbd68639492825956b96f807e382Ben Gruverclass BluetoothAdapterMac : public BluetoothAdapter,
369b6ec9471cebdbd68639492825956b96f807e382Ben Gruver                            public BluetoothDiscoveryManagerMac::Observer {
379b6ec9471cebdbd68639492825956b96f807e382Ben Gruver public:
389b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  static base::WeakPtr<BluetoothAdapter> CreateAdapter();
399b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
409b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  // BluetoothAdapter:
419b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual void AddObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
429b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual void RemoveObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
439b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual std::string GetAddress() const OVERRIDE;
449b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual std::string GetName() const OVERRIDE;
455fd395796e215a80c722815bf180728948868f18Ben Gruver  virtual void SetName(const std::string& name,
469b6ec9471cebdbd68639492825956b96f807e382Ben Gruver                       const base::Closure& callback,
47f3d921d1f8eb52f20440a0e43f604a7aae972e94Ben Gruver                       const ErrorCallback& error_callback) OVERRIDE;
481d4637b3d94732a4eaa83b129054ee9245bed24eBen Gruver  virtual bool IsInitialized() const OVERRIDE;
491d4637b3d94732a4eaa83b129054ee9245bed24eBen Gruver  virtual bool IsPresent() const OVERRIDE;
501d4637b3d94732a4eaa83b129054ee9245bed24eBen Gruver  virtual bool IsPowered() const OVERRIDE;
511d4637b3d94732a4eaa83b129054ee9245bed24eBen Gruver  virtual void SetPowered(
529b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      bool powered,
539b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const base::Closure& callback,
549b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const ErrorCallback& error_callback) OVERRIDE;
559b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual bool IsDiscoverable() const OVERRIDE;
569b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual void SetDiscoverable(
579b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      bool discoverable,
589b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const base::Closure& callback,
599b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const ErrorCallback& error_callback) OVERRIDE;
609b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual bool IsDiscovering() const OVERRIDE;
619b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual void CreateRfcommService(
629b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const BluetoothUUID& uuid,
639b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const ServiceOptions& options,
649b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const CreateServiceCallback& callback,
659b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const CreateServiceErrorCallback& error_callback) OVERRIDE;
669b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual void CreateL2capService(
679b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const BluetoothUUID& uuid,
689b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const ServiceOptions& options,
699b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const CreateServiceCallback& callback,
709b6ec9471cebdbd68639492825956b96f807e382Ben Gruver      const CreateServiceErrorCallback& error_callback) OVERRIDE;
719b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
729b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  // BluetoothDiscoveryManagerMac::Observer overrides
739b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual void DeviceFound(IOBluetoothDevice* device) OVERRIDE;
749b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  virtual void DiscoveryStopped(bool unexpected) OVERRIDE;
75f3d921d1f8eb52f20440a0e43f604a7aae972e94Ben Gruver
769b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  // Registers that a new |device| has connected to the local host.
779b6ec9471cebdbd68639492825956b96f807e382Ben Gruver  void DeviceConnected(IOBluetoothDevice* device);
789b6ec9471cebdbd68639492825956b96f807e382Ben Gruver
799b6ec9471cebdbd68639492825956b96f807e382Ben Gruver protected:
80  // BluetoothAdapter:
81  virtual void RemovePairingDelegateInternal(
82      device::BluetoothDevice::PairingDelegate* pairing_delegate) OVERRIDE;
83
84 private:
85  friend class BluetoothAdapterMacTest;
86
87  BluetoothAdapterMac();
88  virtual ~BluetoothAdapterMac();
89
90  // BluetoothAdapter:
91  virtual void AddDiscoverySession(
92      const base::Closure& callback,
93      const ErrorCallback& error_callback) OVERRIDE;
94  virtual void RemoveDiscoverySession(
95      const base::Closure& callback,
96      const ErrorCallback& error_callback) OVERRIDE;
97
98  void Init();
99  void InitForTest(scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
100  void PollAdapter();
101
102  // Registers that a new |device| has replied to an Inquiry, is paired, or has
103  // connected to the local host.
104  void DeviceAdded(IOBluetoothDevice* device);
105
106  // Updates |devices_| to include the currently paired devices, as well as any
107  // connected, but unpaired, devices. Notifies observers if any previously
108  // paired or connected devices are no longer present.
109  void UpdateDevices();
110
111  std::string address_;
112  std::string name_;
113  bool powered_;
114
115  int num_discovery_sessions_;
116
117  // Discovery manager for Bluetooth Classic.
118  scoped_ptr<BluetoothDiscoveryManagerMac> classic_discovery_manager_;
119
120  scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
121
122  // List of observers interested in event notifications from us.
123  ObserverList<BluetoothAdapter::Observer> observers_;
124
125  base::WeakPtrFactory<BluetoothAdapterMac> weak_ptr_factory_;
126
127  DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterMac);
128};
129
130}  // namespace device
131
132#endif  // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_MAC_H_
133