// Copyright (c) 2012 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 CHROME_BROWSER_CHROMEOS_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H_ #define CHROME_BROWSER_CHROMEOS_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H_ #include #include #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/memory/weak_ptr.h" #include "base/string16.h" #include "chrome/browser/chromeos/bluetooth/bluetooth_device.h" #include "chromeos/dbus/bluetooth_agent_service_provider.h" #include "chromeos/dbus/bluetooth_device_client.h" #include "dbus/object_path.h" namespace chromeos { class BluetoothAdapterChromeOs; class BluetoothServiceRecord; struct BluetoothOutOfBandPairingData; // The BluetoothDeviceChromeOs class is an implementation of BluetoothDevice // for Chrome OS platform. class BluetoothDeviceChromeOs : public BluetoothDevice, public BluetoothDeviceClient::Observer, public BluetoothAgentServiceProvider::Delegate { public: virtual ~BluetoothDeviceChromeOs(); // BluetoothDevice override virtual bool IsPaired() const OVERRIDE; virtual const ServiceList& GetServices() const OVERRIDE; virtual void GetServiceRecords( const ServiceRecordsCallback& callback, const ErrorCallback& error_callback) OVERRIDE; virtual bool ProvidesServiceWithUUID(const std::string& uuid) const 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( BluetoothDevice::PairingDelegate* pairing_delegate, const base::Closure& callback, const ErrorCallback& 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 SetOutOfBandPairingData( const chromeos::BluetoothOutOfBandPairingData& data, const base::Closure& callback, const ErrorCallback& error_callback) OVERRIDE; virtual void ClearOutOfBandPairingData( const base::Closure& callback, const ErrorCallback& error_callback) OVERRIDE; private: friend class BluetoothAdapterChromeOs; friend class MockBluetoothDevice; explicit BluetoothDeviceChromeOs(BluetoothAdapterChromeOs* adapter); // Indicates whether the class of this device is supported by Chrome OS. bool IsSupported() const; // Sets the dbus object path for the device to |object_path|, indicating // that the device has gone from being discovered to paired or bonded. void SetObjectPath(const dbus::ObjectPath& object_path); // Removes the dbus object path from the device, indicating that the // device is no longer paired or bonded, but perhaps still visible. void RemoveObjectPath(); // Sets whether the device is visible to the owning adapter to |visible|. void SetVisible(bool visible) { visible_ = visible; } // Updates device information from the properties in |properties|, device // state properties such as |paired_| and |connected_| are ignored unless // |update_state| is true. void Update(const BluetoothDeviceClient::Properties* properties, bool update_state); // Called by BluetoothAdapterClient when a call to CreateDevice() or // CreatePairedDevice() succeeds, provides the new object path for the remote // device in |device_path|. |callback| and |error_callback| are the callbacks // provided to Connect(). void ConnectCallback(const base::Closure& callback, const ErrorCallback& error_callback, const dbus::ObjectPath& device_path); // Called by BluetoothAdapterClient when a call to CreateDevice() or // CreatePairedDevice() fails with the error named |error_name| and // optional message |error_message|, |error_callback| is the callback // provided to Connect(). void ConnectErrorCallback(const ErrorCallback& error_callback, const std::string& error_name, const std::string& error_message); // Called by BluetoothAdapterClient when a call to DiscoverServices() // completes. |callback| and |error_callback| are the callbacks provided to // GetServiceRecords. void CollectServiceRecordsCallback( const ServiceRecordsCallback& callback, const ErrorCallback& error_callback, const dbus::ObjectPath& device_path, const BluetoothDeviceClient::ServiceMap& service_map, bool success); // Called by BluetoothProperty when the call to Set() for the Trusted // property completes. |success| indicates whether or not the request // succeeded, |callback| and |error_callback| are the callbacks provided to // Connect(). void OnSetTrusted(const base::Closure& callback, const ErrorCallback& error_callback, bool success); // Connect application-level protocols of the device to the system, called // on a successful connection or to reconnect to a device that is already // paired or previously connected. |error_callback| is called on failure. // Otherwise, |callback| is called when the request is complete. void ConnectApplications(const base::Closure& callback, const ErrorCallback& error_callback); // Called by IntrospectableClient when a call to Introspect() completes. // |success| indicates whether or not the request succeeded, |callback| and // |error_callback| are the callbacks provided to ConnectApplications(), // |service_name| and |device_path| specify the remote object being // introspected and |xml_data| contains the XML-formatted protocol data. void OnIntrospect(const base::Closure& callback, const ErrorCallback& error_callback, const std::string& service_name, const dbus::ObjectPath& device_path, const std::string& xml_data, bool success); // Called by BluetoothInputClient when the call to Connect() succeeds. // |error_callback| is the callback provided to ConnectApplications(), // |interface_name| specifies the interface being connected and // |device_path| the remote object path. void OnConnect(const base::Closure& callback, const std::string& interface_name, const dbus::ObjectPath& device_path); // Called by BluetoothInputClient when the call to Connect() fails. // |error_callback| is the callback provided to ConnectApplications(), // |interface_name| specifies the interface being connected, // |device_path| the remote object path, // |error_name| the error name and |error_message| the optional message. void OnConnectError(const ErrorCallback& error_callback, const std::string& interface_name, const dbus::ObjectPath& device_path, const std::string& error_name, const std::string& error_message); // Called by BluetoothDeviceClient when a call to Disconnect() completes, // |success| indicates whether or not the request succeeded, |callback| and // |error_callback| are the callbacks provided to Disconnect() and // |device_path| is the device disconnected. void DisconnectCallback(const base::Closure& callback, const ErrorCallback& error_callback, const dbus::ObjectPath& device_path, bool success); // Called by BluetoothAdapterClient when a call to RemoveDevice() // completes, |success| indicates whether or not the request succeeded, // |error_callback| is the callback provided to Forget() and |adapter_path| is // the d-bus object path of the adapter that performed the removal. void ForgetCallback(const ErrorCallback& error_callback, const dbus::ObjectPath& adapter_path, bool success); // Called if the call to GetServiceRecords from ProvidesServiceWithName fails. void SearchServicesForNameErrorCallback( const ProvidesServiceCallback& callback); // Called by GetServiceRecords with the list of BluetoothServiceRecords to // search for |name|. |callback| is the callback from // ProvidesServiceWithName. void SearchServicesForNameCallback( const std::string& name, const ProvidesServiceCallback& callback, const ServiceRecordList& list); // Called if the call to GetServiceRecords from Connect fails. void GetServiceRecordsForConnectErrorCallback( const SocketCallback& callback); // Called by GetServiceRecords with the list of BluetoothServiceRecords. // Connections are attempted to each service in the list matching // |service_uuid|, and the socket from the first successful connection is // passed to |callback|. void GetServiceRecordsForConnectCallback( const std::string& service_uuid, const SocketCallback& callback, const ServiceRecordList& list); // Called by BlueoothDeviceClient in response to the AddRemoteData and // RemoveRemoteData method calls. void OnRemoteDataCallback(const base::Closure& callback, const ErrorCallback& error_callback, bool success); // BluetoothDeviceClient::Observer override. // // Called when the device with object path |object_path| is about // to be disconnected, giving a chance for application layers to // shut down cleanly. virtual void DisconnectRequested( const dbus::ObjectPath& object_path) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the agent is unregistered from the // Bluetooth daemon, generally at the end of a pairing request. It may be // used to perform cleanup tasks. virtual void Release() OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the Bluetooth daemon requires a // PIN Code for authentication of the device with object path |device_path|, // the agent should obtain the code from the user and call |callback| // to provide it, or indicate rejection or cancellation of the request. // // PIN Codes are generally required for Bluetooth 2.0 and earlier devices // for which there is no automatic pairing or special handling. virtual void RequestPinCode(const dbus::ObjectPath& device_path, const PinCodeCallback& callback) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the Bluetooth daemon requires a // Passkey for authentication of the device with object path |device_path|, // the agent should obtain the passkey from the user (a numeric in the // range 0-999999) and call |callback| to provide it, or indicate // rejection or cancellation of the request. // // Passkeys are generally required for Bluetooth 2.1 and later devices // which cannot provide input or display on their own, and don't accept // passkey-less pairing. virtual void RequestPasskey(const dbus::ObjectPath& device_path, const PasskeyCallback& callback) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the Bluetooth daemon requires that the // user enter the PIN code |pincode| into the device with object path // |device_path| so that it may be authenticated. The Cancel() method // will be called to dismiss the display once pairing is complete or // cancelled. // // This is used for Bluetooth 2.0 and earlier keyboard devices, the // |pincode| will always be a six-digit numeric in the range 000000-999999 // for compatibilty with later specifications. virtual void DisplayPinCode(const dbus::ObjectPath& device_path, const std::string& pincode) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the Bluetooth daemon requires that the // user enter the Passkey |passkey| into the device with object path // |device_path| so that it may be authenticated. The Cancel() method // will be called to dismiss the display once pairing is complete or // cancelled. // // This is used for Bluetooth 2.1 and later devices that support input // but not display, such as keyboards. The Passkey is a numeric in the // range 0-999999 and should be always presented zero-padded to six // digits. virtual void DisplayPasskey(const dbus::ObjectPath& device_path, uint32 passkey) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the Bluetooth daemon requires that the // user confirm that the Passkey |passkey| is displayed on the screen // of the device with object path |object_path| so that it may be // authentication. The agent should display to the user and ask for // confirmation, then call |callback| to provide their response (success, // rejected or cancelled). // // This is used for Bluetooth 2.1 and later devices that support display, // such as other computers or phones. The Passkey is a numeric in the // range 0-999999 and should be always present zero-padded to six // digits. virtual void RequestConfirmation( const dbus::ObjectPath& device_path, uint32 passkey, const ConfirmationCallback& callback) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the Bluetooth daemon requires that the // user confirm that the device with object path |object_path| is // authorized to connect to the service with UUID |uuid|. The agent should // confirm with the user and call |callback| to provide their response // (success, rejected or cancelled). virtual void Authorize(const dbus::ObjectPath& device_path, const std::string& uuid, const ConfirmationCallback& callback) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called when the Bluetooth daemon requires that the // user confirm that the device adapter may switch to mode |mode|. The // agent should confirm with the user and call |callback| to provide // their response (success, rejected or cancelled). virtual void ConfirmModeChange(Mode mode, const ConfirmationCallback& callback) OVERRIDE; // BluetoothAgentServiceProvider::Delegate override. // // This method will be called by the Bluetooth daemon to indicate that // the request failed before a reply was returned from the device. virtual void Cancel() OVERRIDE; // Creates a new BluetoothDeviceChromeOs object bound to the adapter // |adapter|. static BluetoothDeviceChromeOs* Create(BluetoothAdapterChromeOs* adapter); // The adapter that owns this device instance. BluetoothAdapterChromeOs* adapter_; // The dbus object path of the device, will be empty if the device has only // been discovered and not yet paired with. dbus::ObjectPath object_path_; // The services (identified by UUIDs) that this device provides. std::vector service_uuids_; // 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. BluetoothDevice::PairingDelegate* pairing_delegate_; // During pairing this is set to an instance of a D-Bus agent object // intialized with our own class as its delegate. scoped_ptr 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_; // Used to keep track of pending application connection requests. int connecting_applications_counter_; // 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 weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(BluetoothDeviceChromeOs); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H_