diff options
Diffstat (limited to 'device/bluetooth/bluetooth_device_chromeos.h')
-rw-r--r-- | device/bluetooth/bluetooth_device_chromeos.h | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/device/bluetooth/bluetooth_device_chromeos.h b/device/bluetooth/bluetooth_device_chromeos.h new file mode 100644 index 0000000..fef7cfd --- /dev/null +++ b/device/bluetooth/bluetooth_device_chromeos.h @@ -0,0 +1,223 @@ +// 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 |