| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H |
| #define DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H |
| |
| #include <string> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chromeos/dbus/bluetooth_agent_service_provider.h" |
| #include "chromeos/dbus/bluetooth_device_client.h" |
| #include "dbus/object_path.h" |
| #include "device/bluetooth/bluetooth_device.h" |
| |
| namespace chromeos { |
| |
| class BluetoothAdapterChromeOS; |
| |
| // The BluetoothDeviceChromeOS class implements BluetoothDevice for the |
| // Chrome OS platform. |
| class BluetoothDeviceChromeOS |
| : public device::BluetoothDevice, |
| private chromeos::BluetoothAgentServiceProvider::Delegate { |
| public: |
| // BluetoothDevice override |
| virtual uint32 GetBluetoothClass() const OVERRIDE; |
| virtual std::string GetAddress() const OVERRIDE; |
| virtual uint16 GetVendorID() const OVERRIDE; |
| virtual uint16 GetProductID() const OVERRIDE; |
| virtual uint16 GetDeviceID() const OVERRIDE; |
| virtual bool IsPaired() const OVERRIDE; |
| virtual bool IsConnected() const OVERRIDE; |
| virtual bool IsConnectable() const OVERRIDE; |
| virtual bool IsConnecting() const OVERRIDE; |
| virtual ServiceList GetServices() const OVERRIDE; |
| virtual void GetServiceRecords( |
| const ServiceRecordsCallback& callback, |
| const ErrorCallback& error_callback) OVERRIDE; |
| virtual void ProvidesServiceWithName( |
| const std::string& name, |
| const ProvidesServiceCallback& callback) OVERRIDE; |
| virtual bool ExpectingPinCode() const OVERRIDE; |
| virtual bool ExpectingPasskey() const OVERRIDE; |
| virtual bool ExpectingConfirmation() const OVERRIDE; |
| virtual void Connect( |
| device::BluetoothDevice::PairingDelegate* pairing_delegate, |
| const base::Closure& callback, |
| const ConnectErrorCallback& error_callback) OVERRIDE; |
| virtual void SetPinCode(const std::string& pincode) OVERRIDE; |
| virtual void SetPasskey(uint32 passkey) OVERRIDE; |
| virtual void ConfirmPairing() OVERRIDE; |
| virtual void RejectPairing() OVERRIDE; |
| virtual void CancelPairing() OVERRIDE; |
| virtual void Disconnect( |
| const base::Closure& callback, |
| const ErrorCallback& error_callback) OVERRIDE; |
| virtual void Forget(const ErrorCallback& error_callback) OVERRIDE; |
| virtual void ConnectToService( |
| const std::string& service_uuid, |
| const SocketCallback& callback) OVERRIDE; |
| virtual void ConnectToProfile( |
| device::BluetoothProfile* profile, |
| const base::Closure& callback, |
| const ErrorCallback& error_callback) OVERRIDE; |
| virtual void SetOutOfBandPairingData( |
| const device::BluetoothOutOfBandPairingData& data, |
| const base::Closure& callback, |
| const ErrorCallback& error_callback) OVERRIDE; |
| virtual void ClearOutOfBandPairingData( |
| const base::Closure& callback, |
| const ErrorCallback& error_callback) OVERRIDE; |
| |
| protected: |
| // BluetoothDevice override |
| virtual std::string GetDeviceName() const OVERRIDE; |
| |
| private: |
| friend class BluetoothAdapterChromeOS; |
| |
| BluetoothDeviceChromeOS(BluetoothAdapterChromeOS* adapter, |
| const dbus::ObjectPath& object_path); |
| virtual ~BluetoothDeviceChromeOS(); |
| |
| // BluetoothAgentServiceProvider::Delegate override. |
| virtual void Release() OVERRIDE; |
| virtual void RequestPinCode(const dbus::ObjectPath& device_path, |
| const PinCodeCallback& callback) OVERRIDE; |
| virtual void DisplayPinCode(const dbus::ObjectPath& device_path, |
| const std::string& pincode) OVERRIDE; |
| virtual void RequestPasskey(const dbus::ObjectPath& device_path, |
| const PasskeyCallback& callback) OVERRIDE; |
| virtual void DisplayPasskey(const dbus::ObjectPath& device_path, |
| uint32 passkey, uint16 entered) OVERRIDE; |
| virtual void RequestConfirmation(const dbus::ObjectPath& device_path, |
| uint32 passkey, |
| const ConfirmationCallback& callback) |
| OVERRIDE; |
| virtual void RequestAuthorization(const dbus::ObjectPath& device_path, |
| const ConfirmationCallback& callback) |
| OVERRIDE; |
| virtual void AuthorizeService(const dbus::ObjectPath& device_path, |
| const std::string& uuid, |
| const ConfirmationCallback& callback) OVERRIDE; |
| virtual void Cancel() OVERRIDE; |
| |
| // Internal method to initiate a connection to this device, and methods called |
| // by dbus:: on completion of the D-Bus method call. |
| void ConnectInternal(bool after_pairing, |
| const base::Closure& callback, |
| const ConnectErrorCallback& error_callback); |
| void OnConnect(bool after_pairing, |
| const base::Closure& callback); |
| void OnConnectError(bool after_pairing, |
| const ConnectErrorCallback& error_callback, |
| const std::string& error_name, |
| const std::string& error_message); |
| |
| // Called by dbus:: on completion of the D-Bus method call to register the |
| // pairing agent. |
| void OnRegisterAgent(const base::Closure& callback, |
| const ConnectErrorCallback& error_callback); |
| void OnRegisterAgentError(const ConnectErrorCallback& error_callback, |
| const std::string& error_name, |
| const std::string& error_message); |
| |
| // Called by dbus:: on completion of the D-Bus method call to pair the device. |
| void OnPair(const base::Closure& callback, |
| const ConnectErrorCallback& error_callback); |
| void OnPairError(const ConnectErrorCallback& error_callback, |
| const std::string& error_name, |
| const std::string& error_message); |
| |
| // Called by dbus:: on failure of the D-Bus method call to cancel pairing, |
| // there is no matching completion call since we don't do anything special |
| // in that case. |
| void OnCancelPairingError(const std::string& error_name, |
| const std::string& error_message); |
| |
| // Internal method to set the device as trusted. Trusted devices can connect |
| // to us automatically, and we can connect to them after rebooting; it also |
| // causes the device to be remembered by the stack even if not paired. |
| // |success| to the callback indicates whether or not the request succeeded. |
| void SetTrusted(); |
| void OnSetTrusted(bool success); |
| |
| // Internal method to unregister the pairing agent and method called by dbus:: |
| // on failure of the D-Bus method call. No completion call as success is |
| // ignored. |
| void UnregisterAgent(); |
| void OnUnregisterAgentError(const std::string& error_name, |
| const std::string& error_message); |
| |
| // Called by dbus:: on completion of the D-Bus method call to disconnect the |
| // device. |
| void OnDisconnect(const base::Closure& callback); |
| void OnDisconnectError(const ErrorCallback& error_callback, |
| const std::string& error_name, |
| const std::string& error_message); |
| |
| // Called by dbus:: on failure of the D-Bus method call to unpair the device; |
| // there is no matching completion call since this object is deleted in the |
| // process of unpairing. |
| void OnForgetError(const ErrorCallback& error_callback, |
| const std::string& error_name, |
| const std::string& error_message); |
| |
| // Run any outstanding pairing callbacks passing |status| as the result of |
| // pairing. Returns true if any callbacks were run, false if not. |
| bool RunPairingCallbacks(Status status); |
| |
| // Called by dbus:: on completion of the D-Bus method call to |
| // connect a peofile. |
| void OnConnectProfile(device::BluetoothProfile* profile, |
| const base::Closure& callback); |
| void OnConnectProfileError(device::BluetoothProfile* profile, |
| const ErrorCallback& error_callback, |
| const std::string& error_name, |
| const std::string& error_message); |
| |
| // Return the object path of the device; used by BluetoothAdapterChromeOS |
| const dbus::ObjectPath& object_path() const { return object_path_; } |
| |
| // The adapter that owns this device instance. |
| BluetoothAdapterChromeOS* adapter_; |
| |
| // The dbus object path of the device object. |
| dbus::ObjectPath object_path_; |
| |
| // Number of ongoing calls to Connect(). |
| int num_connecting_calls_; |
| |
| // During pairing this is set to an object that we don't own, but on which |
| // we can make method calls to request, display or confirm PIN Codes and |
| // Passkeys. Generally it is the object that owns this one. |
| PairingDelegate* pairing_delegate_; |
| |
| // Flag to indicate whether a pairing delegate method has been called during |
| // pairing. |
| bool pairing_delegate_used_; |
| |
| // During pairing this is set to an instance of a D-Bus agent object |
| // intialized with our own class as its delegate. |
| scoped_ptr<BluetoothAgentServiceProvider> agent_; |
| |
| // During pairing these callbacks are set to those provided by method calls |
| // made on us by |agent_| and are called by our own method calls such as |
| // SetPinCode() and SetPasskey(). |
| PinCodeCallback pincode_callback_; |
| PasskeyCallback passkey_callback_; |
| ConfirmationCallback confirmation_callback_; |
| |
| // Note: This should remain the last member so it'll be destroyed and |
| // invalidate its weak pointers before any other members are destroyed. |
| base::WeakPtrFactory<BluetoothDeviceChromeOS> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BluetoothDeviceChromeOS); |
| }; |
| |
| } // namespace chromeos |
| |
| #endif // DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H |