15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <utility>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_checker.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "device/bluetooth/bluetooth_adapter.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "device/bluetooth/bluetooth_task_manager_win.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SequencedTaskRunner;
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass Thread;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace device {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BluetoothAdapterWinTest;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BluetoothDevice;
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class BluetoothSocketThread;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BluetoothAdapterWin : public BluetoothAdapter,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            public BluetoothTaskManagerWin::Observer {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static base::WeakPtr<BluetoothAdapter> CreateAdapter(
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const InitCallback& init_callback);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // BluetoothAdapter:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveObserver(BluetoothAdapter::Observer* observer) OVERRIDE;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual std::string GetAddress() const OVERRIDE;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual std::string GetName() const OVERRIDE;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetName(const std::string& name,
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const base::Closure& callback,
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const ErrorCallback& error_callback) OVERRIDE;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsInitialized() const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsPresent() const OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsPowered() const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPowered(
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool discoverable,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::Closure& callback,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsDiscoverable() const OVERRIDE;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetDiscoverable(
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool discoverable,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& callback,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDiscovering() const OVERRIDE;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CreateRfcommService(
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const BluetoothUUID& uuid,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const ServiceOptions& options,
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const CreateServiceCallback& callback,
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const CreateServiceErrorCallback& error_callback) OVERRIDE;
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CreateL2capService(
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const BluetoothUUID& uuid,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const ServiceOptions& options,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const CreateServiceCallback& callback,
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const CreateServiceErrorCallback& error_callback) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BluetoothTaskManagerWin::Observer override
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AdapterStateChanged(
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const BluetoothTaskManagerWin::AdapterState& state) OVERRIDE;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DiscoveryStarted(bool success) OVERRIDE;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DiscoveryStopped() OVERRIDE;
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void DevicesPolled(const ScopedVector<
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BluetoothTaskManagerWin::DeviceState>& devices) OVERRIDE;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner() const {
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ui_task_runner_;
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const scoped_refptr<BluetoothSocketThread>& socket_thread() const {
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return socket_thread_;
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // BluetoothAdapter:
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void RemovePairingDelegateInternal(
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      device::BluetoothDevice::PairingDelegate* pairing_delegate) OVERRIDE;
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class BluetoothAdapterWinTest;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum DiscoveryStatus {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOT_DISCOVERING,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISCOVERY_STARTING,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISCOVERING,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISCOVERY_STOPPING
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit BluetoothAdapterWin(const InitCallback& init_callback);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BluetoothAdapterWin();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // BluetoothAdapter:
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void AddDiscoverySession(
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::Closure& callback,
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE;
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void RemoveDiscoverySession(
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::Closure& callback,
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE;
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Init();
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void InitForTest(
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SequencedTaskRunner> bluetooth_task_runner);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MaybePostStartDiscoveryTask();
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MaybePostStopDiscoveryTask();
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitCallback init_callback_;
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string address_;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string name_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool initialized_;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool powered_;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DiscoveryStatus discovery_status_;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::hash_set<std::string> discovered_devices_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::pair<base::Closure, ErrorCallback> >
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      on_start_discovery_callbacks_;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::Closure> on_stop_discovery_callbacks_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t num_discovery_listeners_;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<BluetoothSocketThread> socket_thread_;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<BluetoothTaskManagerWin> task_manager_;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadChecker thread_checker_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // List of observers interested in event notifications from us.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ObserverList<BluetoothAdapter::Observer> observers_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: This should remain the last member so it'll be destroyed and
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<BluetoothAdapterWin> weak_ptr_factory_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterWin);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace device
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WIN_H_
150