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_DEVICE_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/observer_list.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "device/bluetooth/bluetooth_device.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "device/bluetooth/bluetooth_task_manager_win.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace device {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BluetoothAdapterWin;
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class BluetoothServiceRecordWin;
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class BluetoothSocketThread;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BluetoothDeviceWin : public BluetoothDevice {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit BluetoothDeviceWin(
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const BluetoothTaskManagerWin::DeviceState& device_state,
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner,
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const scoped_refptr<BluetoothSocketThread>& socket_thread,
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      net::NetLog* net_log,
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      const net::NetLog::Source& net_log_source);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BluetoothDeviceWin();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BluetoothDevice override
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual uint32 GetBluetoothClass() const OVERRIDE;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual std::string GetAddress() const OVERRIDE;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual VendorIDSource GetVendorIDSource() const OVERRIDE;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual uint16 GetVendorID() const OVERRIDE;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual uint16 GetProductID() const OVERRIDE;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual uint16 GetDeviceID() const OVERRIDE;
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual int GetRSSI() const OVERRIDE;
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual int GetCurrentHostTransmitPower() const OVERRIDE;
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual int GetMaximumHostTransmitPower() const OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsPaired() const OVERRIDE;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsConnected() const OVERRIDE;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsConnectable() const OVERRIDE;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsConnecting() const OVERRIDE;
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual UUIDList GetUUIDs() const OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ExpectingPinCode() const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ExpectingPasskey() const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ExpectingConfirmation() const OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Connect(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PairingDelegate* pairing_delegate,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& callback,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ConnectErrorCallback& error_callback) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPinCode(const std::string& pincode) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPasskey(uint32 passkey) OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ConfirmPairing() OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RejectPairing() OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelPairing() OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Disconnect(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& callback,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Forget(const ErrorCallback& error_callback) OVERRIDE;
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void ConnectToService(
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const BluetoothUUID& uuid,
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const ConnectToServiceCallback& callback,
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const ConnectToServiceErrorCallback& error_callback) OVERRIDE;
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void CreateGattConnection(
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const GattConnectionCallback& callback,
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const ConnectErrorCallback& error_callback) OVERRIDE;
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void StartConnectionMonitor(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& callback,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Used by BluetoothProfileWin to retrieve the service record for the given
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // |uuid|.
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const BluetoothServiceRecordWin* GetServiceRecord(
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      const device::BluetoothUUID& uuid) const;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns true if all fields and services of this instance are equal to the
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // fields and services stored in |device_state|.
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool IsEqual(const BluetoothTaskManagerWin::DeviceState& device_state);
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Updates this instance with all fields and properties stored in
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |device_state|.
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Update(const BluetoothTaskManagerWin::DeviceState& device_state);
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // BluetoothDevice override
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual std::string GetDeviceName() const OVERRIDE;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class BluetoothAdapterWin;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Used by BluetoothAdapterWin to update the visible state during
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // discovery.
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetVisible(bool visible);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Updates the services with services stored in |device_state|.
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void UpdateServices(const BluetoothTaskManagerWin::DeviceState& device_state);
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<BluetoothSocketThread> socket_thread_;
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  net::NetLog* net_log_;
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  net::NetLog::Source net_log_source_;
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The Bluetooth class of the device, a bitmask that may be decoded using
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 bluetooth_class_;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The name of the device, as supplied by the remote device.
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string name_;
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The Bluetooth address of the device.
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string address_;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Tracked device state, updated by the adapter managing the lifecycle of
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the device.
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool paired_;
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool connected_;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Used to send change notifications when a device disappears during
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // discovery.
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool visible_;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The services (identified by UUIDs) that this device provides.
12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UUIDList uuids_;
12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The service records retrieved from SDP.
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef ScopedVector<BluetoothServiceRecordWin> ServiceRecordList;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ServiceRecordList service_record_list_;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothDeviceWin);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace device
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_WIN_H_
138