Home | History | Annotate | Download | only in bluetooth
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_H_
      6 #define DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_H_
      7 
      8 #include <string>
      9 
     10 #include "base/callback.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "base/strings/string16.h"
     14 
     15 namespace device {
     16 
     17 class BluetoothProfile;
     18 class BluetoothServiceRecord;
     19 class BluetoothSocket;
     20 
     21 struct BluetoothOutOfBandPairingData;
     22 
     23 // BluetoothDevice represents a remote Bluetooth device, both its properties and
     24 // capabilities as discovered by a local adapter and actions that may be
     25 // performed on the remove device such as pairing, connection and disconnection.
     26 //
     27 // The class is instantiated and managed by the BluetoothAdapter class
     28 // and pointers should only be obtained from that class and not cached,
     29 // instead use the GetAddress() method as a unique key for a device.
     30 //
     31 // Since the lifecycle of BluetoothDevice instances is managed by
     32 // BluetoothAdapter, that class rather than this provides observer methods
     33 // for devices coming and going, as well as properties being updated.
     34 class BluetoothDevice {
     35  public:
     36   // Possible values that may be returned by GetDeviceType(), representing
     37   // different types of bluetooth device that we support or are aware of
     38   // decoded from the bluetooth class information.
     39   enum DeviceType {
     40     DEVICE_UNKNOWN,
     41     DEVICE_COMPUTER,
     42     DEVICE_PHONE,
     43     DEVICE_MODEM,
     44     DEVICE_AUDIO,
     45     DEVICE_CAR_AUDIO,
     46     DEVICE_VIDEO,
     47     DEVICE_PERIPHERAL,
     48     DEVICE_JOYSTICK,
     49     DEVICE_GAMEPAD,
     50     DEVICE_KEYBOARD,
     51     DEVICE_MOUSE,
     52     DEVICE_TABLET,
     53     DEVICE_KEYBOARD_MOUSE_COMBO
     54   };
     55 
     56   // Possible errors passed back to an error callback function in case of a
     57   // failed call to Connect().
     58   enum ConnectErrorCode {
     59     ERROR_UNKNOWN,
     60     ERROR_INPROGRESS,
     61     ERROR_FAILED,
     62     ERROR_AUTH_FAILED,
     63     ERROR_AUTH_CANCELED,
     64     ERROR_AUTH_REJECTED,
     65     ERROR_AUTH_TIMEOUT,
     66     ERROR_UNSUPPORTED_DEVICE
     67   };
     68 
     69   // Interface for observing changes from bluetooth devices.
     70   class Observer {
     71    public:
     72     virtual ~Observer() {}
     73 
     74     // TODO(keybuk): add observers for pairing and connection.
     75   };
     76 
     77   // Interface for negotiating pairing of bluetooth devices.
     78   class PairingDelegate {
     79    public:
     80     virtual ~PairingDelegate() {}
     81 
     82     // This method will be called when the Bluetooth daemon requires a
     83     // PIN Code for authentication of the device |device|, the delegate should
     84     // obtain the code from the user and call SetPinCode() on the device to
     85     // provide it, or RejectPairing() or CancelPairing() to reject or cancel
     86     // the request.
     87     //
     88     // PIN Codes are generally required for Bluetooth 2.0 and earlier devices
     89     // for which there is no automatic pairing or special handling.
     90     virtual void RequestPinCode(BluetoothDevice* device) = 0;
     91 
     92     // This method will be called when the Bluetooth daemon requires a
     93     // Passkey for authentication of the device |device|, the delegate should
     94     // obtain the passkey from the user (a numeric in the range 0-999999) and
     95     // call SetPasskey() on the device to provide it, or RejectPairing() or
     96     // CancelPairing() to reject or cancel the request.
     97     //
     98     // Passkeys are generally required for Bluetooth 2.1 and later devices
     99     // which cannot provide input or display on their own, and don't accept
    100     // passkey-less pairing.
    101     virtual void RequestPasskey(BluetoothDevice* device) = 0;
    102 
    103     // This method will be called when the Bluetooth daemon requires that the
    104     // user enter the PIN code |pincode| into the device |device| so that it
    105     // may be authenticated. The DismissDisplayOrConfirm() method
    106     // will be called to dismiss the display once pairing is complete or
    107     // cancelled.
    108     //
    109     // This is used for Bluetooth 2.0 and earlier keyboard devices, the
    110     // |pincode| will always be a six-digit numeric in the range 000000-999999
    111     // for compatibility with later specifications.
    112     virtual void DisplayPinCode(BluetoothDevice* device,
    113                                 const std::string& pincode) = 0;
    114 
    115     // This method will be called when the Bluetooth daemon requires that the
    116     // user enter the Passkey |passkey| into the device |device| so that it
    117     // may be authenticated. The DismissDisplayOrConfirm() method will be
    118     // called to dismiss the display once pairing is complete or cancelled.
    119     //
    120     // This is used for Bluetooth 2.1 and later devices that support input
    121     // but not display, such as keyboards. The Passkey is a numeric in the
    122     // range 0-999999 and should be always presented zero-padded to six
    123     // digits.
    124     virtual void DisplayPasskey(BluetoothDevice* device,
    125                                 uint32 passkey) = 0;
    126 
    127     // This method will be called when the Bluetooth daemon gets a notification
    128     // of a key entered on the device |device| while pairing with the device
    129     // using a PIN code or a Passkey.
    130     //
    131     // This method will be called only after DisplayPinCode() or
    132     // DisplayPasskey() is called and before the corresponding
    133     // DismissDisplayOrConfirm() is called, but is not warranted to be called
    134     // on every pairing process that requires a PIN code or a Passkey because
    135     // some device may not support this feature.
    136     //
    137     // The |entered| value describes the number of keys entered so far,
    138     // including the last [enter] key. A first call to KeysEntered() with
    139     // |entered| as 0 will be sent when the device supports this feature.
    140     virtual void KeysEntered(BluetoothDevice* device,
    141                              uint32 entered) = 0;
    142 
    143     // This method will be called when the Bluetooth daemon requires that the
    144     // user confirm that the Passkey |passkey| is displayed on the screen
    145     // of the device |device| so that it may be authenticated. The delegate
    146     // should display to the user and ask for confirmation, then call
    147     // ConfirmPairing() on the device to confirm, RejectPairing() on the device
    148     // to reject or CancelPairing() on the device to cancel authentication
    149     // for any other reason.
    150     //
    151     // This is used for Bluetooth 2.1 and later devices that support display,
    152     // such as other computers or phones. The Passkey is a numeric in the
    153     // range 0-999999 and should be always present zero-padded to six
    154     // digits.
    155     virtual void ConfirmPasskey(BluetoothDevice* device,
    156                                 uint32 passkey) = 0;
    157 
    158     // This method will be called when any previous DisplayPinCode(),
    159     // DisplayPasskey() or ConfirmPasskey() request should be concluded
    160     // and removed from the user.
    161     virtual void DismissDisplayOrConfirm() = 0;
    162   };
    163 
    164   // Returns true if uuid is in a a valid canonical format
    165   // (see utils::CanonicalUuid).
    166   static bool IsUUIDValid(const std::string& uuid);
    167 
    168   virtual ~BluetoothDevice();
    169 
    170   // Returns the Bluetooth class of the device, used by GetDeviceType()
    171   // and metrics logging,
    172   virtual uint32 GetBluetoothClass() const = 0;
    173 
    174   // Returns the Bluetooth of address the device. This should be used as
    175   // a unique key to identify the device and copied where needed.
    176   virtual std::string GetAddress() const = 0;
    177 
    178   // Returns the Vendor ID of the device, where available.
    179   virtual uint16 GetVendorID() const = 0;
    180 
    181   // Returns the Product ID of the device, where available.
    182   virtual uint16 GetProductID() const = 0;
    183 
    184   // Returns the Device ID of the device, typically the release or version
    185   // number in BCD format, where available.
    186   virtual uint16 GetDeviceID() const = 0;
    187 
    188   // Returns the name of the device suitable for displaying, this may
    189   // be a synthesized string containing the address and localized type name
    190   // if the device has no obtained name.
    191   virtual string16 GetName() const;
    192 
    193   // Returns the type of the device, limited to those we support or are
    194   // aware of, by decoding the bluetooth class information. The returned
    195   // values are unique, and do not overlap, so DEVICE_KEYBOARD is not also
    196   // DEVICE_PERIPHERAL.
    197   DeviceType GetDeviceType() const;
    198 
    199   // Indicates whether the device is known to support pairing based on its
    200   // device class and address.
    201   bool IsPairable() const;
    202 
    203   // Indicates whether the device is paired with the adapter.
    204   virtual bool IsPaired() const = 0;
    205 
    206   // Indicates whether the device is currently connected to the adapter.
    207   // Note that if IsConnected() is true, does not imply that the device is
    208   // connected to any application or service. If the device is not paired, it
    209   // could be still connected to the adapter for other reason, for example, to
    210   // request the adapter's SDP records. The same holds for paired devices, since
    211   // they could be connected to the adapter but not to an application.
    212   virtual bool IsConnected() const = 0;
    213 
    214   // Indicates whether the paired device accepts connections initiated from the
    215   // adapter. This value is undefined for unpaired devices.
    216   virtual bool IsConnectable() const = 0;
    217 
    218   // Indicates whether there is a call to Connect() ongoing. For this attribute,
    219   // we consider a call is ongoing if none of the callbacks passed to Connect()
    220   // were called after the corresponding call to Connect().
    221   virtual bool IsConnecting() const = 0;
    222 
    223   // Returns the services (as UUID strings) that this device provides.
    224   // TODO(youngki): Rename this to GetProfiles().
    225   typedef std::vector<std::string> ServiceList;
    226   virtual ServiceList GetServices() const = 0;
    227 
    228   // The ErrorCallback is used for methods that can fail in which case it
    229   // is called, in the success case the callback is simply not called.
    230   typedef base::Callback<void()> ErrorCallback;
    231 
    232   // The ConnectErrorCallback is used for methods that can fail with an error,
    233   // passed back as an error code argument to this callback.
    234   // In the success case this callback is not called.
    235   typedef base::Callback<void(enum ConnectErrorCode)> ConnectErrorCallback;
    236 
    237   // Returns the services (as BluetoothServiceRecord objects) that this device
    238   // provides.
    239   typedef ScopedVector<BluetoothServiceRecord> ServiceRecordList;
    240   typedef base::Callback<void(const ServiceRecordList&)> ServiceRecordsCallback;
    241   virtual void GetServiceRecords(const ServiceRecordsCallback& callback,
    242                                  const ErrorCallback& error_callback) = 0;
    243 
    244   // Indicates whether this device provides the given service.
    245   virtual bool ProvidesServiceWithUUID(const std::string& uuid) const;
    246 
    247   // The ProvidesServiceCallback is used by ProvidesServiceWithName to indicate
    248   // whether or not a matching service was found.
    249   typedef base::Callback<void(bool)> ProvidesServiceCallback;
    250 
    251   // Indicates whether this device provides the given service.
    252   virtual void ProvidesServiceWithName(
    253       const std::string& name,
    254       const ProvidesServiceCallback& callback) = 0;
    255 
    256   // Indicates whether the device is currently pairing and expecting a
    257   // PIN Code to be returned.
    258   virtual bool ExpectingPinCode() const = 0;
    259 
    260   // Indicates whether the device is currently pairing and expecting a
    261   // Passkey to be returned.
    262   virtual bool ExpectingPasskey() const = 0;
    263 
    264   // Indicates whether the device is currently pairing and expecting
    265   // confirmation of a displayed passkey.
    266   virtual bool ExpectingConfirmation() const = 0;
    267 
    268   // SocketCallback is used by ConnectToService to return a BluetoothSocket to
    269   // the caller, or NULL if there was an error.  The socket will remain open
    270   // until the last reference to the returned BluetoothSocket is released.
    271   typedef base::Callback<void(scoped_refptr<BluetoothSocket>)>
    272       SocketCallback;
    273 
    274   // Initiates a connection to the device, pairing first if necessary.
    275   //
    276   // Method calls will be made on the supplied object |pairing_delegate|
    277   // to indicate what display, and in response should make method calls
    278   // back to the device object. Not all devices require user responses
    279   // during pairing, so it is normal for |pairing_delegate| to receive no
    280   // calls. To explicitly force a low-security connection without bonding,
    281   // pass NULL, though this is ignored if the device is already paired.
    282   //
    283   // If the request fails, |error_callback| will be called; otherwise,
    284   // |callback| is called when the request is complete.
    285   // After calling Connect, CancelPairing should be called to cancel the pairing
    286   // process and release |pairing_delegate_| if user cancels the pairing and
    287   // closes the pairing UI.
    288   virtual void Connect(PairingDelegate* pairing_delegate,
    289                        const base::Closure& callback,
    290                        const ConnectErrorCallback& error_callback) = 0;
    291 
    292   // Sends the PIN code |pincode| to the remote device during pairing.
    293   //
    294   // PIN Codes are generally required for Bluetooth 2.0 and earlier devices
    295   // for which there is no automatic pairing or special handling.
    296   virtual void SetPinCode(const std::string& pincode) = 0;
    297 
    298   // Sends the Passkey |passkey| to the remote device during pairing.
    299   //
    300   // Passkeys are generally required for Bluetooth 2.1 and later devices
    301   // which cannot provide input or display on their own, and don't accept
    302   // passkey-less pairing, and are a numeric in the range 0-999999.
    303   virtual void SetPasskey(uint32 passkey) = 0;
    304 
    305   // Confirms to the remote device during pairing that a passkey provided by
    306   // the ConfirmPasskey() delegate call is displayed on both devices.
    307   virtual void ConfirmPairing() = 0;
    308 
    309   // Rejects a pairing or connection request from a remote device.
    310   virtual void RejectPairing() = 0;
    311 
    312   // Cancels a pairing or connection attempt to a remote device or release
    313   // |pairing_deleage_| and |agent_|.
    314   virtual void CancelPairing() = 0;
    315 
    316   // Disconnects the device, terminating the low-level ACL connection
    317   // and any application connections using it. Link keys and other pairing
    318   // information are not discarded, and the device object is not deleted.
    319   // If the request fails, |error_callback| will be called; otherwise,
    320   // |callback| is called when the request is complete.
    321   virtual void Disconnect(const base::Closure& callback,
    322                           const ErrorCallback& error_callback) = 0;
    323 
    324   // Disconnects the device, terminating the low-level ACL connection
    325   // and any application connections using it, and then discards link keys
    326   // and other pairing information. The device object remains valid until
    327   // returning from the calling function, after which it should be assumed to
    328   // have been deleted. If the request fails, |error_callback| will be called.
    329   // There is no callback for success because this object is often deleted
    330   // before that callback would be called.
    331   virtual void Forget(const ErrorCallback& error_callback) = 0;
    332 
    333   // Attempts to open a socket to a service matching |uuid| on this device.  If
    334   // the connection is successful, |callback| is called with a BluetoothSocket.
    335   // Otherwise |callback| is called with NULL.  The socket is closed as soon as
    336   // all references to the BluetoothSocket are released.  Note that the
    337   // BluetoothSocket object can outlive both this BluetoothDevice and the
    338   // BluetoothAdapter for this device.
    339   virtual void ConnectToService(const std::string& service_uuid,
    340                                 const SocketCallback& callback) = 0;
    341 
    342   // Attempts to initiate an outgoing connection to this device for the profile
    343   // identified by |profile|, on success the profile's connection callback
    344   // will be called as well as |callback|; on failure |error_callback| will be
    345   // called.
    346   virtual void ConnectToProfile(BluetoothProfile* profile,
    347                                 const base::Closure& callback,
    348                                 const ErrorCallback& error_callback) = 0;
    349 
    350   // Sets the Out Of Band pairing data for this device to |data|.  Exactly one
    351   // of |callback| or |error_callback| will be run.
    352   virtual void SetOutOfBandPairingData(
    353       const BluetoothOutOfBandPairingData& data,
    354       const base::Closure& callback,
    355       const ErrorCallback& error_callback) = 0;
    356 
    357   // Clears the Out Of Band pairing data for this device.  Exactly one of
    358   // |callback| or |error_callback| will be run.
    359   virtual void ClearOutOfBandPairingData(
    360       const base::Closure& callback,
    361       const ErrorCallback& error_callback) = 0;
    362 
    363  protected:
    364   BluetoothDevice();
    365 
    366   // Returns the internal name of the Bluetooth device, used by GetName().
    367   virtual std::string GetDeviceName() const = 0;
    368 
    369  private:
    370   // Returns a localized string containing the device's bluetooth address and
    371   // a device type for display when |name_| is empty.
    372   string16 GetAddressWithLocalizedDeviceTypeName() const;
    373 };
    374 
    375 }  // namespace device
    376 
    377 #endif  // DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_H_
    378