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