17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CHROMEOS_DBUS_BLUETOOTH_PROFILE_SERVICE_PROVIDER_H_ 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CHROMEOS_DBUS_BLUETOOTH_PROFILE_SERVICE_PROVIDER_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h" 12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_export.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/bus.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/file_descriptor.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/object_path.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// BluetoothProfileServiceProvider is used to provide a D-Bus object that the 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Bluetooth daemon can communicate with to connect application profiles. 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Instantiate with a chosen D-Bus object path and delegate object, and pass 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the D-Bus object path as the |agent_path| argument to the 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// chromeos::BluetoothProfileManagerClient::RegisterProfile() method. 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// When an incoming profile connection occurs, or after initiating a connection 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// using the chromeos::BluetoothDeviceClient::ConnectProfile() method, the 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Bluetooth daemon will make calls to this profile object and they will be 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// passed on to your Delegate object for handling. Responses should be returned 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// using the callbacks supplied to those methods. 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CHROMEOS_EXPORT BluetoothProfileServiceProvider { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Interface for reacting to profile requests. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class Delegate { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~Delegate() {} 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Possible status values that may be returned to callbacks on a new 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // connection or a requested disconnection. Success indicates acceptance, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // reject indicates the user rejected or denied the request; cancelled 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // means the user cancelled the request without confirming either way. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum Status { 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SUCCESS, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) REJECTED, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CANCELLED 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connection-specific options. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct CHROMEOS_EXPORT Options { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Options() {} 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~Options() {} 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile version. 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint16 version; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile features. 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint16 features; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The ConfirmationCallback is used for methods which require confirmation; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // it should be called with one argument, the |status| of the request 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (success, rejected or cancelled). 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(Status)> ConfirmationCallback; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This method will be called when the profile is unregistered from the 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Bluetooth daemon, generally at shutdown or at the applications' request. 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // It may be used to perform cleanup tasks. This corresponds to the 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // org.bluez.Profile1.Release method and is renamed to avoid a conflict 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // with base::Refcounted<T>. 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void Released() = 0; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This method will be called when a profile connection to the device 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with object path |device_path| is established. |callback| must be called 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to confirm the connection, or indicate rejection or cancellation. 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A file descriptor for the connection socket is provided in |fd|, and 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // details about the specific implementation of the profile in |options|. 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // IMPORTANT: Ownership of the file descriptor object |fd| is passed to 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the delegate by this call. The delegate is responsible for checking the 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // validity of |fd| on a thread where I/O is permitted before taking the 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // value. If the value is not taken, the file descriptor is closed. 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Ownership of |options| is NOT passed so information out of it must be 86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // copied if required. 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void NewConnection(const dbus::ObjectPath& device_path, 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_ptr<dbus::FileDescriptor> fd, 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Options& options, 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ConfirmationCallback& callback) = 0; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This method will be called when a profile connection to the device 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with object path |device_path| is disconnected. Any file descriptors 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // owned by the service should be cleaned up and |callback| called to 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // confirm, or indicate rejection or cancellation of the disconnection. 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void RequestDisconnection(const dbus::ObjectPath& device_path, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ConfirmationCallback& callback) = 0; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This method will be called by the Bluetooth daemon to indicate that 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a profile request failed before a reply was returned from the device. 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Cancel() = 0; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual ~BluetoothProfileServiceProvider(); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Creates the instance where |bus| is the D-Bus bus connection to export 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the object onto, |object_path| is the object path that it should have 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and |delegate| is the object to which all method calls will be passed 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and responses generated from. 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static BluetoothProfileServiceProvider* Create( 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dbus::Bus* bus, 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const dbus::ObjectPath& object_path, 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Delegate* delegate); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BluetoothProfileServiceProvider(); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BluetoothProfileServiceProvider); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chromeos 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif // CHROMEOS_DBUS_BLUETOOTH_PROFILE_SERVICE_PROVIDER_H_ 125