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